📄 数字时钟最终显示程序.c
字号:
//P3口控制按键,P0口控制哪个数码管亮,P1口控制数码管亮的数字
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key0=P3^0;
sbit key1=P3^1;
sbit key2=P3^2;
sbit key3=P3^3;
//sbit P0_7=P0^7;//控制冒号闪烁,可不用
//--------字表----------
uchar code dispcode[]=
{0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00};
//-------显示位置-------
uchar dispbitcode[]={0xa0,0x90,0x88,0x84,0x82,0x81};
uchar second=0; //秒
uchar minite=0; //分
uchar hour=12; //小时
uchar ms=0; //时间累加数
uchar keynum=0; //按键次数
//-----延迟------
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//-------时间显示---------
void display()
{
uchar m;
for(m=0;m<6;m++)
{
delay(2);
P0=dispbitcode[m]; //控制显示位
switch(m) // 设置显示数
{
case 0: P1=dispcode[second%10]; break;
case 1: P1=dispcode[second/10]; break;
case 2: P1=dispcode[minite%10]; break;
case 3: P1=dispcode[minite/10]; break;
case 4: P1=dispcode[hour%10]; break;
case 5: P1=dispcode[hour/10]; break;
}
}
}
//---buzhidao -----
void sdisplay(uchar dw)
{
uchar cc,i;
cc=0x03; //buzhidao
cc=~(cc<<dw);
for(i=0;i<6;i++)
{
delay(2);
P0=dispbitcode[i]&cc;
switch(i)
{
case 0: P1=dispcode[second%10]; break;
case 1: P1=dispcode[second/10]; break;
case 2: P1=dispcode[minite%10]; break;
case 3: P1=dispcode[minite/10]; break;
case 4: P1=dispcode[hour%10]; break;
case 5: P1=dispcode[hour/10]; break;
}
}
}
//--------分秒时调节时的闪烁--------
void shan()
{
uchar i;
if(keynum==1)
{
for(i=0;i<4;i++)
{
display();
}
for(i=0;i<4;i++)
{
sdisplay(4);
}
}
if(keynum==2)
{
for(i=0;i<4;i++)
{
display();
}
for(i=0;i<4;i++)
{
sdisplay(2);
}
}
if(keynum==3)
{
for(i=0;i<4;i++)
{
display();
}
for(i=0;i<4;i++)
{
sdisplay(0);
}
}
}
//--------键盘扫描-----------
void skycon()
{
if(key0==0)
{
delay(5);
if(key0==0)
{
TR0=0;//接受终端位复位,不允许中断,也就是按键按下时,开始调时,秒钟不动
while(!key0)//按键按下时依然显示时间
{
display();
}
keynum++;
if(keynum==4) //退出时间调试
{
keynum=0;
TR0=1; //接受中断位打开,秒钟开始动
}
}
}
shan(); //被选位闪烁
if(keynum!=0)
{
if(key1==0 ) //加1
{
delay(5);
if(key1==0 )
{
if(keynum==1)
{
second++;
if(second==60)
{
second=0;
}
}
if(keynum==2)
{
minite++;
if(minite==60)
{
minite=0;
}
}
if(keynum==3)
{
hour++;
if(hour==24)
{
hour=0;
}
}
while(!key1) //去抖动,且一直显示时间
{
display();
}
}
}
if(key2==0 ) //减1
{
delay(5);
if(key2==0 )
{
if(keynum==1)
{
second--;
shan();
if(second==-1)
{
second=59;
}
}
if(keynum==2)
{
minite--;
shan();
if(minite==-1)
{
minite=59;
}
}
if(keynum==3)
{
hour--;
shan();
if(hour==-1)
{
hour=23;
}
}
while(!key2)
{
display();
}
}
}
}
if(key3==0) //退出时间调试
{
delay(5);
if(key3==0)
{
keynum=0;
TR0=1;
}
while(!key3)
{display();}
}
}
void main()
{
TMOD=0x01; // 中断始终以方式1打开
TH0=(65535-50000)/256; //每50ms 一次中断
TL0=(65535-50000)%256;
TR0=1; //启动定时器0
ET0=1;
EA=1;
while(1)
{
skycon();
display();
shan();
}
}
void time0() interrupt 1
{
TH0=(65535-50000)/256; //除中断2可以自动分配时间外,其余中断都得从新声明
TL0=(65535-50000)%256;
ms++;
if(ms==20) //50x20=1000ms=1s
{
ms=0;
// P0_7=!P0_7;
second++;
if(second==60)
{
second=0;
minite++;
if(minite==60)
{
minite=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -