《8位数码管显示时钟16页》由会员分享,可在线阅读,更多相关《8位数码管显示时钟16页(16页珍藏版)》请在金锄头文库上搜索。
1、本人依据AT89C51和8位数码管为素材,以最少的见实现最多的功能!本程序开机流动显示学号可实现时钟,日历,定时闹钟,秒表等功能!C程序:#include unsigned char led12=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00; /用一维数组定义-9、横杠、全灭unsigned char num12=2,0,0,9,3,5,0,7,0,1,2,0 ;unsigned char a8; unsigned char second=0,minute=0,hour=0,year=0,mon=1,day=1,day1
2、,hsec,sec_m,min_m,N,temp1;unsigned char minute1=0,hour1=0;unsigned char b8=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;/扫描unsigned char k=0;unsigned int temp; / 记录毫秒为秒的变量unsigned char M,S_flag;/M是模式,更新时间的种模式加上正常模式S_flag闪烁标志sbit K0=P37; /K0是闹钟起停标志位sbit K1=P30;sbit K2=P31;sbit K3=P32;sbit BEEP=P33;void de
3、lay(unsigned n) /0.2毫秒 int x,y; for(x=0;xn;x+) for(y=0;y24;y+); void init1() S_flag=0; /闪烁标志位 TMOD=0x10; /定时器以方式定时 TH1=0xfc; TL1=0x18; EA=1; /打开总中断 ET1=1; /允许定时器中断 TR1=1; /开启定时器(开始定时计数) void init0() TMOD=0x01; /定时器以方式定时 TH0=0xff; TL0=0xff; EA=1; /打开总中断 ET0=1; /允许定时器中断 TR0=0; /关闭定时器(关闭定时计数) void disp
4、lay_led() /流动显示学号int x;char l,a,m;for(a=0;a21;a+)x=a-8;for(l=0;l6;l+)for(m=0;m=0&x12) P1=lednumx;else P1=led11;delay(10);x+;x-=8;void display() /显示时钟及显示调节位 switch(M)case 0: a0=ledhour/10;a1=ledhour%10;a2=led10;a3=ledminute/10;a4=ledminute%10;a5=led10;a6=ledsecond/10;a7=ledsecond%10; break;case 1:if(
5、S_flag=1)a0=ledhour/10;a1=ledhour%10;elsea0=led11;a1=led11;a2=led10;a3=ledminute/10;a4=ledminute%10;a5=led10;a6=ledsecond/10;a7=ledsecond%10;break;case 2:a0=ledhour/10;a1=ledhour%10;a2=led10;if(S_flag=1)a3=ledminute/10;a4=ledminute%10;elsea3=led11;a4=led11;a5=led10;a6=ledsecond/10;a7=ledsecond%10;br
6、eak; case 3:if(S_flag=1) a0=ledyear/10; a1=ledyear%10; else a0=led11; a1=led11; a2=led10; a3=ledmon/10; a4=ledmon%10; a5=led10; a6=ledday/10; a7=ledday%10;break; case 4:a0=ledyear/10;a1=ledyear%10;a2=led10;if(S_flag=1)a3=ledmon/10;a4=ledmon%10;elsea3=led11;a4=led11;a5=led10;a6=ledday/10;a7=ledday%10
7、;break; case 5:a0=ledyear/10;a1=ledyear%10;a2=led10;a3=ledmon/10; a4=ledmon%10;a5=led10;if(S_flag=1) a6=ledday/10; a7=ledday%10; else a6=led11; a7=led11;break;case 6:if(S_flag=1)a0=ledhour1/10;a1=ledhour1%10;elsea0=led11;a1=led11;a2=led10;a3=ledminute1/10;a4=ledminute1%10;a5=led10;a6=led11;a7=led11;
8、break;case 7:a0=ledhour1/10;a1=ledhour1%10;a2=led10;if(S_flag=1)a3=ledminute1/10;a4=ledminute1%10;elsea3=led11;a4=led11;a5=led10;a6=led11;a7=led11; void key_prc()/时钟和闹钟调节 if(K1=0) delay(10);/延时去抖 if(K1=0) /按K1进行模式切换 M+;if(M=8) M=0;while(!K1);/等待按键释放 if(M!=0) switch(M) case 1: /模式-调时 if(K2=0)delay(10);/延时去抖 if(K2=0) /加键按下 if(hour 0) hour-;else hour=23; while(!K3); break; case 2: /模式-调分 if(K2=0)delay(10);if(K2=0) if(minute0) minute-;else minute=59; while(!K3); break; case 3: /模式-调年 if(K2=0)