#include <REGX52.H>
#define uint unsigned int
#define uchar unsigned char
sbit DU =P2^6;//段选
sbit WE =P2^7;//位选
//共阴极数码管0-9
uchar code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
//void delay(uint z) //延迟函数
//{
// uint x,y;
// for(x = z; x > 0; x--)
// for(y = 114; y > 0 ; y--);
//}
void delay(uint x) //@12.000MHz 延迟函数1毫秒 和上述的函数一样
{
unsigned char i, j;
while(x--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void display(uchar i) //数码管显示函数
{
uchar bai, shi, ge;
bai = i / 100; //236 / 100 = 2
shi = i % 100 / 10; //236 % 100 / 10 = 3
ge = i % 10;//236 % 10 =6
P0 = 0XFF;//清除断码
WE = 1; //位选打开
P0 = 0XFE;//第一个数码管显示,共阴极1111 1110
WE = 0; //关闭位选寄存器
DU = 1; //段选寄存器打开
P0 = tabel[bai]; //百位数字
DU = 0; //段选寄存器关闭
delay(2); //延迟5秒
P0 = 0XFF;
WE = 1;
P0 = 0XFD; //二个数码管
WE = 0;
DU = 1;
P0 = tabel[shi];
DU = 0;
delay(2);
P0 = 0XFF;
WE = 1;
P0 = 0XFB;
WE = 0;
DU = 1;
P0 = tabel[ge];
DU = 0;
delay(2);
}
void timer0Init()
{
TR0 =1; //TCON中的打开定时器
TMOD =0x01; //TMOD不能位寻址 0000 0001中 0 01表示定时器模式 16位定时
TH0 =0x4b; //(65535-46082)/256; //定时器 50ms 65536-50000/1.085/256 高8位
TL0 =0xfd; //(65535-46082)%256; //低8位
}
void main()
{
uchar ms_50,s; //记录50ms的个数 20个为1s
timer0Init();
while(1)
{
if(TF0==1) //TCON中的TF0等到定时器计到65565溢出后硬件置1
{
TF0 =0; //软件置零
TH0 =0x4b; //初始化
TL0 =0xfd; //初始化
ms_50++; //次数累加
if(ms_50 ==20)//当20个为一秒 20*50=1000ms
{
s++; //秒位自加
ms_50=0; //归零
}
display(s);
}
}
}