本帖最后由 骆海洋 于 2017-2-7 18:40 编辑
按键消抖 昨天学习了通过按键实现数码管加一的课程,但是由于按键在按下和弹起的过程中不能一次性实现所 以会产生咱波,进而影响功能的实现,今天就通过中断来实现消除按键抖动带来的影响。 按键消抖可以通过硬件和软件来实现。 l 硬件消抖,是通过电容的充放电的原理来实现的,就是用一个滤波电容来把影响按键的杂波去除(大电容滤低频小电容滤高频),通过给按键并联一个小电容来实现,但是硬件消抖的缺点比较明显:增加了电路成本和电路的复杂程度,所以通过软件消抖就是我们的首选。 软件消抖代码如下: [mw_shl_code=c,true]#include <STC12C5A60S2.H>
/*声明部分*/
sbit ADDR0 = P2^0;
sbit ADDR1 = P2^1;
sbit ADDR2 = P2^2;
sbit ENLED = P1^1;
sbit KEY4 = P2^3;
sbit KOUT4 =P2^7;
unsigned char Ledchar[] = //数码管显示转换表
{
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90
};
bit keysta = 1; //定义一个全局变量,用来储存按键值
void main ()
{
unsigned char cnt = 0;//定义一个计数变量
bit i = 1;//保存前一次的按键值
EA = 1;//打开总中断
ENLED = 0;
ADDR0 = 1;
ADDR1 = 0;
ADDR2 = 1;
TMOD = 0X01;
TH0 = 0XEB;//设置一个初值,定时两毫秒
TL0 = 0X2B;
ET0 = 1;//打开定时器0中断
TR0 = 1;//打开定时器0
KOUT4 = 0;
P0 = Ledchar[cnt];
while(1)
{
if(keysta != i) //判断本次按键值与上一次按键值是否相等,若不相等说明有按键动作,
{ //继续判断按键值。若相等进入中断消抖和扫描按键。
if(i == 0 ) //判断按键值如果是0说明按键按下,进入if语句,cnt自加。
{
cnt++;
if(cnt == 10)//数码管计数到9所以cnt加到10是清0
{
cnt = 0;
}
P0 = Ledchar[cnt];
}
i = keysta; //保存按键值
}
}
}
/*中断服务函数*/
void InterruptTimer() interrupt 1
{
static unsigned char keybuff = 0xff;//定义一个静态变量,用作扫描按键值
TH0 = 0XEB;
TL0 = 0X2B;
keybuff = (keybuff << 1)|KEY4;//本句实现按键扫描,扫描8次
/*用if语句实现判断按键值8位序列*/
if(keybuff == 0x00) //如果扫描值为0x00说明按键按下,keysta赋值0
{
keysta = 0;
}
else if (0xff)//如果扫描值为0xff说明按键弹起,keysta赋值1
{
keysta = 1;
}
}[/mw_shl_code] 在这一段的学习中自我感觉到只是看视频或者看书而不去写代码,在自己再次写的时候就会感觉到力不从心。所以要多写代码,养成独立的思考算法的习惯。
|