#include <AT89X52.H>
#define uchar unsigned char
#define uint unsigned int
sbit key1=P2^0;
sbit key2=P2^1;
uchar code table[]={ //共阳数码管段码"0~f-."
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e,0xbf,0x7f};
uchar Cnt50ms = 0;
uchar Cnt1s = 24;
void display()//显示程序
{
static uchar count=0; //计数变量
static uchar count1=0;
count1++; //动态显示计数延时
if(count1>=50)
{
count1=0;
P1=0xff; //消隐
switch(count)
{
case 0:
P3=0x01; //秒十位位码
P1=table[Cnt1s/10];//秒十位段码
count=1;
break;
case 1:
P3=0x02; //秒个位位码
P1=table[Cnt1s%10];//秒个位段码
count=0;
break;
}
}
}
void Timer0Init() //50毫秒@12.000MHz
{
TMOD= 0x01; //设置定时器模式
TL0 = 0xB0; //设置定时初值
TH0 = 0x3C; //设置定时初值
TF0 = 0; //清除TF0标志
// TR0 = 1; //定时器0开始计时
EA=1; //开总中断
ET0=1; //开定时器0中断
}
void keyscan() //按键扫描
{
static uchar count1=0,count2=0; //计数变量
static bit key_sign1=0,key_sign2=0; //按键状态标志
if(key1==0) //检测输入如果为0
{
count1++; //计数延时消抖
if((count1>=250)&&(key_sign1==0))
{
key_sign1=1; //按键状态标志置1,防止重复响应
TR0 = 1; //定时器0开始计时
}
}
else //按键抬起
{
count1=0; //计数变量清0
key_sign1=0; //按键状态标志清0
}
if(key2==0) //检测输入如果为0
{
count2++; //计数延时消抖
if((count2>=250)&&(key_sign2==0))
{
key_sign2=1; //按键状态标志置1,防止重复响应
Cnt1s=24;
TR0 = 0; //定时器0停止计时
}
}
else //按键抬起
{
count2=0; //计数变量清0
key_sign2=0; //按键状态标志清0
}
}
/***************主程序****************/
void main()
{
Timer0Init(); //定时器初始化
while(1)
{
keyscan(); //按键扫描
display(); //显示程序
}
}
/**************中断服务程序*****************/
void timer0() interrupt 1
{
TL0 = 0xB0; //设置定时初值
TH0 = 0x3C; //设置定时初值
Cnt50ms++;
if(Cnt50ms>=20) //1s
{
Cnt50ms=0;
Cnt1s--;
if(Cnt1s==0)
{
Cnt1s=0;
TR0 = 0; //定时器0停止计时
}
}
} |