以下是代码和思路 #include <reg52.h> #include <intrins.h>
#define uchar unsigned char #define uint unsigned int
sbit duan = P2^6; sbit wei = P2^7; sbit buzzer = P2^3; sbit buzzer_key = P3^3; sbit key1 = P1^0; sbit key2 = P1^1; sbit key3 = P1^2; sbit key4 = P1^3;
uchar code SMGduan[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x40,0x00}; uchar code SMGwei[] ={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; ucharmiao,fen,shi,amiao,afen,ashi,flag,s_flag; uint count = 0; uint date[8];
void display(); void key(); void beep(); void delay();
void delay(int z) { intx,y; for(x= z;x>0;x--) for(y=114;y>0;y--); } //显示函数 void display() { uinti; wei= 1; P0= 0xff; wei= 0;
duan= 1; P0=date[ i];
duan= 0; wei= 1; P0=SMGwei[ i]; wei= 0; for(i=0;i<8;i++){ if(i==8) i=0; delay(1); } //根据flag值来显示: flag=0,正常时钟。 Flag=1,时钟秒调整。 Flag=2,时钟分调整。 Flag=3,时钟时调整。 Flag=4,闹钟秒调整。 Flag=5,闹钟分调整。 Flag=6,闹钟时调整。 S_flag时闪烁标志位,没1s闪烁一次。 switch(flag){ case0: { date[0]= SMGduan[shi/10]; date[1]= SMGduan[shi%10]; date[2]= SMGduan[10]; date[3]= SMGduan[fen/10]; date[4]= SMGduan[fen%10]; date[5]= SMGduan[10]; date[6]= SMGduan[miao/10]; date[7]= SMGduan[miao%10]; } break; case1: { date[0]= SMGduan[shi/10]; date[1] = SMGduan[shi%10]; date[2]= SMGduan[10]; date[3]= SMGduan[fen/10]; date[4]= SMGduan[fen%10]; date[5]= SMGduan[10]; if(s_flag== 1){ date[6]= SMGduan[miao/10]; date[7]= SMGduan[miao%10]; } else{ date[6]= SMGduan[10]; date[7]= SMGduan[10]; } } break; case2: { date[0]= SMGduan[shi/10]; date[1]= SMGduan[shi%10]; date[2]= SMGduan[10]; if(s_flag==1){ date[3]= SMGduan[fen/10]; date[4]= SMGduan[fen%10]; } else{ date[3]= SMGduan[10]; date[4]= SMGduan[10]; } date[5]= SMGduan[10]; date[6]= SMGduan[miao/10]; date[7]= SMGduan[miao%10]; } break; case3: { if(s_flag==1){ date[0]= SMGduan[shi/10]; date[1]= SMGduan[shi%10]; } else{ date[0]= SMGduan[10]; date[1]= SMGduan[10]; } date[2]= SMGduan[10]; date[3]= SMGduan[fen/10]; date[4]= SMGduan[fen%10]; date[5]= SMGduan[10]; date[6]= SMGduan[miao/10]; date[7]= SMGduan[miao%10]; } break; case4: { date[0]= SMGduan[ashi/10]; date[1]= SMGduan[ashi%10]; date[2]= SMGduan[10]; date[3]= SMGduan[afen/10]; date[4]= SMGduan[afen%10]; date[5]= SMGduan[10]; if(s_flag==1){ date[6]= SMGduan[amiao/10]; date[7]= SMGduan[amiao%10]; } else{ date[6]= SMGduan[10]; date[7]= SMGduan[10]; } } break; case5: { date[0]= SMGduan[ashi/10]; date[1]= SMGduan[ashi%10]; date[2]= SMGduan[10]; if(s_flag==1){ date[3]= SMGduan[afen/10]; date[4]= SMGduan[afen%10]; } else{ date[3]= SMGduan[10]; date[4]= SMGduan[10]; } date[5]= SMGduan[10]; date[6]= SMGduan[amiao/10]; date[7]= SMGduan[amiao%10]; } break; case6: { if(s_flag==1){ date[0]= SMGduan[ashi/10]; date[1]= SMGduan[ashi%10]; } else{ date[0]= SMGduan[10]; date[1]= SMGduan[10]; } date[2]= SMGduan[10]; date[3]= SMGduan[afen/10]; date[4]= SMGduan[afen%10]; date[5]= SMGduan[10]; date[6]= SMGduan[amiao/10]; date[7]= SMGduan[amiao%10]; } break; } } //蜂鸣器 void beep() { buzzer= 0; if(shi== ashi && fen == afen && amiao-miao <= 2)//时钟闹钟时分相同,向两秒后关闭。 buzzer= 1; else buzzer= 0; } void jinzhi() { if(count== 20) { miao++; count= 0; if(miao==60){ fen++; miao=0; } if(fen==60){ shi++; fen=0; } while(shi==24){ shi= 0; fen= 0; miao= 0; count= 0; } } } //中断 void timer() interrupt 1 { uinti; TH0= (65536-46085)/256; TL0= (65536-46085)%256; beep(); count++; jinzhi(); if(count%20==0) { s_flag=!s_flag; } } //按键: key1选择模式,按一次flag加一; flag=0:普通时钟; flag=1: 按key2:时钟秒加一; 按key3:时减一; Flag=2:分调整; Flag=3:时调整; Flag=4:闹钟秒调整; 依次往后; Key4重置按键。 void key() { P1= 0xff; if(key1== 0){ delay(10); if(key1== 0){ flag++; if(flag==7){ flag=0; } } if(!key1); } if(flag!= 0){ switch(flag){ case1: { if(key2== 0){ delay(10); if(key2== 0){ if(miao < 60) miao++; else miao= 0; } if(!key2); } if(key3== 0){ delay(10); if(key3== 0){ if(miao> 0) miao--; else miao= 59; } if(!key3); } } break; case2: { if(key2== 0){ delay(10); if(key2== 0){ if(fen< 60) fen++; else fen= 0; } if(!key2); } if(key3== 0){ delay(10); if(key3== 0){ if(fen> 0) fen--; else fen= 59; } if(!key3); } } break; case3: { if(key2== 0){ delay(10); if(key2== 0){ if(shi< 24) shi++; else shi= 0; } if(!key2); } if(key3== 0){ delay(10); if(key3== 0){ if(shi> 0) shi--; else shi= 23; } if(!key3); } } break; case4: { if(key2== 0){ delay(10); if(key2== 0){ if(amiao< 60) amiao++; else amiao= 0; } if(!key2); } if(key3== 0){ delay(10); if(key3== 0){ if(amiao> 0) amiao--; else amiao= 59; } if(!key3); } } break; case5: { if(key2== 0){ delay(10); if(key2== 0){ if(afen< 60) afen++; else afen= 0; } if(!key2); } if(key3== 0){ delay(10); if(key3== 0){ if(afen> 0) afen--; else afen= 59; } if(!key3); } } break; case6: { if(key2== 0){ delay(10); if(key2== 0){ if(ashi< 24) ashi++; else ashi= 0; } if(!key2); } if(key3== 0){ delay(10); if(key3== 0){ if(ashi> 0) ashi--; else ashi= 23; } if(!key3); } } break; } } if(key4== 0){ delay(10); if(key4==0){ shi= 0; fen= 0; miao= 0; flag= 0; } if(!key4); } } void main() { shi= 0; fen= 0; miao= 0; ashi= 0; afen= 0; amiao= 0; flag= 0; s_flag= 0; buzzer= 0; //初值全部置零。 TMOD= 0X01; TH0= (65536-46082)/256; TL0= (65536-46082)%256; ET0=1; EA=1; TR0= 1; while(1) { display(); key(); } } 仿真图。请大神们看看问题在哪里,十分感谢!!! |