定时器按键消抖

实现思路

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; //(4800*1)/48000 000 = 1 ms 
     // 固定的 不要动  让他中断一次为1ms
    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) //加到大于20ms 短按 
			 {   
				 S7_i=0;  //重新开始计算(算完一次了)
				 S7_onf=0; //检查按键事件已经过了 所以清0
				 S7_k=0; //标记按下了
			 }
			
			
		 }
       else  //长时间没反应  就自动清0
      {
				S7_i=0;
				
		}
			
			
	}
	else //检查按键事件不成立 
  {
		 if(S7) 
		 {
			 S7_i++;  
			 
			 if(S7_i>20)
			 {
				 S7_i=0; 
				 S7_onf=1; 
				 S7_k=1; 
			 }	  
		 }
     else//0
      {
				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;//ΪÁ˻ص½³õʼ»¯×´Ì¬ ¼ÌÐøÓà S2
						 number_ks=number_ks+1;  
										}
						if(S4_k){
						 S4_k=0;//ΪÁ˻ص½³õʼ»¯×´Ì¬ ¼ÌÐøÓà S4
						 number_ks=number_ks+100;  
										}
			      lcd_first(number_ks);
			      delay_ms(20);
			      lcd_clear_screen();
					if(S7_k){  
						S7_k = 0 ;
key7dl=1;				
				     break;
						}
			}
				
 }```

 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值