简单的定时器实现按键消抖,还望大家多指点!
发表于:2024-11-25 作者:热门IT资讯网编辑
编辑最后更新 2024年11月25日,/******************************** 按独立按键使数码管加1********************************/ #include #def
/******************************** 按独立按键使数码管加1********************************/ #include#define uchar unsigned char sbit KEY = P1 ^ 0; //定义独立按键 bit KEYSTA = 1; //按键的初始状态 uchar code DispCode[] = {0xc0,0xf9,0xa4,0xb0, //共阳数码管 0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e};void Timer0Init(); //定时器初始化函数void KeyProcess(); //按键处理函数void main(){ Timer0Init(); KeyProcess();}void Timer0Init(){ TMOD |= 0x01; TH0 = 0xF8; //定时2MS TL0 = 0xCD; EA =1; ET0 = 1; TR0 = 1;}void KeyProcess(){ bit lasttime = 1; //定义前一次按键值,初始化为1; uchar count = 0; //计数值初始化为0; KEY = 0x01; //按键初始化; P0 = DispCode[count]; //数码管初始化; while(1) { if (KEYSTA != lasttime) //如果"当前按键状态"与"前一次按键状态"不同,说明按键有动作; { if (lasttime == 1) //如果按键有动作了,那么前一次按键状态为"弹起"(lasttime == 1),说明按键按下时,会响应动作; { count++; if (count >= 16) //计数加到16清零,只用一个共阳数码管; { count = 0; } P0 = DispCode[count]; //共阳数码管显示相应的值; } lasttime = KEYSTA; //如果按键有动作,就更新前一次按键的值; } }}void Timer0IRQ() interrupt 1 //2MS中断一次{ static keybuf = 0xFF; //定义一个静态按键缓存变量,且值为FF;主要是暂存按键状态; TH0 = 0xF8; //重新写入初值; TL0 = 0xCD; keybuf = (keybuf << 1) | KEY; //左移一位,使当前的按键状态移到按键缓存中; if (keybuf == 0) //如果移8次,按键状态都为0,说明按键真正按下; { KEYSTA = 0; //确定按键状态为按键; } else if (keybuf == 0xFF) //如果移8次,按键状态都为1,说明按键未按下 { KEYSTA = 1; }}