<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之旅 廣告
                【120.1 按鍵切換窗口切換局部來設置參數。】 ![](https://img.kancloud.cn/d1/98/d19803e327fa494dce4ab72902e02129_285x371.png) 上圖120.1.1 數碼管 ![](https://img.kancloud.cn/a2/3d/a23df87ac21f61d2182864f67461b009_359x103.png) 上圖120.1.2 獨立按鍵 ![](https://img.kancloud.cn/89/70/8970513a066fe0726b2997dcb0329ce0_194x190.png) 上圖120.1.3 有源蜂鳴器 為了更好理解上一節提出的人機界面程序框架的脈絡,本節程序恰好包含了整屏更新與局部更新的應用,同時也引入了一個新的知識點:在人機界面的程序框架中,常常會遇到需要以“位”來編輯某個數據的情況,這種情況實際上是先把“待編輯數據”分解成幾個“位”中間臨時個體,然后顯示并且編輯這些“位”中間臨時個體,編輯結束后,再把這些“位”中間臨時個體合并成一個完整的數據賦值給“待編輯數據”。 本節程序功能如下: (1)有3個窗口1-XX,2-YY,3-ZZ,其中XX,YY,ZZ分別代表3個可編輯的數據Gu8SetDate\_1,Gu8SetDate\_2,Gu8SetDate\_3。數據范圍是從0到99。 (2)K1按鍵。含“短按”與“長按”復合雙功能。當數碼管“沒有閃爍”時,“短按”K1按鍵可以切換窗口,而“長按”K1按鍵會使數碼管從“沒有閃爍”進入到“閃爍模式”。當數碼管處于“閃爍模式”時,“短按”K1可以使數碼管在十位和個位之間切換“閃爍”的“局部位”,而“長按”K1表示更改完畢當前窗口數據并從“閃爍模式”退出到“沒有閃爍”。 (3)K2按鍵。當數碼管處于“閃爍模式”時,每按一次K2按鍵就可以使當前閃爍的某位數碼管“遞增1”。 (4)K3按鍵。當數碼管處于“閃爍模式”時,每按一次K2按鍵就可以使當前閃爍的某位數碼管“遞減1”。 上述功能,在窗口切換和退出“閃爍模式”時用到整屏更新,在閃爍的某位數碼管切換“局部”時用到局部更新。代碼如下: \#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顯示函數 void Wd2(void); //窗口2顯示函數 void Wd3(void); //窗口3顯示函數 void PartUpdate(unsigned char u8Part); //局部選擇對應的某個局部變量更新顯示輸出 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 char Gu8SetData\_3=0; //單片機內部第3個可編輯的參數,在窗口3 unsigned char Gu8SetData\_2=0; //單片機內部第2個可編輯的參數,在窗口2 unsigned char Gu8SetData\_1=0; //單片機內部第1個可編輯的參數,在窗口1 /\* 注釋一: \* 在人機界面的程序框架中,常常會遇到需要以“位”來編輯某個數據的情況,這種情況 \* 實際上是先把“待編輯數據”分解成幾個“位”臨時中間個體,然后顯示并且編輯這些“位” \* 臨時中間個體,編輯結束后,再把這些“位”臨時中間個體合并成一個完整的數據賦值給 \* “待編輯數據”。以下Gu8EditData\_2和Gu8EditData\_1就是“位”臨時中間個體的中間變量。 \*/ unsigned char Gu8EditData\_2=0; //對應顯示左起第3位數碼管的“位”數據,是中間變量。 unsigned char Gu8EditData\_1=0; //對應顯示左起第4位數碼管的“位”數據,是中間變量。 unsigned char Gu8Wd=1; //窗口選擇變量。人機交互程序框架的支點。初始化開機后顯示第1個窗口。 unsigned char Gu8WdUpdate=1; //整屏更新變量。初始化為1開機后整屏更新一次顯示。 unsigned char Gu8Part=0; //局部選擇變量。0代表當前窗口下沒有數據被選中。 unsigned char Gu8PartUpdate\_1=0; //局部1的更新變量, unsigned char Gu8PartUpdate\_2=0; //局部2的更新變量 volatile unsigned char vGu8Display\_Righ\_4=1; //左起第1位初始化顯示窗口“1” volatile unsigned char vGu8Display\_Righ\_3=11; //左起第2位初始化顯示橫杠“-” volatile unsigned char vGu8Display\_Righ\_2=0; //左起第3位初始化顯示數值“0” volatile unsigned char vGu8Display\_Righ\_1=0; //左起第4位初始化顯示數值“0” //不顯示小數點 volatile unsigned char vGu8Display\_Righ\_Dot\_4=0; volatile unsigned char vGu8Display\_Righ\_Dot\_3=0; 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 PartUpdate(unsigned char u8Part) //局部選擇對應的某個局部變量更新顯示輸出 { switch(u8Part) { case 1: Gu8PartUpdate\_1=1; break; case 2: Gu8PartUpdate\_2=1; break; } } void KeyTask(void) //按鍵的任務函數 { if(0==vGu8KeySec) { return; } switch(vGu8KeySec) { case 1: //K1按鍵的“短按”,具有“切換窗口”和“切換局部”的雙功能。 if(0==Gu8Part) //處于“沒有閃爍”的時候,是“切換窗口” { switch(Gu8Wd) //在某個窗口下 { case 1: //在窗口1下 Gu8Wd=2; //切換到窗口2 Gu8EditData\_2=Gu8SetData\_2/10%10; //“待編輯數據”分解成中間個體 Gu8EditData\_1=Gu8SetData\_2/1%10; //“待編輯數據”分解成中間個體 Gu8WdUpdate=1; //整屏更新 break; case 2: //在窗口2下 Gu8Wd=3; //切換到窗口3 Gu8EditData\_2=Gu8SetData\_3/10%10; //“待編輯數據”分解成中間個體 Gu8EditData\_1=Gu8SetData\_3/1%10; //“待編輯數據”分解成中間個體 Gu8WdUpdate=1; //整屏更新 break; case 3: //在窗口3下 Gu8Wd=1; //切換到窗口1 Gu8EditData\_2=Gu8SetData\_1/10%10; //“待編輯數據”分解成中間個體 Gu8EditData\_1=Gu8SetData\_1/1%10; //“待編輯數據”分解成中間個體 Gu8WdUpdate=1; //整屏更新 break; } } else //處于“閃爍模式”的時候,是“切換局部” { PartUpdate(Gu8Part); //切換之前的局部進行更新。 Gu8Part++; //切換局部 if(Gu8Part>2) { Gu8Part=1; } PartUpdate(Gu8Part); //切換之后的局部進行更新。 } vGu8BeepTimerFlag=0; vGu16BeepTimerCnt=VOICE\_TIME; //蜂鳴器發出“滴”一聲 vGu8BeepTimerFlag=1; vGu8KeySec=0; break; case 2: //遞增按鍵K2 switch(Gu8Wd) //在某個窗口下 { case 1: //在窗口1下 case 2: //在窗口2下,窗口2與窗口1的代碼完全一模一樣,因此可以這樣共享 case 3: //在窗口3下,窗口3與窗口1的代碼完全一模一樣,因此可以這樣共享 switch(Gu8Part) //二級支點的局部選擇 { case 1: //局部1被選中,代表左起第3位數碼管被選中。 Gu8EditData\_2++; //編輯“十位”個體的中間變量 if(Gu8EditData\_2>9) { Gu8EditData\_2=9; } PartUpdate(Gu8Part); //當前局部更新顯示輸出到數碼管 break; case 2: //局部2被選中,代表左起第4位數碼管被選中。 Gu8EditData\_1++; //編輯“個位”個體的中間變量 if(Gu8EditData\_1>9) { Gu8EditData\_1=9; } PartUpdate(Gu8Part); //當前局部更新顯示輸出到數碼管 break; } break; } vGu8BeepTimerFlag=0; vGu16BeepTimerCnt=VOICE\_TIME; //蜂鳴器發出“滴”一聲 vGu8BeepTimerFlag=1; vGu8KeySec=0; break; case 3: //遞減按鍵K3 switch(Gu8Wd) //在某個窗口下 { case 1: //在窗口1下 case 2: //在窗口2下,窗口2與窗口1的代碼完全一模一樣,因此可以這樣共享 case 3: //在窗口3下,窗口3與窗口1的代碼完全一模一樣,因此可以這樣共享 switch(Gu8Part) //二級支點的局部選擇 { case 1: //局部1被選中,代表左起第3位數碼管被選中。 if(Gu8EditData\_2>0) { Gu8EditData\_2--; //編輯“十位”個體的中間變量 } PartUpdate(Gu8Part); //當前局部更新顯示輸出到數碼管 break; case 2: //局部2被選中,代表左起第4位數碼管被選中。 if(Gu8EditData\_1>0) { Gu8EditData\_1--; //編輯“個位”個體的中間變量 } PartUpdate(Gu8Part); //當前局部更新顯示輸出到數碼管 break; } break; } vGu8BeepTimerFlag=0; vGu16BeepTimerCnt=VOICE\_TIME; //蜂鳴器發出“滴”一聲 vGu8BeepTimerFlag=1; vGu8KeySec=0; break; case 4: //K1按鍵的“長按”,具有進入和退出“閃爍模式”的功能。“退出”隱含“確定” switch(Gu8Wd) //在某個窗口下 { case 1: //在窗口1下 if(0==Gu8Part) //處于“沒有閃爍”的時候,將進入“閃爍模式” { Gu8EditData\_2=Gu8SetData\_1/10%10; //先把“待編輯數據”分解成中間個體 Gu8EditData\_1=Gu8SetData\_1/1%10; //先把“待編輯數據”分解成中間個體 Gu8Part=1; //進入“閃爍模式”,從“局部1”開始閃爍 } else //處于“閃爍模式”的時候,將退出到“沒有閃爍”,隱含“確定”功能 { Gu8SetData\_1=Gu8EditData\_2\*10+Gu8EditData\_1; //把個體合并還原成數據 Gu8Part=0; //退出“閃爍模式” Gu8WdUpdate=1; //整屏更新 } break; case 2: //在窗口2下 if(0==Gu8Part) //處于“沒有閃爍”的時候,將進入“閃爍模式” { Gu8EditData\_2=Gu8SetData\_2/10%10; //先把“待編輯數據”分解成中間個體 Gu8EditData\_1=Gu8SetData\_2/1%10; //先把“待編輯數據”分解成中間個體 Gu8Part=1; //進入“閃爍模式”,從“局部1”開始閃爍 } else //處于“閃爍模式”的時候,將退出到“沒有閃爍”,隱含“確定”功能 { Gu8SetData\_2=Gu8EditData\_2\*10+Gu8EditData\_1; //把個體合并還原成數據 Gu8Part=0; //退出“閃爍模式” Gu8WdUpdate=1; //整屏更新 } break; case 3: //在窗口3下 if(0==Gu8Part) //處于“沒有閃爍”的時候,將進入“閃爍模式” { Gu8EditData\_2=Gu8SetData\_3/10%10; //先把“待編輯數據”分解成中間個體 Gu8EditData\_1=Gu8SetData\_3/1%10; //先把“待編輯數據”分解成中間個體 Gu8Part=1; //進入“閃爍模式”,從“局部1”開始閃爍 } else //處于“閃爍模式”的時候,將退出到“沒有閃爍”,隱含“確定”功能 { Gu8SetData\_3=Gu8EditData\_2\*10+Gu8EditData\_1; //把個體合并還原成數據 Gu8Part=0; //退出“閃爍模式” 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顯示函數 break; case 3: Wd3(); //窗口3顯示函數 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; //及時清零,只更新一次顯示即可,避免一直進來更新顯示 Su8Temp\_4=1; //左起第1位數碼管,顯示窗口“1”,屬于靜態數據,起“裝飾”作用。 Su8Temp\_3=11; //左起第2位數碼管,顯示橫杠“-”,屬于靜態數據,起“裝飾”作用。 vGu8Display\_Righ\_4=Su8Temp\_4; //過渡需要顯示的數據到底層驅動變量 vGu8Display\_Righ\_3=Su8Temp\_3; //過渡需要顯示的數據到底層驅動變量 //不顯示任何一個小數點,屬于靜態數據,起“裝飾”作用,切換窗口后只掃描一次的代碼。 vGu8Display\_Righ\_Dot\_4=0; vGu8Display\_Righ\_Dot\_3=0; vGu8Display\_Righ\_Dot\_2=0; vGu8Display\_Righ\_Dot\_1=0; Gu8PartUpdate\_1=1; //局部1更新顯示 Gu8PartUpdate\_2=1 ;//局部2更新顯示 } if(1==Gu8PartUpdate\_1) //局部1更新顯示 { Gu8PartUpdate\_1=0; //及時清零,只更新一次顯示即可,避免一直進來更新顯示 Su8Temp\_2=Gu8EditData\_2; //顯示“十位”的臨時中間個體,屬于動態數據。 vGu8Display\_Righ\_2=Su8Temp\_2; //過渡需要顯示的數據到底層驅動變量 } if(1==Gu8PartUpdate\_2) //局部2更新顯示 { Gu8PartUpdate\_2=0; //及時清零,只更新一次顯示即可,避免一直進來更新顯示 Su8Temp\_1=Gu8EditData\_1; //顯示“個位”的臨時中間個體,屬于動態數據。 vGu8Display\_Righ\_1=Su8Temp\_1; //過渡需要顯示的數據到底層驅動變量 } if(0==vGu16BlinkTimerCnt) //某位被選中的數碼管跳動閃爍的定時器 { vGu8BlinkTimerFlag=0; vGu16BlinkTimerCnt=BLINK\_TIME; //重設定時器的定時時間 vGu8BlinkTimerFlag=1; switch(Gu8Part) //某個局部被選中,則閃爍跳動 { case 1: if(0==Su8BlinkFlag) //兩種狀態的切換判斷 { Su8BlinkFlag=1; Su8Temp\_2=10; //左起第3個顯示“不顯示”(10代表不顯示) } else { Su8BlinkFlag=0; Su8Temp\_2=Gu8EditData\_2; //顯示“十位”的臨時中間個體,屬于動態數據。 } break; case 2: if(0==Su8BlinkFlag) //兩種狀態的切換判斷 { Su8BlinkFlag=1; Su8Temp\_1=10; //左起第4個顯示“不顯示”(10代表不顯示) } else { Su8BlinkFlag=0; Su8Temp\_1=Gu8EditData\_1; //顯示“個位”的臨時中間個體,屬于動態數據。 } break; default: //都沒有被選中的時候 Su8Temp\_2=Gu8EditData\_2; //顯示“十位”的臨時中間個體,屬于動態數據。 Su8Temp\_1=Gu8EditData\_1; //顯示“個位”的臨時中間個體,屬于動態數據。 break; } vGu8Display\_Righ\_2=Su8Temp\_2; //過渡需要顯示的數據到底層驅動變量 vGu8Display\_Righ\_1=Su8Temp\_1; //過渡需要顯示的數據到底層驅動變量 } } void Wd2(void) //窗口2顯示函數 { //需要借用的中間變量,用來拆分數據位。 static unsigned char Su8Temp\_4,Su8Temp\_3,Su8Temp\_2,Su8Temp\_1; //需要借用的中間變量 static unsigned char Su8BlinkFlag=0; //兩種狀態的切換判斷的中間變量 if(1==Gu8WdUpdate) //如果需要整屏更新 { Gu8WdUpdate=0; //及時清零,只更新一次顯示即可,避免一直進來更新顯示 Su8Temp\_4=2; //左起第1位數碼管,顯示窗口“2”,屬于靜態數據,起“裝飾”作用。 Su8Temp\_3=11; //左起第2位數碼管,顯示橫杠“-”,屬于靜態數據,起“裝飾”作用。 vGu8Display\_Righ\_4=Su8Temp\_4; //過渡需要顯示的數據到底層驅動變量 vGu8Display\_Righ\_3=Su8Temp\_3; //過渡需要顯示的數據到底層驅動變量 //不顯示任何一個小數點,屬于靜態數據,起“裝飾”作用,切換窗口后只掃描一次的代碼。 vGu8Display\_Righ\_Dot\_4=0; vGu8Display\_Righ\_Dot\_3=0; vGu8Display\_Righ\_Dot\_2=0; vGu8Display\_Righ\_Dot\_1=0; Gu8PartUpdate\_1=1; //局部1更新顯示 Gu8PartUpdate\_2=1 ;//局部2更新顯示 } if(1==Gu8PartUpdate\_1) //局部1更新顯示 { Gu8PartUpdate\_1=0; //及時清零,只更新一次顯示即可,避免一直進來更新顯示 Su8Temp\_2=Gu8EditData\_2; //顯示“十位”的臨時中間個體,屬于動態數據。 vGu8Display\_Righ\_2=Su8Temp\_2; //過渡需要顯示的數據到底層驅動變量 } if(1==Gu8PartUpdate\_2) //局部2更新顯示 { Gu8PartUpdate\_2=0; //及時清零,只更新一次顯示即可,避免一直進來更新顯示 Su8Temp\_1=Gu8EditData\_1; //顯示“個位”的臨時中間個體,屬于動態數據。 vGu8Display\_Righ\_1=Su8Temp\_1; //過渡需要顯示的數據到底層驅動變量 } if(0==vGu16BlinkTimerCnt) //某位被選中的數碼管跳動閃爍的定時器 { vGu8BlinkTimerFlag=0; vGu16BlinkTimerCnt=BLINK\_TIME; //重設定時器的定時時間 vGu8BlinkTimerFlag=1; switch(Gu8Part) //某個局部被選中,則閃爍跳動 { case 1: if(0==Su8BlinkFlag) //兩種狀態的切換判斷 { Su8BlinkFlag=1; Su8Temp\_2=10; //左起第3個顯示“不顯示”(10代表不顯示) } else { Su8BlinkFlag=0; Su8Temp\_2=Gu8EditData\_2; //顯示“十位”的臨時中間個體,屬于動態數據。 } break; case 2: if(0==Su8BlinkFlag) //兩種狀態的切換判斷 { Su8BlinkFlag=1; Su8Temp\_1=10; //左起第4個顯示“不顯示”(10代表不顯示) } else { Su8BlinkFlag=0; Su8Temp\_1=Gu8EditData\_1; //顯示“個位”的臨時中間個體,屬于動態數據。 } break; default: //都沒有被選中的時候 Su8Temp\_2=Gu8EditData\_2; //顯示“十位”的臨時中間個體,屬于動態數據。 Su8Temp\_1=Gu8EditData\_1; //顯示“個位”的臨時中間個體,屬于動態數據。 break; } vGu8Display\_Righ\_2=Su8Temp\_2; //過渡需要顯示的數據到底層驅動變量 vGu8Display\_Righ\_1=Su8Temp\_1; //過渡需要顯示的數據到底層驅動變量 } } void Wd3(void) //窗口3顯示函數 { //需要借用的中間變量,用來拆分數據位。 static unsigned char Su8Temp\_4,Su8Temp\_3,Su8Temp\_2,Su8Temp\_1; //需要借用的中間變量 static unsigned char Su8BlinkFlag=0; //兩種狀態的切換判斷的中間變量 if(1==Gu8WdUpdate) //如果需要整屏更新 { Gu8WdUpdate=0; //及時清零,只更新一次顯示即可,避免一直進來更新顯示 Su8Temp\_4=3; //左起第1位數碼管,顯示窗口“3”,屬于靜態數據,起“裝飾”作用。 Su8Temp\_3=11; //左起第2位數碼管,顯示橫杠“-”,屬于靜態數據,起“裝飾”作用。 vGu8Display\_Righ\_4=Su8Temp\_4; //過渡需要顯示的數據到底層驅動變量 vGu8Display\_Righ\_3=Su8Temp\_3; //過渡需要顯示的數據到底層驅動變量 //不顯示任何一個小數點,屬于靜態數據,起“裝飾”作用,切換窗口后只掃描一次的代碼。 vGu8Display\_Righ\_Dot\_4=0; vGu8Display\_Righ\_Dot\_3=0; vGu8Display\_Righ\_Dot\_2=0; vGu8Display\_Righ\_Dot\_1=0; Gu8PartUpdate\_1=1; //局部1更新顯示 Gu8PartUpdate\_2=1 ;//局部2更新顯示 } if(1==Gu8PartUpdate\_1) //局部1更新顯示 { Gu8PartUpdate\_1=0; //及時清零,只更新一次顯示即可,避免一直進來更新顯示 Su8Temp\_2=Gu8EditData\_2; //顯示“十位”的臨時中間個體,屬于動態數據。 vGu8Display\_Righ\_2=Su8Temp\_2; //過渡需要顯示的數據到底層驅動變量 } if(1==Gu8PartUpdate\_2) //局部2更新顯示 { Gu8PartUpdate\_2=0; //及時清零,只更新一次顯示即可,避免一直進來更新顯示 Su8Temp\_1=Gu8EditData\_1; //顯示“個位”的臨時中間個體,屬于動態數據。 vGu8Display\_Righ\_1=Su8Temp\_1; //過渡需要顯示的數據到底層驅動變量 } if(0==vGu16BlinkTimerCnt) //某位被選中的數碼管跳動閃爍的定時器 { vGu8BlinkTimerFlag=0; vGu16BlinkTimerCnt=BLINK\_TIME; //重設定時器的定時時間 vGu8BlinkTimerFlag=1; switch(Gu8Part) //某個局部被選中,則閃爍跳動 { case 1: if(0==Su8BlinkFlag) //兩種狀態的切換判斷 { Su8BlinkFlag=1; Su8Temp\_2=10; //左起第3個顯示“不顯示”(10代表不顯示) } else { Su8BlinkFlag=0; Su8Temp\_2=Gu8EditData\_2; //顯示“十位”的臨時中間個體,屬于動態數據。 } break; case 2: if(0==Su8BlinkFlag) //兩種狀態的切換判斷 { Su8BlinkFlag=1; Su8Temp\_1=10; //左起第4個顯示“不顯示”(10代表不顯示) } else { Su8BlinkFlag=0; Su8Temp\_1=Gu8EditData\_1; //顯示“個位”的臨時中間個體,屬于動態數據。 } break; default: //都沒有被選中的時候 Su8Temp\_2=Gu8EditData\_2; //顯示“十位”的臨時中間個體,屬于動態數據。 Su8Temp\_1=Gu8EditData\_1; //顯示“個位”的臨時中間個體,屬于動態數據。 break; } 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--; //遞減式的軟件定時器 } TH0=0xfc; TL0=0x66; } void SystemInitial(void) { P0=0x00; P1\_0=1; P1\_1=1; P1\_2=1; P1\_3=1; TMOD=0x01; TH0=0xfc; TL0=0x66; EA=1; ET0=1; TR0=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>

                              哎呀哎呀视频在线观看