单片机 > 单片机程序设计 > 详情

按键防抖处理程序

发布时间:2024-10-23 发布时间:
|

/*****************************************************    
本程序的目标是这样的: 
1:不使用INTn中断功能,按键接在普通IO上 
2:由定时器T/C2每隔一段时间检测按键一次, 并具有防抖动功能 
3:每点击按键一次,在按键松开后,变量A=A+1 
4:如果按键按下后不放,则每隔 n ms 就做A=A+1运算一次 

5:在按键按下期间,CPU除了处理按键外,还必须能正常运行主程序    
6:本程序的系统时钟是1MHz 
*****************************************************/ 

#include   
#include  
#include  

unsigned char A,B; 
unsigned char n;  
bit step1, step2, step3,step4;                     //使用几个位变量记忆按键状态 
     
//***************************************************  
interrupt [10] void TC2_OVF(void) 
{  
  if(n<255) n++;                    
  if(PIND.2==1 && n>8) step1=1;                    //按键松开一定时间后开始进入可用状态 
  if(PIND.2==0 && step1) {step1=0; step2=1; n=0;}  //按键由可用状态进入到按下状态 
  if(PIND.2==1 && step2) {step2=0; step3=1; n=0;}  //按键由按下状态进入到松开状态   
   
  //-------------------------------------------------    
                                                   //按键按下后... 
  if(step2) 
  { 
    n++; 
    if(n>60)                                       //如果按下超过一定时间  
    { 
      A+=1; 
      n=40; 
      step4=1; 
    } 
  }    
   
  //-------------------------------------------------   
   
  if(step3)                                        //按键松开后... 
  { 
    step3=0; 
    if(step4) step4=0; else A+=1; 
  } 


//*************************************************** 
//www.avrDIY.com panxiaoyi 
void main(void) 
{    
  PORTB&=209;        
  DDRB|=46;                                        //设置 单片机 的4个LCD引脚输出0         
  lcd_init();                                      //lcd初始化                 
  lcd_cls();                                       //清屏,光标回位      
   
  DDRD.2=0;  
  PORTD.2=1;                                       //PD2设置为输入,上拉电阻有效(接按键)   
  TCCR2B|=4;                                       //T/C2采用系统时钟的64分频  
  #asm("sei");                                     //全局中断使能 
  TIMSK2|=1;                                       //T/C2计数溢出中断使能   

  while (1) 
  {    
    B+=1;      
    lcd_gotoxy(12,1);  
    lcd_putsf("AVRDIY.COM",10);   
      
    lcd_gotoxy(15,3); 
    lcd_putchar(B/100+48);                         //显示变量B 
    lcd_putchar(B/10%10+48); 
    lcd_putchar(B%10+48); 
     
    lcd_gotoxy(52,3);   
    lcd_putchar(A/100+48);                         //显示变量A 
    lcd_putchar(A/10%10+48);    
    lcd_putchar(A%10+48);      
  }; 



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
MSP430低功耗模式-while循环失效