以下是代碼和思路 #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--); } //顯示函數(shù) 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); } //根據(jù)flag值來顯示: flag=0,正常時鐘。 Flag=1,時鐘秒調(diào)整。 Flag=2,時鐘分調(diào)整。 Flag=3,時鐘時調(diào)整。 Flag=4,鬧鐘秒調(diào)整。 Flag=5,鬧鐘分調(diào)整。 Flag=6,鬧鐘時調(diào)整。 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:分調(diào)整; Flag=3:時調(diào)整; Flag=4:鬧鐘秒調(diào)整; 依次往后; 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(); } }
360桌面截圖20190516182238.jpg (296.5 KB, 下載次數(shù): 29)
下載附件
2019-5-16 18:24 上傳
仿真圖。請大神們看看問題在哪里,十分感謝。! |