<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                【118.1 按鍵讓某位數碼管閃爍跳動來設置參數。】 ![](https://img.kancloud.cn/d1/98/d19803e327fa494dce4ab72902e02129_285x371.png) 上圖118.1.1 數碼管 ![](https://img.kancloud.cn/a2/3d/a23df87ac21f61d2182864f67461b009_359x103.png) 上圖118.1.2 獨立按鍵 ![](https://img.kancloud.cn/89/70/8970513a066fe0726b2997dcb0329ce0_194x190.png) 上圖118.1.3 有源蜂鳴器 當一個窗口只有一個數據的時候,只需以“窗口”為支點,切換到某個窗口下去設置某個數據即可。但是,當某個窗口有幾個數據時,就必須在以“窗口”為支點的前提下,再細分出一個二級的支點,這個二級支點就是“局部”(或者稱為子菜單)。“窗口”對應一個“窗口選擇”的全局變量Gu8Wd,“局部”對應一個“局部選擇”的全局變量Gu8Part。數據需要更新顯示輸出到屏幕(數碼管)時,有兩種更新方式,一種是“整屏更新”,另一種是“局部更新”。“整屏更新”只有一個整屏的更新變量Gu8WdUpdate,而“局部更新”有N個更新變量Gu8PartUpdate\_x(Gu8PartUpdate\_1,Gu8PartUpdate\_2,Gu8PartUpdate\_3),一個窗口下有多少個數據就存在多少個局部的更新變量Gu8PartUpdate\_x,這些局部的更新變量在不同的窗口下是可以共用的。當某個局部被選中的時候,可以有很多種表現方式,比如在液晶屏上,常見的有光標跳動,某行文字的底色變色(反顯),本節例程用的數碼管,當某個局部被選中的時候,用某位數碼管閃爍跳動的方式。 本節小項目的程序功能,在一個窗口下,對單片機內部四個參數Gu8SetData\_4,Gu8SetData\_3,Gu8SetData\_2,Gu8SetData\_1進行編輯。這四個參數的范圍是從0到9,從左到右分別顯示在四位數碼管上,每一位數碼管對應一個數據。比如左起第1位是Gu8SetData\_4,左起第2位是Gu8SetData\_3,左起第3位是Gu8SetData\_2,左起第4位是Gu8SetData\_1。K1是局部選擇的切換按鍵,每按一次,數碼管從左到右,依次閃爍跳動,表示某個數據被選中。K2是數字累加按鍵,每按一次,閃爍跳動的數字會累加1。K3是數字遞減按鍵,每按一次,閃爍跳動的數字會遞減1。代碼如下: \#include "REG52.H" \#define KEY\_FILTER\_TIME 25 \#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 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\_4=0; //單片機內部第4個可編輯的參數 unsigned char Gu8SetData\_3=0; //單片機內部第3個可編輯的參數 unsigned char Gu8SetData\_2=0; //單片機內部第2個可編輯的參數 unsigned char Gu8SetData\_1=0; //單片機內部第1個可編輯的參數 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的更新變量 unsigned char Gu8PartUpdate\_3=0; //局部3的更新變量 unsigned char Gu8PartUpdate\_4=0; //局部4的更新變量 volatile unsigned char vGu8Display\_Righ\_4=0; //左起第1位初始化顯示數值“0” volatile unsigned char vGu8Display\_Righ\_3=0; //左起第2位初始化顯示數值“0” 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; case 3: Gu8PartUpdate\_3=1; break; case 4: Gu8PartUpdate\_4=1; break; } } void KeyTask(void) //按鍵的任務函數 { if(0==vGu8KeySec) { return; } switch(vGu8KeySec) { case 1: //局部切換的按鍵 switch(Gu8Wd) //在某個窗口下 { case 1: //在窗口1下 //以下之所以有兩個PartUpdate(Gu8Part),是因為相鄰的兩個局部發生了變化。 PartUpdate(Gu8Part); //切換之前的局部進行更新。 Gu8Part++; //切換到下一個局部 if(Gu8Part>4) { Gu8Part=0; } PartUpdate(Gu8Part); //切換之后的局部進行更新。 break; } vGu8BeepTimerFlag=0; vGu16BeepTimerCnt=VOICE\_TIME; //蜂鳴器發出“滴”一聲 vGu8BeepTimerFlag=1; vGu8KeySec=0; break; case 2: //累加的按鍵 switch(Gu8Wd) //在某個窗口下 { case 1: //在窗口1下 switch(Gu8Part) //二級支點的局部選擇 { case 1: //局部1被選中,代表左起第1位數據Gu8SetData\_4被選中。 Gu8SetData\_4++; if(Gu8SetData\_4>9) { Gu8SetData\_4=9; } PartUpdate(Gu8Part); //當前局部更新顯示輸出到數碼管 break; case 2: //局部2被選中,代表左起第2位數據Gu8SetData\_3被選中。 Gu8SetData\_3++; if(Gu8SetData\_3>9) { Gu8SetData\_3=9; } PartUpdate(Gu8Part); //當前局部更新顯示輸出到數碼管 break; case 3: //局部3被選中,代表左起第3位數據Gu8SetData\_2被選中。 Gu8SetData\_2++; if(Gu8SetData\_2>9) { Gu8SetData\_2=9; } PartUpdate(Gu8Part); //當前局部更新顯示輸出到數碼管 break; case 4: //局部4被選中,代表左起第4位數據Gu8SetData\_1被選中。 Gu8SetData\_1++; if(Gu8SetData\_1>9) { Gu8SetData\_1=9; } PartUpdate(Gu8Part); //當前局部更新顯示輸出到數碼管 break; } break; case 2: //在窗口2下(本節只用到窗口1) break; } vGu8BeepTimerFlag=0; vGu16BeepTimerCnt=VOICE\_TIME; //蜂鳴器發出“滴”一聲 vGu8BeepTimerFlag=1; vGu8KeySec=0; break; case 3: //遞減的按鍵 switch(Gu8Wd) //在某個窗口下 { case 1: //在窗口1下 switch(Gu8Part) //二級支點的局部選擇 { case 1: //局部1被選中,代表左起第1位數據Gu8SetData\_4被選中。 if(Gu8SetData\_4>0) { Gu8SetData\_4--; } PartUpdate(Gu8Part); //當前局部更新顯示輸出到數碼管 break; case 2: //局部2被選中,代表左起第2位數據Gu8SetData\_3被選中。 if(Gu8SetData\_3>0) { Gu8SetData\_3--; } PartUpdate(Gu8Part); //當前局部更新顯示輸出到數碼管 break; case 3: //局部3被選中,代表左起第3位數據Gu8SetData\_2被選中。 if(Gu8SetData\_2>0) { Gu8SetData\_2--; } PartUpdate(Gu8Part); //當前局部更新顯示輸出到數碼管 break; case 4: //局部4被選中,代表左起第4位數據Gu8SetData\_1被選中。 if(Gu8SetData\_1>0) { Gu8SetData\_1--; } PartUpdate(Gu8Part); //當前局部更新顯示輸出到數碼管 break; } break; case 2: //在窗口2下(本節只用到窗口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: //窗口2顯示選擇(本節只用到窗口1) 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=0; vGu8Display\_Righ\_Dot\_2=0; vGu8Display\_Righ\_Dot\_1=0; Gu8PartUpdate\_1=1; //局部1更新顯示 Gu8PartUpdate\_2=1 ;//局部2更新顯示 Gu8PartUpdate\_3=1; //局部3更新顯示 Gu8PartUpdate\_4=1; //局部4更新顯示 } if(1==Gu8PartUpdate\_1) //局部1更新顯示 { Gu8PartUpdate\_1=0; //及時清零,只更新一次顯示即可,避免一直進來更新顯示 Su8Temp\_4=Gu8SetData\_4; //顯示左起第1個數據Gu8SetData\_4 //上面先分解數據之后,再過渡需要顯示的數據到底層驅動變量里,讓過渡的時間越短越好 vGu8Display\_Righ\_4=Su8Temp\_4; //過渡需要顯示的數據到底層驅動變量 } if(1==Gu8PartUpdate\_2) //局部2更新顯示 { Gu8PartUpdate\_2=0; //及時清零,只更新一次顯示即可,避免一直進來更新顯示 Su8Temp\_3=Gu8SetData\_3; //顯示左起第2個數據Gu8SetData\_3 //上面先分解數據之后,再過渡需要顯示的數據到底層驅動變量里,讓過渡的時間越短越好 vGu8Display\_Righ\_3=Su8Temp\_3; //過渡需要顯示的數據到底層驅動變量 } if(1==Gu8PartUpdate\_3) //局部3更新顯示 { Gu8PartUpdate\_3=0; //及時清零,只更新一次顯示即可,避免一直進來更新顯示 Su8Temp\_2=Gu8SetData\_2; //顯示左起第3個數據Gu8SetData\_2 //上面先分解數據之后,再過渡需要顯示的數據到底層驅動變量里,讓過渡的時間越短越好 vGu8Display\_Righ\_2=Su8Temp\_2; //過渡需要顯示的數據到底層驅動變量 } if(1==Gu8PartUpdate\_4) //局部4更新顯示 { Gu8PartUpdate\_4=0; //及時清零,只更新一次顯示即可,避免一直進來更新顯示 Su8Temp\_1=Gu8SetData\_1; //顯示左起第4個數據Gu8SetData\_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\_4=10; //左起第1個顯示“不顯示”(10代表不顯示) } else { Su8BlinkFlag=0; Su8Temp\_4=Gu8SetData\_4; //左起第1個顯示數據Gu8SetData\_4 } break; case 2: if(0==Su8BlinkFlag) //兩種狀態的切換判斷 { Su8BlinkFlag=1; Su8Temp\_3=10; //左起第2個顯示“不顯示”(10代表不顯示) } else { Su8BlinkFlag=0; Su8Temp\_3=Gu8SetData\_3; //左起第2個顯示數據Gu8SetData\_3 } break; case 3: if(0==Su8BlinkFlag) //兩種狀態的切換判斷 { Su8BlinkFlag=1; Su8Temp\_2=10; //左起第3個顯示“不顯示”(10代表不顯示) } else { Su8BlinkFlag=0; Su8Temp\_2=Gu8SetData\_2; //左起第3個顯示數據Gu8SetData\_2 } break; case 4: if(0==Su8BlinkFlag) //兩種狀態的切換判斷 { Su8BlinkFlag=1; Su8Temp\_1=10; //左起第3個顯示“不顯示”(10代表不顯示) } else { Su8BlinkFlag=0; Su8Temp\_1=Gu8SetData\_1; //左起第4個顯示數據Gu8SetData\_1 } break; default: //都沒有被選中的時候 Su8Temp\_4=Gu8SetData\_4; //左起第1個顯示數據Gu8SetData\_4 Su8Temp\_3=Gu8SetData\_3; //左起第2個顯示數據Gu8SetData\_3 Su8Temp\_2=Gu8SetData\_2; //左起第3個顯示數據Gu8SetData\_2 Su8Temp\_1=Gu8SetData\_1; //左起第4個顯示數據Gu8SetData\_1 break; } vGu8Display\_Righ\_4=Su8Temp\_4; //過渡需要顯示的數據到底層驅動變量 vGu8Display\_Righ\_3=Su8Temp\_3; //過渡需要顯示的數據到底層驅動變量 vGu8Display\_Righ\_2=Su8Temp\_2; //過渡需要顯示的數據到底層驅動變量 vGu8Display\_Righ\_1=Su8Temp\_1; //過渡需要顯示的數據到底層驅動變量 } } void KeyScan(void) //按鍵底層的驅動掃描函數,放在定時中斷函數里 { static unsigned char Su8KeyLock1; static unsigned int Su16KeyCnt1; static unsigned char Su8KeyLock2; static unsigned int Su16KeyCnt2; static unsigned char Su8KeyLock3; static unsigned int Su16KeyCnt3; if(0!=KEY\_INPUT1) { Su8KeyLock1=0; Su16KeyCnt1=0; } else if(0==Su8KeyLock1) { Su16KeyCnt1++; if(Su16KeyCnt1>=KEY\_FILTER\_TIME) { Su8KeyLock1=1; vGu8KeySec=1; } } 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>

                              哎呀哎呀视频在线观看