CW32F030K8U7实现按键长按3秒lcd灯亮的全部代码包括初始化
时间: 2024-03-13 07:43:42 浏览: 75
下面是CW32F030K8U7实现按键长按3秒后LCD灯亮的完整示例代码,包括初始化和按键消抖处理:
```
#include "CW32F030.h"
#define LONG_PRESS_TIME 3000 // 定义长按时间为3秒
void delay_ms(uint32_t ms)
{
uint32_t i, j;
for (i = 0; i < ms; i++)
for (j = 0; j < 4000; j++);
}
void GPIO_Init(void)
{
// 使能GPIO模块的时钟
SYSCTRL->AHBCLKEN |= SYSCTRL_AHBCLKEN_GPIO_EN_Msk;
// 配置PB0引脚为输入模式
GPIOB->MODE &= ~(GPIO_MODE_MODE0_Msk);
// 配置PA0引脚为输出模式
GPIOA->MODE |= GPIO_MODE_MODE0_0_Msk;
}
void SysTick_Handler(void)
{
static uint32_t debounce_time = 0; // 定义静态变量,记录消抖时间
static uint8_t key_state = 0; // 定义静态变量,记录按键状态
if (debounce_time > 0)
debounce_time--; // 消抖时间减1
if (!(GPIOB->DATA & GPIO_DATA_DATA0_Msk) && key_state == 0 && debounce_time == 0)
{
// 检测到按键按下且按键状态为0且消抖时间为0
key_state = 1; // 设置按键状态为1
debounce_time = 50; // 设置消抖时间为50ms
}
if ((GPIOB->DATA & GPIO_DATA_DATA0_Msk) && key_state == 1 && debounce_time == 0)
{
// 检测到按键松开且按键状态为1且消抖时间为0
key_state = 0; // 设置按键状态为0
debounce_time = 50; // 设置消抖时间为50ms
}
}
int main(void)
{
uint32_t press_time = 0; // 记录按键按下的时间
int long_press_flag = 0; // 长按标志位,初始值为0
// 使能SysTick定时器,并设置定时周期为1ms
SysTick->LOAD = 47999;
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk;
// 配置SysTick定时器中断优先级为最低
NVIC_SetPriority(SysTick_IRQn, 3);
GPIO_Init(); // 初始化GPIO模块
while (1)
{
// 判断PB0引脚是否被按下
if (!(GPIOB->DATA & GPIO_DATA_DATA0_Msk))
{
press_time++; // 增加按下时间
// 判断是否长按
if (press_time >= LONG_PRESS_TIME && !long_press_flag)
{
// 长按时间达到3秒且长按标志位为0,将长按标志位置为1
long_press_flag = 1;
GPIOA->DATA |= GPIO_DATA_DATA0_Msk; // 点亮LCD灯
}
}
else
{
// 按键松开,重置按下时间和长按标志位
press_time = 0;
long_press_flag = 0;
GPIOA->DATA &= ~GPIO_DATA_DATA0_Msk; // 熄灭LCD灯
}
delay_ms(10); // 延时10ms,降低CPU占用率
}
}
```
代码中通过SysTick定时器实现按键消抖处理,每1ms触发一次SysTick中断,在中断服务函数中进行按键消抖处理。需要注意的是,SysTick定时器的时钟源为内部时钟,时钟频率为48MHz,因此SysTick的LOAD寄存器需要设置为47999,才能实现1ms的定时周期。同时,需要在初始化函数中设置SysTick定时器中断优先级为最低,以防止中断服务函数占用CPU过多导致系统响应变慢。
阅读全文