杰理6999S芯片使用PB1实现清除按键长按短按实现代码
时间: 2024-03-25 17:40:15 浏览: 83
以下是杰理6999S芯片使用PB1实现清除按键长按短按功能的示例代码:
```
#include "jl_pwm.h"
#include "jl_timer.h"
#include "jl_exti.h"
#include "jl_gpio.h"
#define KEY_PRESS_TIMEOUT_MS 3000 //按键长按时间阈值,单位为毫秒
#define KEY_PRESS_CHECK_MS 10 //按键检测间隔时间,单位为毫秒
#define KEY_PB1_PIN JL_PORTB_01 //按键所在的引脚
#define KEY_PB1_IRQ JL_EXTI_1 //按键所在的中断号
static uint32_t key_press_time = 0; //按键按下时间
static uint8_t key_press_flag = 0; //按键按下标志
void key_press_callback(void)
{
uint8_t key_status = gpio_read(KEY_PB1_PIN);
if (key_status == 0) //按键被按下
{
key_press_time = timer_get_tick_count(); //记录按键按下时间
key_press_flag = 1; //设置按键按下标志
}
else //按键被松开
{
uint32_t key_press_duration = timer_get_tick_count() - key_press_time; //计算按键按下时间
if (key_press_duration >= KEY_PRESS_TIMEOUT_MS) //长按
{
//执行长按操作
//...
}
else //短按
{
//执行短按操作
//...
}
key_press_flag = 0; //清除按键按下标志
}
}
void key_press_init(void)
{
gpio_init(KEY_PB1_PIN, GPIOMode_In_PU_No_IT);
exti_init(KEY_PB1_IRQ, EXTI_Trigger_Falling, ENABLE);
exti_attach_interrupt(KEY_PB1_IRQ, key_press_callback); //注册按键中断服务函数
}
void key_press_process(void)
{
if (key_press_flag == 1) //按键被按下
{
uint32_t current_time = timer_get_tick_count();
uint32_t key_press_duration = current_time - key_press_time; //计算按键按下时间
if (key_press_duration >= KEY_PRESS_TIMEOUT_MS) //长按
{
//执行长按操作
//...
}
}
}
int main(void)
{
timer_init(); //初始化系统时钟计时器
key_press_init(); //初始化按键
while (1)
{
key_press_process(); //处理按键事件
timer_delay_ms(KEY_PRESS_CHECK_MS); //等待一段时间,再次检测按键状态
}
}
```
这是一个示例代码,具体的实现方式还需要根据具体的应用场景进行调整和优化。
阅读全文