<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之旅 廣告
                【117.1 按鍵切換數碼管窗口來設置參數。】 ![](https://img.kancloud.cn/d1/98/d19803e327fa494dce4ab72902e02129_285x371.png) 上圖117.1.1 數碼管 ![](https://img.kancloud.cn/a2/3d/a23df87ac21f61d2182864f67461b009_359x103.png) 上圖117.1.2 獨立按鍵 ![](https://img.kancloud.cn/89/70/8970513a066fe0726b2997dcb0329ce0_194x190.png) 上圖117.1.3 有源蜂鳴器 單片機是“數據”驅動型的。按什么邏輯跑,以什么方式跑,都是“數據”決定的。人機交互的核心就是“人”以什么渠道去更改“機”內部的某些“數據”。在程序框架層面,按鍵更改或者編輯某些數據,我的核心思路都是“在某個窗口下去更改某個特定的數據”,如果某個窗口的數據很多,就需要在此窗口下進一步細分,細分為“某個窗口下的某個局部(子菜單、光標選擇)”。可見,“窗口”是支點,“局部”是支點中再細分出來的支點。窗口對應一個名叫 “窗口選擇”的全局變量Gu8Wd,局部(子菜單、光標選擇)對應一個名叫“局部選擇”的全局變量Gu8Part。數據發生變化的時候,才需要更新顯示到數碼管上,平時不用一直更新顯示,因此,與“窗口選擇”Gu8Wd還對應一個名叫“整屏更新”的全局變量Gu8WdUpdate,與“局部選擇”Gu8Part還對應一個名叫“局部更新”的全局變量Gu8PartUpdate。本節的小項目程序只用到“窗口”,沒有用到“局部”。 本節小項目的程序功能,利用按鍵與數碼管的人機交互,可以對單片機內部三個參數Gu8SetData\_1,Gu8SetData\_2,Gu8SetData\_3進行編輯。這三個參數分別在三個窗口下進行編輯,這三個窗口是數碼管顯示“1-XX”,“2-YY”,“3-ZZ”。其中,XX代表Gu8SetData\_1數據,YY代表Gu8SetData\_2數據,ZZ代表Gu8SetData\_3數據,這三個數據的范圍是從0到99。K1是窗口切換按鍵,每按一次,窗口會在“1-XX”,“2-YY”,“3-ZZ”三個窗口之間進行切換。K2是數字累加按鍵,每按一次,顯示的數字會累加1。K3是數字遞減按鍵,每按一次,顯示的數字會遞減1。代碼如下: \#include "REG52.H" \#define KEY\_FILTER\_TIME 25 \#define SCAN\_TIME 1 \#define VOICE\_TIME 50 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 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; unsigned char Gu8SetData\_1=0; //單片機內部第1個可編輯的參數 unsigned char Gu8SetData\_2=0; //單片機內部第2個可編輯的參數 unsigned char Gu8SetData\_3=0; //單片機內部第3個可編輯的參數 unsigned char Gu8Wd=1; //窗口選擇變量。人機交互程序框架的支點。初始化開機后顯示第1個窗口。 unsigned char Gu8WdUpdate=1; //整屏更新變量。初始化為1開機后整屏更新一次顯示。 volatile unsigned char vGu8Display\_Righ\_4=1; //顯示窗口“1” volatile unsigned char vGu8Display\_Righ\_3=11; //顯示橫杠“-” volatile unsigned char vGu8Display\_Righ\_2=0; //顯示十位數值“0” volatile unsigned char vGu8Display\_Righ\_1=0; //顯示個位數值“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 KeyTask(void) //按鍵的任務函數 { if(0==vGu8KeySec) { return; } switch(vGu8KeySec) { case 1: //窗口切換的按鍵 Gu8Wd++; //窗口切換到下一個窗口 if(Gu8Wd>3) //一共3個窗口。切換第3個窗口之后,繼續返回到第1個窗口 { Gu8Wd=1; //返回到第1個窗口 } Gu8WdUpdate=1; //整屏更新一次顯示 vGu8BeepTimerFlag=0; vGu16BeepTimerCnt=VOICE\_TIME; //蜂鳴器發出“滴”一聲 vGu8BeepTimerFlag=1; vGu8KeySec=0; break; case 2: //累加的按鍵 switch(Gu8Wd) //以窗口選擇Gu8Wd為支點,去編輯對應的數據。又一次用到switch語句 { case 1: //在第1個窗口下編輯Gu8SetData\_1數據 Gu8SetData\_1++; if(Gu8SetData\_1>99) //把最大范圍限定在99 { Gu8SetData\_1=99; } Gu8WdUpdate=1; //整屏更新一次顯示 break; case 2: //在第2個窗口下編輯Gu8SetData\_2數據 Gu8SetData\_2++; if(Gu8SetData\_2>99) //把最大范圍限定在99 { Gu8SetData\_2=99; } Gu8WdUpdate=1; //整屏更新一次顯示 break; case 3: //在第3個窗口下編輯Gu8SetData\_3數據 Gu8SetData\_3++; if(Gu8SetData\_3>99) //把最大范圍限定在99 { Gu8SetData\_3=99; } Gu8WdUpdate=1; //整屏更新一次顯示 break; } vGu8BeepTimerFlag=0; vGu16BeepTimerCnt=VOICE\_TIME; //蜂鳴器發出“滴”一聲 vGu8BeepTimerFlag=1; vGu8KeySec=0; break; case 3: //遞減的按鍵 switch(Gu8Wd) //以窗口選擇Gu8Wd為支點,去編輯對應的數據。又一次用到switch語句 { case 1: //在第1個窗口下編輯Gu8SetData\_1數據 if(Gu8SetData\_1>0) //把最小范圍限定在0 { Gu8SetData\_1--; } Gu8WdUpdate=1; //整屏更新一次顯示 break; case 2: //在第2個窗口下編輯Gu8SetData\_2數據 if(Gu8SetData\_2>0) //把最小范圍限定在0 { Gu8SetData\_2--; } Gu8WdUpdate=1; //整屏更新一次顯示 break; case 3: //在第3個窗口下編輯Gu8SetData\_3數據 if(Gu8SetData\_3>0) //把最小范圍限定在0 { Gu8SetData\_3--; } 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; //需要借用的中間變量 if(1==Gu8WdUpdate) //如果需要整屏更新 { Gu8WdUpdate=0; //及時清零,只更新一次顯示即可,避免一直進來更新顯示 Su8Temp\_4=1; //窗口“1” Su8Temp\_3=11; //橫杠“-” Su8Temp\_2=Gu8SetData\_1/10%10; //十位數值 Su8Temp\_1=Gu8SetData\_1/1%10; //個位數值 //上面先分解數據之后,再過渡需要顯示的數據到底層驅動變量里,讓過渡的時間越短越好 vGu8Display\_Righ\_4=Su8Temp\_4; //過渡需要顯示的數據到底層驅動變量 vGu8Display\_Righ\_3=Su8Temp\_3; vGu8Display\_Righ\_2=Su8Temp\_2; vGu8Display\_Righ\_1=Su8Temp\_1; //不顯示任何一個小數點 vGu8Display\_Righ\_Dot\_4=0; vGu8Display\_Righ\_Dot\_3=0; vGu8Display\_Righ\_Dot\_2=0; vGu8Display\_Righ\_Dot\_1=0; } } void Wd2(void) //窗口2顯示函數 { //需要借用的中間變量,用來拆分數據位。 static unsigned char Su8Temp\_4,Su8Temp\_3,Su8Temp\_2,Su8Temp\_1; //需要借用的中間變量 if(1==Gu8WdUpdate) //如果需要整屏更新 { Gu8WdUpdate=0; //及時清零,只更新一次顯示即可,避免一直進來更新顯示 Su8Temp\_4=2; //窗口“2” Su8Temp\_3=11; //橫杠“-” Su8Temp\_2=Gu8SetData\_2/10%10; //十位數值 Su8Temp\_1=Gu8SetData\_2/1%10; //個位數值 //上面先分解數據之后,再過渡需要顯示的數據到底層驅動變量里,讓過渡的時間越短越好 vGu8Display\_Righ\_4=Su8Temp\_4; //過渡需要顯示的數據到底層驅動變量 vGu8Display\_Righ\_3=Su8Temp\_3; vGu8Display\_Righ\_2=Su8Temp\_2; vGu8Display\_Righ\_1=Su8Temp\_1; //不顯示任何一個小數點 vGu8Display\_Righ\_Dot\_4=0; vGu8Display\_Righ\_Dot\_3=0; vGu8Display\_Righ\_Dot\_2=0; vGu8Display\_Righ\_Dot\_1=0; } } void Wd3(void) //窗口3顯示函數 { //需要借用的中間變量,用來拆分數據位。 static unsigned char Su8Temp\_4,Su8Temp\_3,Su8Temp\_2,Su8Temp\_1; //需要借用的中間變量 if(1==Gu8WdUpdate) //如果需要整屏更新 { Gu8WdUpdate=0; //及時清零,只更新一次顯示即可,避免一直進來更新顯示 Su8Temp\_4=3; //窗口“3” Su8Temp\_3=11; //橫杠“-” Su8Temp\_2=Gu8SetData\_3/10%10; //十位數值 Su8Temp\_1=Gu8SetData\_3/1%10; //個位數值 //上面先分解數據之后,再過渡需要顯示的數據到底層驅動變量里,讓過渡的時間越短越好 vGu8Display\_Righ\_4=Su8Temp\_4; //過渡需要顯示的數據到底層驅動變量 vGu8Display\_Righ\_3=Su8Temp\_3; vGu8Display\_Righ\_2=Su8Temp\_2; vGu8Display\_Righ\_1=Su8Temp\_1; //不顯示任何一個小數點 vGu8Display\_Righ\_Dot\_4=0; vGu8Display\_Righ\_Dot\_3=0; vGu8Display\_Righ\_Dot\_2=0; vGu8Display\_Righ\_Dot\_1=0; } } 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--; //遞減式的軟件定時器 } 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>

                              哎呀哎呀视频在线观看