#include "reg52.h"
#include "intrins.h"
typedef unsigned int u16;
typedef unsigned char u8;
u16 count_num=0;//秒计数变量
u8 count[4] =0;//4位数码管显示缓存
u8 k=0;//定时中断溢出计次变量
//按键引脚
sbit key1 = P3^0;
sbit key2 = P3^1;
sbit key3 = P3^2;
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数码管码表,显示0~F的值
void DigDisplay()//数码管轮询显示函数
{
u8 i;
for(i=0;i<4;i++)
{
switch(i)
{
case(0):
P2 = 14 | 0xf0; break;//显示第0位
case(1):
P2 = 13 | 0xf0; break;//显示第1位
case(2):
P2 = 11 | 0xf0; break;//显示第2位
case(3):
P2 = 7 | 0xf0; break;//显示第3位
}
P1=smgduan[count[ i]];//发送段码
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //间隔一段时间扫描
P1=0x00;//消隐
}
}
void init() //定时器初始化
{
TMOD=0x15;
TH1=(65536-50000)/256;TL1=(65536-50000)%256; //定时初值50ms
TR1=1;
ET1=1;
EA=1; //总中断
}
void time_intt1(void) interrupt 3 //定时中断1
{
TH1=(65536-50000)/256;TL1=(65536-50000)%256; //12M晶振下定时50ms, 50ms = 1000 / (12Mhz/12T/50000).
k++;
if(k>=20)
{
k=0;
count_num++;
}
}
void tran()//转换秒计数变量值
{
count[0]=count_num/1000;//分离千位
count[1]=(count_num/100)%10;//分离百位
count[2]=(count_num/10)%10;//分离十位
count[3]=count_num%10;//分离个位
}
void main()
{
init();//定时器初始化
while(1)
{
tran();//转换秒计数变量值
DigDisplay();//数码管显示函数
if(!key1)TR1=1;//走时按键
if(!key2)TR1=0;//停止按键
if(!key3)count_num=0;//清零按键
}
}
|