热门IT资讯网

简单的定时器实现按键消抖,还望大家多指点!

发表于: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;        }}


0