数字钟C语言源程序
数字钟C语言源程序
**********************************************************************
#include
#include
#define uchar unsigned char
#define wei XBYTE[0x0FF20] //将82255PA口映射为数码管的位选,与硬件连接相对应
#define duan XBYTE[0x0FF21]//将8255PB口映射为数码管的段选,与硬件连接相对应
#define control XBYTE[0xff23]//将8255控制寄存器地址定义为control,与硬件连接相对应
#define int8 unsigned char
#define int16 unsigned int
sbit key1=P3^0;//设置键
sbit key2=P3^1;//加键
sbit key3=P3^2;//减键
Unsigned char dis[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//要显示的段码
uchar a=0,counter,hour=12,minute=0,second=0;
void delay(uchar x)//延时函数,约x us
{
while(x--);
}
void display(int8 hour,int8 minute,int8 second) //动态扫描程序
{
int8 hs,hg,ms,mg,ss,sg;
int8 counter;
hs=hour/10;//定义小时显示的十位
hg=hour%10;//定义小时显示的个位
ms=minute/10;//定义分钟显示的十位
mg=minute%10;//定义分钟显示的个位
ss=second/10;//定义秒钟显示的十位
sg=second%10;//定义秒钟显示的个位
duan=0xff;//关闭所有数码管显示
duan=dis[sg];
wei=0xfe;
for(counter=0;counter<100;counter++);
duan=0xff; //关闭所有数码管显示,防止上一个数据的干扰
duan=dis[ss];//送秒的十位段位码
wei=0xfd; //打开秒十位的位选,显示秒
for(counter=0;counter<100;counter++); //延时约100us,让数码管有足够的点亮时间
duan=0xff;
duan=dis[mg];
wei=0xfb;
for(counter=0;counter<100;counter++);
duan=0xff;
duan=dis[ms];
wei=0xf7;
for(counter=0;counter<100;counter++);
duan=0xff;
duan=dis[hg];
wei=0xef;
for(counter=0;counter<100;counter++);
duan=0xff;
duan=dis[hs];
wei=0xdf;
for(counter=0;counter<100;counter++);
}
void time_int() //定时器初始化
{
TMOD=0x01;//设置定时器0为模式1,16位
TH0=0x4c;
TL0=0x00; //装定时器初始值,定时中断一次为50ms时间
EA=1; //开总中断
ET0=1; //开定时器中断
TR0=1; //开启定时器0
}
void key()
{
if(key1==0) //设置键按下
{
delay(5);//消除抖动
while(key1==0)display(hour,minute,second); //当设置键处于按下的状态时一直显示当前时间(松手检测)
a++; //设置键释放后标志位加1
if(a==4)
{
TR0=1;
a=0;
}
if(a>=1)TR0=0;//关断定时器,时间停止
}
if(a==1)
{
if(key2==0)
{
while(key2==0)display(hour,minute,second);
hour++;
if(hour==24)hour=0;
}
if(key3==0)
{
while(key3==0)display(hour,minute,second);
hour--;