初學51,經過在網上找程式改來實作的,數碼管用的動態掃描方式,沒有用38譯碼器,程式如下
#include <reg52.h> sbit HourAdjust = P1^0; //時調整鍵 sbit MinuteAdjust = P1^1; //分調整鍵 sbit SecondAdjust = P1^2; //秒調整鍵 sbit Adjust = P1^3; //調整鍵 bit SecondFlag = 0; //秒標志 bit FlashFlag = 0; //秒閃標志 bit Second10Flag = 0; //10秒標志 bit HourAdjustFlag = 0; //時調整標志 bit MinuteAdjustFlag = 0; //分調整標志0 bit SecondAdjustFlag = 0; //秒調整標志 unsigned char Led1,Led2,Led3,Led4,Led5,Led6; int TimeCount,Second10Count; unsigned char code LedTab[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; void Delay100us(int Times); void timer() interrupt 3 using 2 { TR1 = 0; TL1 = 0x13; TH1 = 0x2C; //重新賦值 P0 = 0x00; //顯示小時 P2 = 0xfe; P0 = LedTab[Led1]; Delay100us(1); P0 = 0x00; P2 = 0xfd; if(FlashFlag) //秒顯(1秒顯,1秒隱) P0 = LedTab[Led2] | 0x80; else P0 = LedTab[Led2] & 0x7f; Delay100us(1); P0 = 0x00; //顯示分 P2 = 0xfb; P0 = LedTab[Led3]; Delay100us(1); P0 = 0x00; P2 = 0xf7; if(FlashFlag) //秒顯秒前小數點 P0 = LedTab[Led4] | 0x80; else P0 = LedTab[Led4] & 0x7f; Delay100us(1); P0 = 0x00; //顯示秒 P2 = 0xef; P0 = LedTab[Led5]; Delay100us(1); P0 = 0x00; P2 = 0xdf; P0 = LedTab[Led6]; Delay100us(1); TR1 = 1; if(TimeCount < 150) //秒計數器 TimeCount++; else { TimeCount = 0x00; SecondFlag = 1; //置位秒標志 if(Second10Flag) //10秒計數器 if(Second10Count < 20) Second10Count++; else { Second10Count = 0x00; //10秒計數器清0 Second10Flag = 0; //清除10s標志 HourAdjustFlag = 0; //清除調整標志位 MinuteAdjustFlag = 0; SecondAdjustFlag = 0; } } } //============================================================================ main(void) { int Second = 30; //初始化時間 int Minute = 00; int Hour = 12; Led1 = 0x00; Led2 = 0x00; Led3 = 0x00; Led4 = 0x00; Led5 = 0x00; Led6 = 0x00; SecondFlag = 0; TimeCount = 0x00; PCON&=0x7F; TMOD = 0x10f; TL1 = 0x13; TH1 = 0x2C; EA = 1; //開總中斷 TF1 = 0; ET1 = 1; //開定時器中斷 TR1 = 1; //開始計時 while(1) { //對時間進行調整程式 if(SecondFlag) { if(Second%2 == 0) FlashFlag = 1; else FlashFlag = 0; if(Second < 59) Second++; else { if(Minute < 59) Minute++; else { if(Hour < 23) Hour++; else Hour = 0; Minute = 0; } Second = 0; } SecondFlag = 0; } //時間調整程式 if(HourAdjustFlag) //調整時程式 if(Second10Flag) if(FlashFlag) //時秒顯 { Led1 = 0x0a; //時隱 Led2 = 0x0a; } else { Led1 = Hour/10; //時顯 Led2 = Hour%10; } else { Led1 = Hour/10; Led2 = Hour%10; } else { Led1 = Hour/10; Led2 = Hour%10; } if(MinuteAdjustFlag) //調整分程式 if(Second10Flag) if(FlashFlag) //分秒顯 { Led3 = 0x0a; Led4 = 0x0a; } else { Led3 = Minute/10; Led4 = Minute%10; } else { Led3 = Minute/10; Led4 = Minute%10; } else { Led3 = Minute/10; Led4 = Minute%10; } if(SecondAdjustFlag) //調整秒程式,控制秒顯 if(Second10Flag) if(FlashFlag) { Led5 = 0x0a; Led6 = 0x0a; } else { Led5 = Second/10; Led6 = Second%10; } else { Led5 = Second/10; Led6 = Second%10; } else { Led5 = Second/10; Led6 = Second%10; } if(!HourAdjust) //時調整按鍵按下 { while(!HourAdjust); //等待松開 HourAdjustFlag = 1; //置位時標志 MinuteAdjustFlag = 0; //清除分標志 SecondAdjustFlag = 0; //清除秒標志 Second10Flag = 1; //置位10秒標志 } if(!MinuteAdjust) //分調整鍵按下 { while(!MinuteAdjust); MinuteAdjustFlag = 1; HourAdjustFlag = 0; SecondAdjustFlag = 0; Second10Flag = 1; } if(!SecondAdjust) //秒調整鍵按下 { while(!SecondAdjust); SecondAdjustFlag = 1; HourAdjustFlag = 0; MinuteAdjustFlag = 0; Second10Flag = 1; } if(!Adjust) //調整鍵按下 { while(!Adjust); if(HourAdjustFlag) //調整時,加1 if(Hour < 23) { Hour++; Second10Count = 0; } else Hour = 0; if(MinuteAdjustFlag) //調整分,加1 if(Minute < 59) { Minute++; Second10Count = 0; } else //調整秒,清零 Minute = 0; if(SecondAdjustFlag) Second = 0; } } } void Delay100us(int Times) { Times = Times * 100; while(Times--); } void init(void) { RCAP2H=0x1F; RCAP2L=0x00; ET2=1; TR2=1; EA=1; }
uj5u.com熱心網友回復:
看許久沒人回復你,這個給你參考,不懂再問,暫停功能可隨處呼叫,在需要清零某值時,也可設定BIT變數數個控制.https://blog.csdn.net/xianfajushi/article/details/89448933轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/74212.html
標籤:單片機/工控
上一篇:cortex M0權威指南
