![]() |
發(fā)布時間: 2020-8-1 21:13
正文摘要:按鍵調(diào)節(jié)時間。可是不管用。還有數(shù)碼管閃爍不停;;;;;求指教 #include<reg52.h> #define uint unsigned int #define uchar unsigned char uchar code table[11]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, ... |
1 、此款電子時鐘,時間可以設(shè)置,有4個按鍵,一個功能按鍵,一個加,一個減,一個確定按鍵。 2、按下功能按鍵一下,時鐘走時停止,時兩位數(shù)碼管閃爍,代表此時再調(diào)時狀態(tài),這個時候加減按鍵就可以調(diào)整時鐘,再次按下功能按鍵,就可以調(diào)整分鐘,再按一下功能按鍵就可以設(shè)置秒。設(shè)置好時間后我們按確定按鍵,時鐘開始走時。 3、這個程序?qū)⒑芎玫慕虝覀冊趺醋寯?shù)碼管閃爍顯示。 #include <REG51.H> typedef unsigned int UINT; typedef unsigned char UCHAR ; sbit key1=P3^3; sbit key2=P3^4; sbit key3=P3^5; sbit key6=P3^6; sbit LE1 = P3^1; //定義位控口 sbit LE2 = P3^2; //定義段控口 UCHAR MODE ; UCHAR page ; signed char HH = 0; //小時初始值 signed char MM = 0; //分鐘初始值 signed char SS = 0; //秒初始值 UINT u1_10ms = 0; //10ms計數(shù) UINT u2_10ms = 0; bit T_CYCLE = 0; extern void T0_Init(void); //初始化定時器,函數(shù)定義在timer.c UCHAR code NUM[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; void delay(UINT t) //延時t時鐘周期 { while (t--) ; } void H_Increase(void) //小時增1 { IF(HH<23) HH++; else { HH = 0; } } void M_Increase(void) //分鐘增1 { if(MM<59) MM++; else { MM = 0; } } void S_Increase(void) //秒增1 { if(SS<59) SS++; else { SS = 0; } } void H(void) //小時增1 { if(HH>0) HH--; else { HH =23; } } void M(void) //分鐘增1 { if(MM>0) MM--; else { MM = 59; } } void S(void) //秒增1 { if(SS>0) SS--; else { SS = 59; } } void display(UCHAR SEG,UCHAR Digi) //顯示一位數(shù)碼管,SEG = 0-9數(shù)字,Digi = 第0-6位 { LE2 = 1; P0 = (0x01<<Digi) ; LE2 = 0; P0 = 0x00; LE1 = 1; P0 = NUM[SEG]; if (Digi==1||Digi==4) P1&= 0x7f ; //顯示分隔符 delay(50); P0 = 0xff; LE1 = 0; } void key() { if(key1==0) { delay(2); if(key1==0) { while(!key1); TR0=0; if(MODE == 3) MODE = 1; else MODE ++; } } if(key2==0) { delay(2); if(key2==0) { while(!key2); if(MODE == 1) H_Increase() ; if(MODE == 2) M_Increase() ; if(MODE == 3) S_Increase() ; } } if(key3==0) { delay(2); if(key3==0) { while(!key3); if(MODE == 1) H() ; if(MODE == 2) M() ; if(MODE == 3) S() ; } } if(key6==0) { delay(2); if(key6==0) { while(!key6); TR0=1; MODE=0; } } } void main(void) { P1 = 0xff; LE1 = 0; LE2 = 0; T0_Init(); while(1) { key(); if(MODE != 1 || T_CYCLE) { display(HH/10,0); //顯示小時十位數(shù) display(HH%10,1); //顯示小時個位數(shù) display(10,2); } if(MODE != 2 || T_CYCLE) { display(MM/10,3); //顯示分鐘十位數(shù) display(MM%10,4); //顯示分鐘個位數(shù) display(10,5); //顯示小時個位數(shù) } if(MODE != 3 || T_CYCLE) { display(SS/10,6); //顯示秒十位數(shù) display(SS%10,7); //顯示秒個位數(shù) } } } extern void key_Process(void); extern void S_Increase(void); void T0_Init(void) { TMOD = 0x11; //定時器賦初始值,定時時間為10ms。 TH0 = 0xd8; TL0 = 0xf0; TH1 = 0xd8; TL1= 0xf0; ET0=1; ET1=1; TR0=1; TR1=1; EA=1; } void T0_INTSrv(void) interrupt 1 { //定時器重新開始計時。 TH0 = 0xd8; TL0 = 0xf0; u1_10ms ++; if (u1_10ms>99) // 1000 ms = 1 second { u1_10ms = 0; SS++; if(SS==60) { SS=0; MM++; if(MM==60) { MM=0; HH++; if(HH==24) HH=0; } } } } void T1_INTSrv(void) interrupt 3 { //定時器重新開始計時。 TH0 = 0xd8; TL0 = 0xf0; u2_10ms ++; if (u2_10ms%10==0) // 100 ms { T_CYCLE = ! T_CYCLE; //閃爍循環(huán) } } |
k9702 發(fā)表于 2020-8-3 11:00 菜鳥剛起步。。。。 多謝指點哈。下次寫上注釋; |
謝謝大佬。。。。。 |
樓主你寫代碼要習(xí)慣寫注釋啊,這樣不論是發(fā)出來分享還是自己查錯的時候都容易讓人讀懂 |
xianfajushi 發(fā)表于 2020-8-2 06:48 自己都看不下去了。。。 所以換成設(shè)置6個按鍵的了;那樣就行了; 這個還不太會寫;;還是要參考別人的代碼仿寫一下 |
![]() |
給你改好了![]() ![]() |
判斷亂嵌套邏輯也就亂了,從代碼看不是單獨按鍵了,而是2個按鍵同時按下才起作用,閃爍可調(diào)節(jié)延時少點。 |
Powered by 單片機教程網(wǎng)