<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                【122.1 利用定時中斷做的“時分秒”數顯時鐘。】 ![](https://img.kancloud.cn/d1/98/d19803e327fa494dce4ab72902e02129_285x371.png) 上圖122.1.1 數碼管 ![](https://img.kancloud.cn/a2/3d/a23df87ac21f61d2182864f67461b009_359x103.png) 上圖122.1.2 獨立按鍵 ![](https://img.kancloud.cn/89/70/8970513a066fe0726b2997dcb0329ce0_194x190.png) 上圖122.1.3 有源蜂鳴器 本節的數顯時鐘小項目,意在人機界面程序框架的練習。程序功能如下: (1) 只有“時分秒”,沒有“年月日”。 (2) 平時時鐘正常工作的時候,四位數碼管的顯示格式是這樣的“HH.MM”,其中HH代表“時”,MM代表“分”,而中間的小數點“.”每隔一秒閃爍一次。 (3) K1[設置鍵]與[切換窗口鍵]。當數碼管“沒有閃爍”時(處于正常工作模式),“長按”K1鍵則進入“閃爍模式”(修改時鐘模式),“閃爍模式”一共有3個窗口,分別是“1-HH”,“2-MM”,“3-SS”。其中“HH”“MM”“SS”分別代表可修改的“時”“分”“秒”,它們處于“閃爍”的狀態,代表可編輯。此時,“短按”K1按鍵代表[切換窗口鍵],可以使數碼管在“1-HH”,“2-MM”,“3-SS”三個窗口之間依次切換。修改完畢后,只需“長按”K1鍵代表確定完成并且退出當前“閃爍模式”返回到時鐘的“正常工作模式”。 (4) K2[加鍵]。當數碼管某位正在閃爍時,此時K2是[加鍵],按K2會使數據“自加1”。 (5) K3[減鍵]。當數碼管某位正在閃爍時,此時K3是[減鍵],按K3會使數據“自減1”。 (6) 處于“閃爍模式”時的3個窗口的數據范圍。處于修改“時”的“1-HH”窗口時,HH的范圍是:0到23;處于修改“分”的“2-MM”窗口時,MM的范圍是:0到59;處于修改“秒”的“3-SS”窗口時,SS的范圍是:0到59。 代碼如下: \#include "REG52.H" \#define KEY\_FILTER\_TIME 25 \#define KEY\_LONG\_TIME 500 \#define SCAN\_TIME 1 \#define VOICE\_TIME 50 \#define BLINK\_TIME 250 void T0\_time(); void SystemInitial(void) ; void Delay(unsigned long u32DelayTime) ; void PeripheralInitial(void) ; void KeyScan(void); void KeyTask(void); void VoiceScan(void); void DisplayScan(void); void DisplayTask(void); void Wd1(void); //窗口1。時鐘正常工作的窗口“HH.MM”。小數點在閃爍跳動。 void Wd2(void); //窗口2。閃爍模式,修改“時”的“1-HH”的窗口。 void Wd3(void); //窗口3。閃爍模式,修改“分”的“2-MM”的窗口。 void Wd4(void); //窗口4。閃爍模式,修改“秒”的“3-SS”的窗口。 void BeepOpen(void); void BeepClose(void); sbit KEY\_INPUT1=P2^2; sbit KEY\_INPUT2=P2^1; sbit KEY\_INPUT3=P2^0; sbit P1\_0=P1^0; sbit P1\_1=P1^1; sbit P1\_2=P1^2; sbit P1\_3=P1^3; sbit P3\_4=P3^4; //數碼管轉換表 code unsigned char Cu8DigTable\[\]= { 0x3f, //0 序號0 0x06, //1 序號1 0x5b, //2 序號2 0x4f, //3 序號3 0x66, //4 序號4 0x6d, //5 序號5 0x7d, //6 序號6 0x07, //7 序號7 0x7f, //8 序號8 0x6f, //9 序號9 0x00, //不顯示 序號10 0x40, //橫杠- 序號11 }; volatile unsigned char vGu8ScanTimerFlag=0; volatile unsigned int vGu16ScanTimerCnt=0; volatile unsigned char vGu8BeepTimerFlag=0; volatile unsigned int vGu16BeepTimerCnt=0; volatile unsigned char vGu8BlinkTimerFlag=0; volatile unsigned int vGu16BlinkTimerCnt=0; //時鐘的軟件定時器,注意,這里是unsigned long類型,范圍是0到4294967295毫秒 volatile unsigned char vGu8ClockTimerFlag=0; volatile unsigned long vGu32ClockTimerCnt=0; //時鐘正常工作的時候,每500ms更新顯示一次 volatile unsigned char vGu8UpdateTimerFlag=0; volatile unsigned int vGu16UpdateTimerCnt=0; unsigned char Gu8EditData\_1=0; //是中間變量,用于編輯窗口“1-HH”下的HH數據。 unsigned char Gu8EditData\_2=0; //是中間變量,用于編輯窗口“2-MM”下的MM數據。 unsigned char Gu8EditData\_3=0; //是中間變量,用于編輯窗口“3-SS”下的SS數據。 unsigned char Gu8Wd=0; //窗口選擇變量。人機交互程序框架的支點。 unsigned char Gu8WdUpdate=0; //整屏更新變量。 unsigned char Gu8PartUpdate\_1=0; //局部1的更新變量, unsigned char Gu8PartUpdate\_2=0; //局部2的更新變量 unsigned char Gu8PartUpdate\_3=0; //局部3的更新變量, volatile unsigned char vGu8Display\_Righ\_4=0; volatile unsigned char vGu8Display\_Righ\_3=0; volatile unsigned char vGu8Display\_Righ\_2=0; volatile unsigned char vGu8Display\_Righ\_1=0; volatile unsigned char vGu8Display\_Righ\_Dot\_4=0; volatile unsigned char vGu8Display\_Righ\_Dot\_3=1; //開機默認保留顯示2個小數點 volatile unsigned char vGu8Display\_Righ\_Dot\_2=0; volatile unsigned char vGu8Display\_Righ\_Dot\_1=0; volatile unsigned char vGu8KeySec=0; void main() { SystemInitial(); Delay(10000); PeripheralInitial(); while(1) { KeyTask(); //按鍵的任務函數 DisplayTask(); //數碼管顯示的上層任務函數 } } void KeyTask(void) //按鍵的任務函數 { if(0==vGu8KeySec) { return; } switch(vGu8KeySec) { case 1: //按鍵K1的“短按”。在“閃爍模式”下切換數碼管的窗口。 switch(Gu8Wd) //在某個窗口下 { case 2: //窗口2。修改“時”的“1-HH”窗口。 Gu8Wd=3; //切換到窗口3的“2-MM”窗口 Gu8WdUpdate=1; //整屏更新 break; case 3: //窗口3。修改“分”的“2-MM”窗口。 Gu8Wd=4; //切換到窗口4的“3-SS”窗口 Gu8WdUpdate=1; //整屏更新 break; case 4: //窗口4。修改“秒”的“3-SS”窗口。 Gu8Wd=2; //切換到窗口2的“1-HH”窗口 Gu8WdUpdate=1; //整屏更新 break; } vGu8BeepTimerFlag=0; vGu16BeepTimerCnt=VOICE\_TIME; //蜂鳴器發出“滴”一聲 vGu8BeepTimerFlag=1; vGu8KeySec=0; break; case 2: //按鍵K2[加鍵] switch(Gu8Wd) //在某個窗口下 { case 2: //窗口2。修改“時”的“1-HH”窗口。 if(Gu8EditData\_1<23) //“時”的范圍是0到23 { Gu8EditData\_1++; } Gu8PartUpdate\_1=1; //局部1更新顯示 break; case 3: //窗口3。修改“分”的“2-MM”窗口。 if(Gu8EditData\_2<59) //“分”的范圍是0到59 { Gu8EditData\_2++; } Gu8PartUpdate\_1=1; //局部1更新顯示 break; case 4: //窗口4。修改“秒”的“3-SS”窗口。 if(Gu8EditData\_3<59) //“秒”的范圍是0到59 { Gu8EditData\_3++; } Gu8PartUpdate\_1=1; //局部1更新顯示 break; } vGu8BeepTimerFlag=0; vGu16BeepTimerCnt=VOICE\_TIME; //蜂鳴器發出“滴”一聲 vGu8BeepTimerFlag=1; vGu8KeySec=0; break; case 3: //按鍵K3[減鍵]與[開始健] switch(Gu8Wd) //在某個窗口下 { case 2: //窗口2。修改“時”的“1-HH”窗口。 if(Gu8EditData\_1>0) { Gu8EditData\_1--; } Gu8PartUpdate\_1=1; //局部1更新顯示 break; case 3: //窗口3。修改“分”的“2-MM”窗口。 if(Gu8EditData\_2>0) { Gu8EditData\_2--; } Gu8PartUpdate\_1=1; //局部1更新顯示 break; case 4: //窗口4。修改“秒”的“3-SS”窗口。 if(Gu8EditData\_3>0) { Gu8EditData\_3--; } Gu8PartUpdate\_1=1; //局部1更新顯示 break; } vGu8BeepTimerFlag=0; vGu16BeepTimerCnt=VOICE\_TIME; //蜂鳴器發出“滴”一聲 vGu8BeepTimerFlag=1; vGu8KeySec=0; break; case 4: //K1按鍵的“長按”,具有進入和退出“閃爍模式”的功能。“退出”隱含“確定” switch(Gu8Wd) //在某個窗口下 { case 1: //窗口1。時鐘正常工作的窗口。 vGu8ClockTimerFlag=0; //停止時鐘的定時器 Gu8EditData\_1=vGu32ClockTimerCnt/3600000; //分解成“時”個體 Gu8EditData\_2=vGu32ClockTimerCnt%3600000/60000; //分解成“分”個體 Gu8EditData\_3=vGu32ClockTimerCnt%3600000%60000/1000; //分解成“秒”個體 Gu8Wd=2; //切換到窗口2的“1-HH”的閃爍窗口 Gu8WdUpdate=1; //整屏更新 break; case 2: //窗口2。修改時鐘時間的“1-HH”的閃爍窗口 case 3: //窗口3。修改時鐘時間的“2-MM”的閃爍窗口 case 4: //窗口4。修改時鐘時間的“3-SS”的閃爍窗口 //把個體合并還原成當前時鐘時間的數據 vGu32ClockTimerCnt=Gu8EditData\_1\*3600000+Gu8EditData\_2\*60000+Gu8EditData\_3\*1000; vGu8ClockTimerFlag=1; //啟動時鐘的定時器 Gu8Wd=1; //切換到窗口1的正常工作的窗口 Gu8WdUpdate=1; //整屏更新 break; } vGu8BeepTimerFlag=0; vGu16BeepTimerCnt=VOICE\_TIME; //蜂鳴器發出“滴”一聲 vGu8BeepTimerFlag=1; vGu8KeySec=0; break; } } void DisplayTask(void) //數碼管顯示的上層任務函數 { switch(Gu8Wd) //以窗口選擇Gu8Wd為支點,去執行對應的窗口顯示函數。又一次用到switch語句 { case 1: Wd1(); //窗口1。時鐘正常運行的窗口 break; case 2: Wd2(); //窗口2。修改“時”的“1-HH”窗口 break; case 3: Wd3(); //窗口3。修改“分”的“2-MM”窗口 break; case 4: Wd4(); //窗口4。修改“秒”的“3-SS”窗口 break; } } void Wd1(void) //窗口1。時鐘正常運行的窗口 { //需要借用的中間變量,用來拆分數據位。 static unsigned char Su8Temp\_4,Su8Temp\_3,Su8Temp\_2,Su8Temp\_1; //需要借用的中間變量 static unsigned char Su8BlinkFlag=0; //兩種狀態的切換判斷的中間變量 if(1==Gu8WdUpdate) //如果需要整屏更新 { Gu8WdUpdate=0; //及時清零,只更新一次顯示即可,避免一直進來更新顯示 //屬于靜態數據,起“裝飾”作用,切換窗口后只掃描一次的代碼。 vGu8Display\_Righ\_Dot\_4=0; vGu8Display\_Righ\_Dot\_3=1; //保留顯示2位小數點 vGu8Display\_Righ\_Dot\_2=0; vGu8Display\_Righ\_Dot\_1=0; Gu8PartUpdate\_1=1; //局部1更新顯示 } if(1==Gu8PartUpdate\_1) //局部1更新顯示,更新顯示一次數據和閃爍的的小數點 { Gu8PartUpdate\_1=0; //及時清零,只更新一次顯示即可,避免一直進來更新顯示 Su8Temp\_4=vGu32ClockTimerCnt/3600000/10; //時的十位 Su8Temp\_3=vGu32ClockTimerCnt/3600000%10; //時的個位 Su8Temp\_2=vGu32ClockTimerCnt%3600000/60000/10; //分的十位 Su8Temp\_1=vGu32ClockTimerCnt%3600000/60000%10; //秒的個位 //小數點的閃爍 if(0==Su8BlinkFlag) { Su8BlinkFlag=1; vGu8Display\_Righ\_Dot\_3=1; //顯示第2位小數點。 } else { Su8BlinkFlag=0; vGu8Display\_Righ\_Dot\_3=0; //不顯示第2位小數點 } vGu8Display\_Righ\_4=Su8Temp\_4; //過渡需要顯示的數據到底層驅動變量 vGu8Display\_Righ\_3=Su8Temp\_3; //過渡需要顯示的數據到底層驅動變量 vGu8Display\_Righ\_2=Su8Temp\_2; //過渡需要顯示的數據到底層驅動變量 vGu8Display\_Righ\_1=Su8Temp\_1; //過渡需要顯示的數據到底層驅動變量 } if(0==vGu16UpdateTimerCnt) //每隔500ms就更新顯示一次數據和閃爍的的小數點 { vGu8UpdateTimerFlag=0; vGu16UpdateTimerCnt=500; //重設定時器的定時時間 vGu8UpdateTimerFlag=1; Gu8PartUpdate\_1=1; //局部1更新顯示 } } void Wd2(void) //窗口2。修改“時”的“1-HH”窗口。 { //需要借用的中間變量,用來拆分數據位。 static unsigned char Su8Temp\_2,Su8Temp\_1; //需要借用的中間變量 static unsigned char Su8BlinkFlag=0; //兩種狀態的切換判斷的中間變量 if(1==Gu8WdUpdate) //如果需要整屏更新 { Gu8WdUpdate=0; //及時清零,只更新一次顯示即可,避免一直進來更新顯示 //屬于靜態數據,起“裝飾”作用,切換窗口后只掃描一次的代碼。 vGu8Display\_Righ\_4=1; //顯示數字“1” vGu8Display\_Righ\_3=11; //顯示橫杠“-” vGu8Display\_Righ\_Dot\_4=0; vGu8Display\_Righ\_Dot\_3=0; vGu8Display\_Righ\_Dot\_2=0; vGu8Display\_Righ\_Dot\_1=0; Gu8PartUpdate\_1=1; //局部1更新顯示 } if(1==Gu8PartUpdate\_1) //局部1更新顯示 { Gu8PartUpdate\_1=0; //及時清零,只更新一次顯示即可,避免一直進來更新顯示 Su8Temp\_2=Gu8EditData\_1/10; //顯示“時”的十位 Su8Temp\_1=Gu8EditData\_1%10; //顯示“時”的個位 vGu8Display\_Righ\_2=Su8Temp\_2; //過渡需要顯示的數據到底層驅動變量 vGu8Display\_Righ\_1=Su8Temp\_1; //過渡需要顯示的數據到底層驅動變量 } if(0==vGu16BlinkTimerCnt) //某位被選中的數碼管跳動閃爍的定時器 { vGu8BlinkTimerFlag=0; vGu16BlinkTimerCnt=BLINK\_TIME; //重設定時器的定時時間 vGu8BlinkTimerFlag=1; if(0==Su8BlinkFlag) //兩種狀態的切換判斷 { Su8BlinkFlag=1; Su8Temp\_2=10; //10代表不顯示 Su8Temp\_1=10; //10代表不顯示 } else { Su8BlinkFlag=0; Su8Temp\_2=Gu8EditData\_1/10; //顯示“時”的十位 Su8Temp\_1=Gu8EditData\_1%10; //顯示“時”的個位 } vGu8Display\_Righ\_2=Su8Temp\_2; //過渡需要顯示的數據到底層驅動變量 vGu8Display\_Righ\_1=Su8Temp\_1; //過渡需要顯示的數據到底層驅動變量 } } void Wd3(void) //窗口3。修改“分”的“2-MM”窗口。 { //需要借用的中間變量,用來拆分數據位。 static unsigned char Su8Temp\_2,Su8Temp\_1; //需要借用的中間變量 static unsigned char Su8BlinkFlag=0; //兩種狀態的切換判斷的中間變量 if(1==Gu8WdUpdate) //如果需要整屏更新 { Gu8WdUpdate=0; //及時清零,只更新一次顯示即可,避免一直進來更新顯示 //屬于靜態數據,起“裝飾”作用,切換窗口后只掃描一次的代碼。 vGu8Display\_Righ\_4=2; //顯示數字“2” vGu8Display\_Righ\_3=11; //顯示橫杠“-” vGu8Display\_Righ\_Dot\_4=0; vGu8Display\_Righ\_Dot\_3=0; vGu8Display\_Righ\_Dot\_2=0; vGu8Display\_Righ\_Dot\_1=0; Gu8PartUpdate\_1=1; //局部1更新顯示 } if(1==Gu8PartUpdate\_1) //局部1更新顯示 { Gu8PartUpdate\_1=0; //及時清零,只更新一次顯示即可,避免一直進來更新顯示 Su8Temp\_2=Gu8EditData\_2/10; //顯示“分”的十位 Su8Temp\_1=Gu8EditData\_2%10; //顯示“分”的個位 vGu8Display\_Righ\_2=Su8Temp\_2; //過渡需要顯示的數據到底層驅動變量 vGu8Display\_Righ\_1=Su8Temp\_1; //過渡需要顯示的數據到底層驅動變量 } if(0==vGu16BlinkTimerCnt) //某位被選中的數碼管跳動閃爍的定時器 { vGu8BlinkTimerFlag=0; vGu16BlinkTimerCnt=BLINK\_TIME; //重設定時器的定時時間 vGu8BlinkTimerFlag=1; if(0==Su8BlinkFlag) //兩種狀態的切換判斷 { Su8BlinkFlag=1; Su8Temp\_2=10; //10代表不顯示 Su8Temp\_1=10; //10代表不顯示 } else { Su8BlinkFlag=0; Su8Temp\_2=Gu8EditData\_2/10; //顯示“分”的十位 Su8Temp\_1=Gu8EditData\_2%10; //顯示“分”的個位 } vGu8Display\_Righ\_2=Su8Temp\_2; //過渡需要顯示的數據到底層驅動變量 vGu8Display\_Righ\_1=Su8Temp\_1; //過渡需要顯示的數據到底層驅動變量 } } void Wd4(void) //窗口4。修改“秒”的“3-SS”窗口。 { //需要借用的中間變量,用來拆分數據位。 static unsigned char Su8Temp\_2,Su8Temp\_1; //需要借用的中間變量 static unsigned char Su8BlinkFlag=0; //兩種狀態的切換判斷的中間變量 if(1==Gu8WdUpdate) //如果需要整屏更新 { Gu8WdUpdate=0; //及時清零,只更新一次顯示即可,避免一直進來更新顯示 //屬于靜態數據,起“裝飾”作用,切換窗口后只掃描一次的代碼。 vGu8Display\_Righ\_4=3; //顯示數字“3” vGu8Display\_Righ\_3=11; //顯示橫杠“-” vGu8Display\_Righ\_Dot\_4=0; vGu8Display\_Righ\_Dot\_3=0; vGu8Display\_Righ\_Dot\_2=0; vGu8Display\_Righ\_Dot\_1=0; Gu8PartUpdate\_1=1; //局部1更新顯示 } if(1==Gu8PartUpdate\_1) //局部1更新顯示 { Gu8PartUpdate\_1=0; //及時清零,只更新一次顯示即可,避免一直進來更新顯示 Su8Temp\_2=Gu8EditData\_3/10; //顯示“秒”的十位 Su8Temp\_1=Gu8EditData\_3%10; //顯示“秒”的個位 vGu8Display\_Righ\_2=Su8Temp\_2; //過渡需要顯示的數據到底層驅動變量 vGu8Display\_Righ\_1=Su8Temp\_1; //過渡需要顯示的數據到底層驅動變量 } if(0==vGu16BlinkTimerCnt) //某位被選中的數碼管跳動閃爍的定時器 { vGu8BlinkTimerFlag=0; vGu16BlinkTimerCnt=BLINK\_TIME; //重設定時器的定時時間 vGu8BlinkTimerFlag=1; if(0==Su8BlinkFlag) //兩種狀態的切換判斷 { Su8BlinkFlag=1; Su8Temp\_2=10; //10代表不顯示 Su8Temp\_1=10; //10代表不顯示 } else { Su8BlinkFlag=0; Su8Temp\_2=Gu8EditData\_3/10; //顯示“秒”的十位 Su8Temp\_1=Gu8EditData\_3%10; //顯示“秒”的個位 } vGu8Display\_Righ\_2=Su8Temp\_2; //過渡需要顯示的數據到底層驅動變量 vGu8Display\_Righ\_1=Su8Temp\_1; //過渡需要顯示的數據到底層驅動變量 } } void KeyScan(void) //按鍵底層的驅動掃描函數,放在定時中斷函數里 { static unsigned char Su8KeyShortFlag=0; //按鍵“短按”觸發的標志 static unsigned char Su8KeyLock1; static unsigned int Su16KeyCnt1; static unsigned char Su8KeyLock2; static unsigned int Su16KeyCnt2; static unsigned char Su8KeyLock3; static unsigned int Su16KeyCnt3; //需要詳細分析以下這段“短按”與“長按”代碼的朋友,請參考第96節。 if(0!=KEY\_INPUT1) { Su8KeyLock1=0; Su16KeyCnt1=0; if(1==Su8KeyShortFlag) { Su8KeyShortFlag=0; vGu8KeySec=1; //觸發K1的“短按” } } else if(0==Su8KeyLock1) { Su16KeyCnt1++; if(Su16KeyCnt1>=KEY\_FILTER\_TIME) { Su8KeyShortFlag=1; } if(Su16KeyCnt1>=KEY\_LONG\_TIME) { Su8KeyLock1=1; Su8KeyShortFlag=0; vGu8KeySec=4; //觸發K1的“長按” } } if(0!=KEY\_INPUT2) { Su8KeyLock2=0; Su16KeyCnt2=0; } else if(0==Su8KeyLock2) { Su16KeyCnt2++; if(Su16KeyCnt2>=KEY\_FILTER\_TIME) { Su8KeyLock2=1; vGu8KeySec=2; } } if(0!=KEY\_INPUT3) { Su8KeyLock3=0; Su16KeyCnt3=0; } else if(0==Su8KeyLock3) { Su16KeyCnt3++; if(Su16KeyCnt3>=KEY\_FILTER\_TIME) { Su8KeyLock3=1; vGu8KeySec=3; } } } void DisplayScan(void) //數碼管底層的驅動掃描函數,放在定時中斷函數里 { static unsigned char Su8GetCode; static unsigned char Su8ScanStep=1; if(0==vGu16ScanTimerCnt) { P0=0x00; P1\_0=1; P1\_1=1; P1\_2=1; P1\_3=1; switch(Su8ScanStep) { case 1: Su8GetCode=Cu8DigTable\[vGu8Display\_Righ\_1\]; if(1==vGu8Display\_Righ\_Dot\_1) { Su8GetCode=Su8GetCode|0x80; } P0=Su8GetCode; P1\_0=0; P1\_1=1; P1\_2=1; P1\_3=1; break; case 2: Su8GetCode=Cu8DigTable\[vGu8Display\_Righ\_2\]; if(1==vGu8Display\_Righ\_Dot\_2) { Su8GetCode=Su8GetCode|0x80; } P0=Su8GetCode; P1\_0=1; P1\_1=0; P1\_2=1; P1\_3=1; break; case 3: Su8GetCode=Cu8DigTable\[vGu8Display\_Righ\_3\]; if(1==vGu8Display\_Righ\_Dot\_3) { Su8GetCode=Su8GetCode|0x80; } P0=Su8GetCode; P1\_0=1; P1\_1=1; P1\_2=0; P1\_3=1; break; case 4: Su8GetCode=Cu8DigTable\[vGu8Display\_Righ\_4\]; if(1==vGu8Display\_Righ\_Dot\_4) { Su8GetCode=Su8GetCode|0x80; } P0=Su8GetCode; P1\_0=1; P1\_1=1; P1\_2=1; P1\_3=0; break; } Su8ScanStep++; if(Su8ScanStep>4) { Su8ScanStep=1; } vGu8ScanTimerFlag=0; vGu16ScanTimerCnt=SCAN\_TIME; vGu8ScanTimerFlag=1; } } void VoiceScan(void) //蜂鳴器的驅動函數 { static unsigned char Su8Lock=0; if(1==vGu8BeepTimerFlag&&vGu16BeepTimerCnt>0) { if(0==Su8Lock) { Su8Lock=1; BeepOpen(); } else { vGu16BeepTimerCnt--; if(0==vGu16BeepTimerCnt) { Su8Lock=0; BeepClose(); } } } } void BeepOpen(void) { P3\_4=0; } void BeepClose(void) { P3\_4=1; } void T0\_time() interrupt 1 { VoiceScan(); //蜂鳴器的驅動函數 KeyScan(); //按鍵底層的驅動掃描函數 DisplayScan(); //數碼管底層的驅動掃描函數 if(1==vGu8ScanTimerFlag&&vGu16ScanTimerCnt>0) { vGu16ScanTimerCnt--; //遞減式的軟件定時器 } if(1==vGu8BlinkTimerFlag&&vGu16BlinkTimerCnt>0) //數碼管閃爍跳動的定時器 { vGu16BlinkTimerCnt--; //遞減式的軟件定時器 } //在正常工作的窗口下,每500ms就定時更新一次顯示的軟件定時器 if(1==vGu8UpdateTimerFlag&&vGu16UpdateTimerCnt>0) { vGu16UpdateTimerCnt--; //遞減式的軟件定時器 } //時鐘實際走的時間的軟件定時器,注意,這里是遞增式的軟件定時器 if(1==vGu8ClockTimerFlag) { vGu32ClockTimerCnt++; //遞增式的軟件定時器 if(vGu32ClockTimerCnt>=86400000) //86400000毫秒代表24時 { vGu32ClockTimerCnt=0; } } TH0=0xfd; //此參數可根據具體的時間來修改,盡量確保每定時中斷一次接近1ms TL0=0x40; //此參數可根據具體的時間來修改,盡量確保每定時中斷一次接近1ms } void SystemInitial(void) { P0=0x00; P1\_0=1; P1\_1=1; P1\_2=1; P1\_3=1; TMOD=0x01; TH0=0xfd; //此參數可根據具體的時間來修改,盡量確保每定時中斷一次接近1ms TL0=0x40; //此參數可根據具體的時間來修改,盡量確保每定時中斷一次接近1ms EA=1; ET0=1; TR0=1; //上電初始化一些關鍵的數據 Gu8Wd=1; //窗口1。開機默認處于正常工作的窗口 Gu8WdUpdate=1; //整屏更新變量 vGu8ClockTimerFlag=0; vGu32ClockTimerCnt=43200000; //43200000毫秒開機默認12:00點。12時就是43200000毫秒 vGu8ClockTimerFlag=1; //啟動時鐘的定時器 //時鐘正常工作的時候,每500ms更新顯示一次 vGu16UpdateTimerCnt=500; vGu8UpdateTimerFlag=1; //啟動小數點閃爍的定時器 } void Delay(unsigned long u32DelayTime) { for(;u32DelayTime>0;u32DelayTime--); } void PeripheralInitial(void) { }
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看