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

单片机一般按键的设计

发布时间:2020-05-30 发布时间:
|
一、机械按键的抖动

 

键盘,作为向系统操作人员的干预指令的接口,以其特定的按键序列代表着各种确定的操作命令,所以,准确无误的辨认每个键的动作和其所处的状态,是系统能否正常工作的关键。多数键盘的按键多使用机械式弹性开关,一个电信号通过机械触点的断开,闭合过程完成高低电平的切换。由于机械触点的弹性作用,一个按键开关在闭合及断开的瞬间必然伴随着一连串的抖动,其波形如图所示:

 

 
 

抖动过程的长短是由按键的机械特性决定,一般是10~20ms。为了使CPU对一次按键动作只确认一次,必须消除抖动的影响,可以从硬件及软件两个方面着手。本文只介绍软件方面的防抖。

 

软件防抖的思路:当第一次检测到有建按下时,先用软件延时(10~20ms),而后再确认键电平是否依旧维持闭合状态的电平。若保持闭合状态电平,则确认此间已按下,从而消除抖动影响。

 

二、proteus仿真

 

源程序:

 

#include
#include
#define uchar unsigned char
#define uint unsigned int

sbit jia_key=P2^0;
sbit jian_key=P2^1;

uint i;        //定义要显示的数字、字符
uchar duan_code[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};                        //共阴极数码管段码0~F

void delay_ms(uint z)   //ms级延迟函数,z表示形参,是几就是几ms延迟
{
  uint x,y;
  for(x=z;x>0;x--)
   for(y=99;y>0;y--)
    { _nop_();
   _nop_(); 
 }
}

void scankey(void)     //按键扫描函数
{
 if(jia_key==0)     //加按键检测
  {
    delay_ms(150);    //延迟防抖
    if(jia_key==0)    //加按键检测
      i++;
    if(i>15)
      i=15;
   }

 if(jian_key==0)     //减按键检测
  {
    delay_ms(150);    //延迟防抖
    if(jian_key==0)    //减按键检测
      i--;
    if(i<0)
      i=0;
   }

}
void main(void)    //主函数
{
 P0=0X00;    //初始化P0口为低电平
 while(1)  
   { 
     scankey();   //检测按键
     P0=duan_code[i]; //数码管显示 
   }
}



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

热门文章 更多
基于arm的指纹识别门禁系统是如何设计的