#include<reg51.h> //头文件
typedef unsigned char u8;//定义u8类型
typedef unsigned int u16; //定义 u16类型
#define uchar unsigned char //定义 uchar类型
u8 disp[8]; //数码管缓存
unsigned char code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40,0x80}; //数码管段码
sbit LSA=P2^2; //74HC138控制脚
sbit LSB=P2^3; //74HC138控制脚
sbit LSC=P2^4; //74HC138控制脚
sbit key1=P3^0;
sbit key2=P3^1;
sbit key3=P3^2;
u16 pp=0;
char shi=0,fen=0,miao=0;
void delay(uchar i) //延时函数
{
uchar j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
/*******************************************************************************
* 函数名 :DigDisplay()
* 函数功能 :数码管显示函数
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void display()
{
u8 i;
disp[7]=smgduan[shi/10];
disp[6]=smgduan[shi%10];
disp[5]=smgduan[17];
disp[4]=smgduan[fen/10];
disp[3]=smgduan[fen%10];
disp[2]=smgduan[17];
disp[1]=smgduan[miao/10];
disp[0]=smgduan[miao%10];
for(i=0;i<8;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(7):
LSA=0;LSB=0;LSC=0; break;//显示第0位
case(6):
LSA=1;LSB=0;LSC=0; break;//显示第1位
case(5):
LSA=0;LSB=1;LSC=0; break;//显示第2位
case(4):
LSA=1;LSB=1;LSC=0; break;//显示第3位
case(3):
LSA=0;LSB=0;LSC=1; break;//显示第4位
case(2):
LSA=1;LSB=0;LSC=1; break;//显示第5位
case(1):
LSA=0;LSB=1;LSC=1; break;//显示第4位
case(0):
LSA=1;LSB=1;LSC=1; break;//显示第5位
}
P0=disp[7-i];//发送数据
delay(2); //间隔一段时间扫描
P0=0x00;//消隐
}
}
void key()
{
if(key1==0)
{
delay(2);
if(key1==0)
{
while(!key1);
TR0=1;
}
}
if(key2==0)
{
delay(2);
if(key2==0)
{
while(!key2);
TR0=0;
}
}
if(key3==0)
{
delay(2);
if(key3==0)
{
while(!key3);
TR0=0;
miao=0;
fen=0;
}
}
}
void main()
{
TMOD = 0X01; //初始化定时器
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
EA = 1; //开总中断
ET0 = 1; //开T0中断
TR0=0;
while(1)
{
display();
key();
}
}
void T0_ISR(void) interrupt 1
{
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
pp++;
if(pp==20)
{
pp=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)shi=0;
}
}
}
}
|