这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 单片机按键的问题(转)

共3条 1/1 1 跳转至

单片机按键的问题(转)

高工
2011-08-03 13:53:30     打赏
在网上看到这篇心得,感觉还是很实用的小问题,转来希望大家共同学习,

在网上看了《单片机按键一次处理的优化方法》这篇文章,很有点启发,不过我疑惑的是第二个程序中的消除抖动语句怎么没了,再查发现网上所有的文章都一模一样,难道所有人都完全懂了,所有人都没有我这个困惑~,求解释


以前做单片机的时候总会遇到一个问题就是:在单片机的键盘输入的键盘一次处理时,原来的做法通常是通过“延时”等待键盘的松开,所以单片机就会停留在此处,其他的程序进行不下去。会出现显示不正常、无响应等错误。
以前的程序如下:
其中p10为P10端口做键盘输入,p10= =0为按下,调用的delay程序为
void delay(unsigned int cnt)
{
  unsigned char i;
  while(cnt--!=0)
  for(i=100;i!=0;i--);
}
键盘扫描子程序如下:
void scankey()   //扫描按键
{
if(p10==0)  //p10口按键及处理程序
       {
       delay(100);//键盘防抖动
       if(p10==0)
              {
              do delay(10);//如果键盘一直按下则一直“延时”等待松开
              while(p10==0);
              TR0=!TR0;    //松开时相应
              }
       }
}
所以从以上程序看如果程序一直按下则单片机一直会在延时程序等待,占用了整个单片机
我想通过flag可以很好的解决这个问题
bit flag=0; 定义标志
以下是键盘处理程序:
void scankey()   //扫描按键
{

if(p10= =0&&flag= =0)  //p10口按键及处理程序,其中flag如果为1就不用再扫描    就是这里,没有消抖动了~是怎么回事咧
{
delay(10);
flag=1;
delay(5);
}
if(p10= =1&&flag= =1)  //如果p10为1,flag为1说明已经被按下并抬起
{
TR0=!TR0;    //松开时相应
flag=0;    //标志清零,为下次按键做准备(其实为一次处理)
}
}
程序已经仿真,没改过的之前,长按按键数码管只有最后一个亮。
改过后长按按键,数码管显示正常。
细细回味非常有意思,和大家分享。 var tagarray = ['单片机','求助','C语言','51单片机','程序','单片机培训','汇编','LCD','keil','高手','串口','开发','DS18B20','PCB','软件','时钟','新人','请教','PCB打样','学习板','嵌入式培训','液晶','帮忙','数码管','液晶屏','计算器','人机界面','高薪','proteus','编程','嵌入式','单片机学习','三维电子','AVR','初学者','元件','c51','教程','仿真','MP3','stc','点阵','PWM','电子','毕业设计','电子元器件','求教','电子钟','编程器','工程师','芯片','LED','交通灯','Linux培训','温度传感器','12864','嵌套','中华矽智网','SIPMall','电路','大全','键盘','急聘','游戏机','视频','矩阵键盘','资料','学习','单片机开发','启事','招聘','外部中断','定时器','ARM','ds1302','延时','TEA5767','步进电机','Zilog','边学边用','新手','时间','寻人','问题','驱动','液晶模块','毕业论文','单片机入门视频','单片机联机思想','TMS320F2812开发板','DSP2812开发板','2812开发板','深圳单片机培训','新人报道','程序员','入门','FLASH','转速','蜂鸣器','硬件'];var tagencarray = ['%B5%A5%C6%AC%BB%FA','%C7%F3%D6%FA','C%D3%EF%D1%D4','51%B5%A5%C6%AC%BB%FA','%B3%CC%D0%F2','%B5%A5%C6%AC%BB%FA%C5%E0%D1%B5','%BB%E3%B1%E0','LCD','keil','%B8%DF%CA%D6','%B4%AE%BF%DA','%BF%AA%B7%A2','DS18B20','PCB','%C8%ED%BC%FE','%CA%B1%D6%D3','%D0%C2%C8%CB','%C7%EB%BD%CC','PCB%B4%F2%D1%F9','%D1%A7%CF%B0%B0%E5','%C7%B6%C8%EB%CA%BD%C5%E0%D1%B5','%D2%BA%BE%A7','%B0%EF%C3%A6','%CA%FD%C2%EB%B9%DC','%D2%BA%BE%A7%C6%C1','%BC%C6%CB%E3%C6%F7','%C8%CB%BB%FA%BD%E7%C3%E6','%B8%DF%D0%BD','proteus','%B1%E0%B3%CC','%C7%B6%C8%EB%CA%BD','%B5%A5%C6%AC%BB%FA%D1%A7%CF%B0','%C8%FD%CE%AC%B5%E7%D7%D3','AVR','%B3%F5%D1%A7%D5%DF','%D4%AA%BC%FE','c51','%BD%CC%B3%CC','%B7%C2%D5%E6','MP3','stc','%B5%E3%D5%F3','PWM','%B5%E7%D7%D3','%B1%CF%D2%B5%C9%E8%BC%C6','%B5%E7%D7%D3%D4%AA%C6%F7%BC%FE','%C7%F3%BD%CC','%B5%E7%D7%D3%D6%D3','%B1%E0%B3%CC%C6%F7','%B9%A4%B3%CC%CA%A6','%D0%BE%C6%AC','LED','%BD%BB%CD%A8%B5%C6','Linux%C5%E0%D1%B5','%CE%C2%B6%C8%B4%AB%B8%D0%C6%F7','12864','%C7%B6%CC%D7','%D6%D0%BB%AA%CE%F9%D6%C7%CD%F8','SIPMall','%B5%E7%C2%B7','%B4%F3%C8%AB','%BC%FC%C5%CC','%BC%B1%C6%B8','%D3%CE%CF%B7%BB%FA','%CA%D3%C6%B5','%BE%D8%D5%F3%BC%FC%C5%CC','%D7%CA%C1%CF','%D1%A7%CF%B0','%B5%A5%C6%AC%BB%FA%BF%AA%B7%A2','%C6%F4%CA%C2','%D5%D0%C6%B8','%CD%E2%B2%BF%D6%D0%B6%CF','%B6%A8%CA%B1%C6%F7','ARM','ds1302','%D1%D3%CA%B1','TEA5767','%B2%BD%BD%F8%B5%E7%BB%FA','Zilog','%B1%DF%D1%A7%B1%DF%D3%C3','%D0%C2%CA%D6','%CA%B1%BC%E4','%D1%B0%C8%CB','%CE%CA%CC%E2','%C7%FD%B6%AF','%D2%BA%BE%A7%C4%A3%BF%E9','%B1%CF%D2%B5%C2%DB%CE%C4','%B5%A5%C6%AC%BB%FA%C8%EB%C3%C5%CA%D3%C6%B5','%B5%A5%C6%AC%BB%FA%C1%AA%BB%FA%CB%BC%CF%EB','TMS320F2812%BF%AA%B7%A2%B0%E5','DSP2812%BF%AA%B7%A2%B0%E5','2812%BF%AA%B7%A2%B0%E5','%C9%EE%DB%DA%B5%A5%C6%AC%BB%FA%C5%E0%D1%B5','%D0%C2%C8%CB%B1%A8%B5%C0','%B3%CC%D0%F2%D4%B1','%C8%EB%C3%C5','FLASH','%D7%AA%CB%D9','%B7%E4%C3%F9%C6%F7','%D3%B2%BC%FE'];parsetag();



关键词: 单片机     按键     问题     程序     键盘    

高工
2011-08-03 20:41:21     打赏
2楼
其实长延时消抖只是课本上的东西,实用性太差了

按键的动作有很多啊,包括长按,短按,组合键等等
都需要不同的方法来处理

马潮老师的《AVR单片机嵌入式系统原理与应用实践》里面有一章专门讲采用定时器+状态机来编写按键程序的,看过的都说不错。。。。没广告嫌疑吧

高工
2011-08-03 21:16:26     打赏
3楼
AVR教学1_2篇电子稿.pdf

上传电子版 ,里面第九章讲按键

共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]