按键输入是人机对话不可缺少的一部分,对于消抖设计,一种是软件消抖,一种是硬件消抖。但在单片机电路设计中,采用电容消抖才是最佳的选择,其次才是定时器消抖。
1、按键输入采用软件消抖
1)、通过定时器方式定时读取按键输入
根据固定的采集周期,通常为10ms,需要读两次,若前后两次均相同,则认为按键被按下。需要占用CPU的定时器,优点:不占用CPU执行时间,程序执行速度快。缺点:需要一个全局变量Key来辅助完成。
定时器中断程序:
Key=(u8)(Key<<1);
if(KeyPin=0) Key=(u8)(Key|0x01); //将key的最低位置1
else Key=(u8)(Key&0xFE); //将key的最低位置0
按键读取程序
if( (key&0x03) ==0x03 ) 按键被按下
else 无按键被按下
2)、完全采用软件延时,每隔10ms周期采集一次,需要读两次,若前后两次均相同,则认为按键被按下。缺点:占用CPU执行时间,影响程序的执行速度,当有中断发送时,读取按键的时间变长,不适合用于中断频繁的程序中。
if(KeyPin=0)
{
delay_ms(10);
if(KeyPin=0)//确认有键按下
{
}
}
2、按键输入采用硬件消抖
1)、电容消抖
注意:KEY_UP,KEY_Left,KEY_OK连接到CPU引脚。
采用定时器轮询读取
2)、专用芯片消抖
在有很多按钮输入的情况下,使用专用芯片。缺点:增加硬件成本。
3、定时器消抖应用
开关的两个引脚通过IO控制,若通过定时器扫描,可实现连读。例如每0.2秒读一次,则1秒可以读取5次。通常按键时间为0.5秒~0.7秒。
若CPU无上上拉电阻,则连接上拉电阻。若有内部上拉电阻,就不用了。
按键按下分析:
如果COL1~COL4被置0,读ROW1~ROW4,可以知道被按下的按键所在的行 。同理,可以分析出被按下的按键所在的列。见下图:
程序实现:
1)、先初始化COL=0,ROW=0,再令COL1=0,COL2=,0,COL3=0,COL4=0,接着
读ROW1,判断是否为0,若为0,则记录ROW=1;
读ROW2,判断是否为0,若为0,则记录ROW=2;
读ROW3,判断是否为0,若为0,则记录ROW=3;
读ROW4,判断是否为0,若为0,则记录ROW=4;
2)、先令ROW1=0,ROW2=,0,ROW3=0,ROW4=0
读COL1,判断是否为0,若为0,则记录COL=1;
读COL2,判断是否为0,若为0,则记录COL=2;
读COL3,判断是否为0,若为0,则记录COL=3;
读COL4,判断是否为0,若为0,则记录COL=4;
3)、分析按键值
if( ROW > 0 && COL >0 )
{
KeyCnt++;
if(KeyCnt>2)
{
KEY_Value=(ROW-1)*4+COL //发现按键被按下
//用户读到该值后,需要将KEY_Value=0
KeyCnt=0; //实现连续按键
}
}
else
{
KEY_Value=0;//无按键被按下
KeyCnt=0;
}
4、总结
在单片机电路设计中,采用电容消抖是最佳的选择,其次才是定时器消抖。