实现思路
1 用定时器实现加加
2 中断为1ms一次(最好不改)
3 中断里不放很多东西 防止中断溢出
采用封装的方式 让他去执行 后返回
4 实现标志位和中断消抖的分离
LL库定时器
TYPE_LL_TIMER_INIT timer_init;
TYPE_LL_TIMER_CNT_CFG cnt_cfg;
NVIC_InitTypeDef nvic;
nvic.NVIC_IRQChannel = TIM4_IRQn;
nvic.NVIC_IRQChannelPriority = 0;
nvic.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&nvic);
timer_init.prescaler = LL_TIMER_PSC_NONE;
timer_init.timer_src_sel = LL_TIMER_SRC_SYS_RISING;
ll_timer_init(TIMER4, &timer_init);
cnt_cfg.count_initial = 0;
cnt_cfg.count_period = 48000;
cnt_cfg.count_ie = ENABLE;
ll_timer_cnt_mode_config(TIMER4, &cnt_cfg);
ll_timer_start(TIMER4, LL_TIMER_MODE_SEL_COUNTER);
按键实现三要素 1检查事件 2 按键事件 3标志位
#define S7 ll_gpio_read_input_data_bit(GPIOB, LL_GPIO_PIN_11)
if(S7_onf)
{
if(!S7)
{
S7_i++;
if(S7_i>20)
{
S7_i=0;
S7_onf=0;
S7_k=0;
}
}
else
{
S7_i=0;
}
}
else
{
if(S7)
{
S7_i++;
if(S7_i>20)
{
S7_i=0;
S7_onf=1;
S7_k=1;
}
}
else
{
S7_i=0;
}
}
硬件:中断加加
void TIM4_IRQHandler(void)
{
if(LL_TIMER_CNT_PRD_PENDING_GET(TIMER4))
{
LL_TIMER_CNT_PRD_PENDING_CLR(TIMER4);
key_s7();
}
}
标志位:main 实现
用extern 调用 标志位 main 实现
if(S7_kl){
S7_kl= 0 ;
S7_k = 0;
while(1)
{
if(S2_k){
S2_k=0;
number_ks=number_ks+1;
}
if(S4_k){
S4_k=0;
number_ks=number_ks+100;
}
lcd_first(number_ks);
delay_ms(20);
lcd_clear_screen();
if(S7_k){
S7_k = 0 ;
key7dl=1;
break;
}
}
}```