/********************************
按独立按键使数码管加1
********************************/
#include <reg52.h>
#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;
}
}