<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國際加速解決方案。 廣告
                【96.1 “一鍵兩用”的短按與長按。】 ![](https://img.kancloud.cn/a2/3d/a23df87ac21f61d2182864f67461b009_359x103.png) 上圖96.1.1 獨立按鍵電路 ![](https://img.kancloud.cn/68/91/6891d9a9e89ee7345b1505221de5c26b_252x282.png) 上圖96.1.2 LED電路 ![](https://img.kancloud.cn/89/70/8970513a066fe0726b2997dcb0329ce0_194x190.png) 上圖96.1.3 有源蜂鳴器電路 某些項目,當外部按鍵的資源比較少的時候,一個按鍵也可以“一鍵多用”。“一鍵多用”有很多種玩法,比如,諜戰片的無線電通信,依賴一個按鍵的“不同敲擊頻率”就可以發送內容豐富的情報。本節“一鍵兩用”也是屬于“一鍵多用”的眾多玩法之一。“短按與長按”的原理是依賴“按鍵按下的時間長度”來區分識別。“短按”是指從按下的“下降沿”到松手的“上升沿”時間,“長按”是指從按下的“下降沿”到一直按住不松手的“低電平持續時間”。本節的例程功能如下:(1)K1每“短按”一次(25ms),LED要么從“滅”變成“亮”,要么從“亮”變成“滅”,在兩種狀態之間切換。(2)K1每“長按”一次(500ms),蜂鳴器發出“嘀”的一聲。代碼如下: \#include "REG52.H" \#define KEY\_VOICE\_TIME 50 //按鍵“長按”觸發后發出的聲音長度 50ms \#define KEY\_SHORT\_TIME 25 //按鍵的“短按”兼“濾波”的“穩定時間”25ms \#define KEY\_LONG\_TIME 500 //按鍵的“長按”兼“濾波”的“穩定時間”500ms void T0\_time(); void SystemInitial(void) ; void Delay(unsigned long u32DelayTime) ; void PeripheralInitial(void) ; void BeepOpen(void); void BeepClose(void); void LedOpen(void); void LedClose(void); void VoiceScan(void); void KeyScan(void); //按鍵識別的驅動函數,放在定時中斷里 void SingleKeyTask(void); //單擊按鍵任務函數,放在主函數內 sbit P3\_4=P3^4; //蜂鳴器 sbit P1\_4=P1^4; //LED sbit KEY\_INPUT1=P2^2; //K1按鍵識別的輸入口。 volatile unsigned char vGu8BeepTimerFlag=0; volatile unsigned int vGu16BeepTimerCnt=0; unsigned char Gu8LedStatus=0; //記錄LED燈的狀態,0代表滅,1代表亮 volatile unsigned char vGu8SingleKeySec=0; //單擊按鍵的觸發序號 void main() { SystemInitial(); Delay(10000); PeripheralInitial(); while(1) { SingleKeyTask(); //單擊按鍵任務函數 } } void T0\_time() interrupt 1 { VoiceScan(); KeyScan(); //按鍵識別的驅動函數 TH0=0xfc; TL0=0x66; } void SystemInitial(void) { TMOD=0x01; TH0=0xfc; TL0=0x66; EA=1; ET0=1; TR0=1; } void Delay(unsigned long u32DelayTime) { for(;u32DelayTime>0;u32DelayTime--); } void PeripheralInitial(void) { if(0==Gu8LedStatus) { LedClose(); } else { LedOpen(); } } void BeepOpen(void) { P3\_4=0; } void BeepClose(void) { P3\_4=1; } void LedOpen(void) { P1\_4=0; } void LedClose(void) { P1\_4=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(); } } } } /\* 注釋一: \* “長按”與“短按”的識別過程: \* 第一步:平時只要K1沒有被按下,按鍵的自鎖標志Su8KeyLock1和去抖動延時計數器Su16KeyCnt1 \* 一直被清零。此時屬于按鍵“松手時間”,因此同時檢測“短按”標志Su8KeyShortFlag \* 是否有效,如果有效就觸發一次“短按”。 \* 第二步:一旦K1按鍵被按下,去抖動延時計數器Su16KeyCnt1開始在定時中斷函數里累加,在還沒 \* 累加到閥值KEY\_SHORT\_TIME和KEY\_LONG\_TIME時,如果在這期間由于受外界干擾或者 \* 按鍵抖動,而使IO口突然瞬間觸發成高電平,這個時候馬上把延時計數器Su16KeyCnt1清零, \* 這個過程非常巧妙,非常有效地去除瞬間的雜波干擾。 \* 第三步:如果K1按鍵按下的時間超過了“短按”閥值KEY\_SHORT\_TIME,馬上把“短按”標志 \* Su8KeyShortFlag置1,如果此時還沒有松手,直到發現按下的時間超過“長按”閥值 \* KEY\_LONG\_TIME時,先把“短按”標志ucShortTouchFlag1清零,然后觸發“長按”,同時,為 \* 了防止按住按鍵不松手后一直觸發,要及時把Su8KeyLock1置1“自鎖”。 \* 第四步:等K1按鍵松手后,自鎖標志Su8KeyLock1及時清零,為下一次自鎖做準備,同時,也檢測 \* “短按”標志Su8KeyShortFlag是否有效,如果有效就觸發一次“短按”。 \*/ void KeyScan(void) //此函數放在定時中斷里每1ms掃描一次 { static unsigned char Su8KeyLock1; static unsigned int Su16KeyCnt1; static unsigned char Su8KeyShortFlag=0; //按鍵“短按”觸發的標志 if(0!=KEY\_INPUT1)//單個K1按鍵沒有按下,及時清零一些標志。 { Su8KeyLock1=0; //按鍵解鎖 Su16KeyCnt1=0; //去抖動延時計數器清零,此行非常巧妙,是全場的亮點。 if(1==Su8KeyShortFlag) //松手的時候,如果“短按”標志有效就觸發一次“短按” { Su8KeyShortFlag=0; //先清零“短按”標志避免一直觸發。 vGu8SingleKeySec=1; //觸發K1的“短按” } } else if(0==Su8KeyLock1)//單個按鍵K1被按下 { Su16KeyCnt1++; //累加定時中斷次數 if(Su16KeyCnt1>=KEY\_SHORT\_TIME) //“短按”兼“濾波”的“穩定時間”KEY\_SHORT\_TIME { //注意,這里不能“自鎖”。后面“長按”觸發的時候才“自鎖”。 Su8KeyShortFlag=1; //K1的“短按”標志有效,待松手時觸發。 } if(Su16KeyCnt1>=KEY\_LONG\_TIME) //“長按”兼“濾波”的“穩定時間”KEY\_LONG\_TIME { Su8KeyLock1=1; //此時“長按”觸發才“自鎖” Su8KeyShortFlag=0; //既然此時“長按”有效,那么就要廢除潛在的“短按”。 vGu8SingleKeySec=2; //觸發K1的“長按” } } } void SingleKeyTask(void) //單擊按鍵任務函數,放在主函數內 { if(0==vGu8SingleKeySec) { return; //按鍵的觸發序號是0意味著無按鍵觸發,直接退出當前函數,不執行此函數下面的代碼 } switch(vGu8SingleKeySec) //根據不同的按鍵觸發序號執行對應的代碼 { case 1: //K1“短按”觸發的任務 if(0==Gu8LedStatus) { Gu8LedStatus=1; LedOpen(); //LED亮 } else { Gu8LedStatus=0; LedClose(); //LED滅 } vGu8SingleKeySec=0; //響應按鍵服務處理程序后,按鍵編號必須清零,避免一直觸發 break; case 2: //K1“長按”觸發的任務 vGu8BeepTimerFlag=0; vGu16BeepTimerCnt=KEY\_VOICE\_TIME; //觸發一次“長按”后,發出“嘀”一聲 vGu8BeepTimerFlag=1; vGu8SingleKeySec=0; //響應按鍵服務處理程序后,按鍵編號必須清零,避免一直觸發 break; } }
                  <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>

                              哎呀哎呀视频在线观看