微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 单片机一般按键的设计

单片机一般按键的设计

时间:11-26 来源:互联网 点击:
一、机械按键的抖动

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


抖动过程的长短是由按键的机械特性决定,一般是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];//数码管显示
}
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top