打印
[AVR单片机]

按键处理与按键防抖动例子

[复制链接]
4441|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huamunv|  楼主 | 2010-2-20 10:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 huamunv 于 2010-3-12 21:33 编辑

/*****************************************************   
本程序的目标是这样的:
1:不使用INTn中断功能,按键接在普通IO上
2:由定时器T/C2每隔一段时间检测按键一次, 并具有防抖动功能
3:每点击按键一次,在按键松开后,变量A=A+1
4:如果按键按下后不放,则每隔 n ms 就做A=A+1运算一次
5:在按键按下期间,CPU除了处理按键外,还必须能正常运行主程序   
6:本程序的系统时钟是1MHz
*****************************************************/

#include <mega48.h>
#include <delay.h>
#include <nokia3310.h>

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);     
  };
}

相关帖子

沙发
Karlshen| | 2010-2-20 22:14 | 只看该作者
踩踩

使用特权

评论回复
板凳
laslison| | 2010-2-21 15:55 | 只看该作者
字号小了

使用特权

评论回复
地板
lovelyegle| | 2010-2-22 19:44 | 只看该作者
话说防抖振的例子还真多···

使用特权

评论回复
5
wangwo| | 2010-2-23 12:38 | 只看该作者
留个印

使用特权

评论回复
6
huamunv|  楼主 | 2010-3-12 21:34 | 只看该作者
这下够大了吧

使用特权

评论回复
7
kuguali| | 2010-11-9 22:35 | 只看该作者
支持学习。

使用特权

评论回复
8
alexshao1978| | 2010-11-15 17:38 | 只看该作者
思路基本上可以了,给几点建议:
1:按键处理放在主循环进行。中断只置起一个标志,主循环检查到标志后读入端口并且去抖。中断运行时间要求越短越好。
2:使用STRUCT封装按键,使用STRUCT地址做参数,合并多个按键的程序。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

88

主题

730

帖子

1

粉丝