<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國際加速解決方案。 廣告
                【102.1 “異行輸入”“同行輸入”“有序”。】 ![](https://img.kancloud.cn/89/70/8970513a066fe0726b2997dcb0329ce0_194x190.png) 上圖102.1.1 有源蜂鳴器電路 ![](https://img.kancloud.cn/68/91/6891d9a9e89ee7345b1505221de5c26b_252x282.png) 上圖102.1.2 LED電路 ![](https://img.kancloud.cn/c1/8a/c18ad9232965b2a0699e388df49ac7b9_341x221.png) 上圖102.1.3 3\*3矩陣按鍵的電路 “任意行輸入”是指能兼容“異行輸入”與“同行輸入”這兩種按鍵狀態。 何謂“異行輸入”何謂“同行輸入”?如上圖矩陣按鍵,P2.2,P2.1,P2.0是輸入行,P2.5,P2.4,P2.3是輸出列。以S1按鍵為例,很明顯,S2和S3都是屬于S1的“同行輸入”,都是屬于P2.2的輸入行。除了S2和S3以外,其它所有的按鍵都是S1的“異行輸入”,比如S5按鍵就是S1的“異行輸入”,因為S1是屬于P2.2的輸入行,而S5是屬于P2.1的輸入行。 何謂“有序”組合觸發?就是兩個按鍵的觸發必須遵守“先后順序”才能構成“組合觸發”。比如,像電腦的復制快捷鍵(Ctrl+C),你必須先按住Ctrl再按住C此時“復制快捷鍵”才有效,如果你先按住C再按住Ctrl此時“復制快捷鍵”無效。 “異行輸入”與“同行輸入”,相比之下,“同行輸入”更難更有代表性,如果把“同行輸入”的程序寫出來了,那么完全按“同行輸入”的思路,就可以把“異行輸入”的程序寫出來。因此,只要把“同行輸入”的程序寫出來了,也就意味著“任意行輸入”的程序也就實現了。本節以S1和S2的“同行輸入”按鍵為例,S1是主鍵,類似復制快捷鍵的Ctrl鍵;S2是從鍵,類似復制快捷鍵的C鍵。要觸發組合鍵(S1+S2),必須先按住S1再按S2才有效。功能如下:(1)S1每單擊一次,LED要么從“滅”變成“亮”,要么從“亮”變成“滅”,在兩種狀態之間切換。(2)如果先按住S1再按S2,就認為構造了“有序”組合鍵,蜂鳴器發出“嘀”的一聲。 \#include "REG52.H" \#define KEY\_VOICE\_TIME 50 \#define KEY\_SHORT\_TIME 20 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); void DoubleKeyTask(void); sbit P3\_4=P3^4; sbit P1\_4=P1^4; sbit ROW\_INPUT1=P2^2; //第1行輸入口。 sbit ROW\_INPUT2=P2^1; //第2行輸入口。 sbit ROW\_INPUT3=P2^0; //第3行輸入口。 sbit COLUMN\_OUTPUT1=P2^5; //第1列輸出口。 sbit COLUMN\_OUTPUT2=P2^4; //第2列輸出口。 sbit COLUMN\_OUTPUT3=P2^3; //第3列輸出口。 volatile unsigned char vGu8BeepTimerFlag=0; volatile unsigned int vGu16BeepTimerCnt=0; unsigned char Gu8LedStatus=0; volatile unsigned char vGu8SingleKeySec=0; volatile unsigned char vGu8DoubleKeySec=0; void main() { SystemInitial(); Delay(10000); PeripheralInitial(); while(1) { SingleKeyTask(); DoubleKeyTask(); } } /\* 注釋一: \* 兩個“任意行輸入”矩陣按鍵“有序”觸發的兩個最關鍵地方: \* (1)當S1按鍵被按下單擊觸發之后, “馬上更新輸出列的信號狀態”,然后切換到后面的步驟。 \* (2)在后面的步驟里,進入到S1和S2兩個按鍵的輪番循環監控之中,如果發現S1按鍵率先 \* 被松開了,就把步驟切換到開始的第一步,重新開始新一輪的按鍵掃描。 \* (3)按照這個模板,只需“更改不同的列輸出,判斷不同的行輸入”,就可以實現“任意行輸入” \* 矩陣按鍵的“有序”組合觸發。 \*/ void KeyScan(void) //此函數放在定時中斷里每1ms掃描一次 { static unsigned char Su8KeyLock=0; static unsigned int Su16KeyCnt=0; static unsigned char Su8KeyStep=1; static unsigned char Su8ColumnRecord=0; switch(Su8KeyStep) { case 1: if(0==Su8ColumnRecord) { COLUMN\_OUTPUT1=0; COLUMN\_OUTPUT2=1; COLUMN\_OUTPUT3=1; } else if(1==Su8ColumnRecord) { COLUMN\_OUTPUT1=1; COLUMN\_OUTPUT2=0; COLUMN\_OUTPUT3=1; } else { COLUMN\_OUTPUT1=1; COLUMN\_OUTPUT2=1; COLUMN\_OUTPUT3=0; } Su16KeyCnt=0; Su8KeyStep++; break; case 2: //等待列輸出穩定,但不是去抖動延時 Su16KeyCnt++; if(Su16KeyCnt>=2) { Su16KeyCnt=0; Su8KeyStep++; } break; case 3: if(1==ROW\_INPUT1&&1==ROW\_INPUT2&&1==ROW\_INPUT3) { Su8KeyStep=1; Su8KeyLock=0; Su16KeyCnt=0; Su8ColumnRecord++; if(Su8ColumnRecord>=3) { Su8ColumnRecord=0; } } else if(0==Su8KeyLock) { if(0==ROW\_INPUT1&&1==ROW\_INPUT2&&1==ROW\_INPUT3) { Su16KeyCnt++; if(Su16KeyCnt>=KEY\_SHORT\_TIME) { Su8KeyLock=1; if(0==Su8ColumnRecord) { vGu8SingleKeySec=1; //單擊任務,觸發1號鍵 對應S1鍵 //“馬上更新輸出列的信號狀態” COLUMN\_OUTPUT1=1; COLUMN\_OUTPUT2=0; //列2也輸出0,非常關鍵的代碼! COLUMN\_OUTPUT3=1; Su16KeyCnt=0; //去抖動延時清零,為下一步計時做準備 Su8KeyStep++; //切換到下一步步驟 } else if(1==Su8ColumnRecord) { vGu8SingleKeySec=2; } else if(2==Su8ColumnRecord) { vGu8SingleKeySec=3; } } } else if(1==ROW\_INPUT1&&0==ROW\_INPUT2&&1==ROW\_INPUT3) { Su16KeyCnt++; if(Su16KeyCnt>=KEY\_SHORT\_TIME) { Su8KeyLock=1; if(0==Su8ColumnRecord) { vGu8SingleKeySec=4; } else if(1==Su8ColumnRecord) { vGu8SingleKeySec=5; } else if(2==Su8ColumnRecord) { vGu8SingleKeySec=6; } } } else if(1==ROW\_INPUT1&&1==ROW\_INPUT2&&0==ROW\_INPUT3) { Su16KeyCnt++; if(Su16KeyCnt>=KEY\_SHORT\_TIME) { Su8KeyLock=1; if(0==Su8ColumnRecord) { vGu8SingleKeySec=7; } else if(1==Su8ColumnRecord) { vGu8SingleKeySec=8; } else if(2==Su8ColumnRecord) { vGu8SingleKeySec=9; } } } } break; case 4: //等待列輸出穩定,但不是去抖動延時 Su16KeyCnt++; if(Su16KeyCnt>=2) { Su16KeyCnt=0; Su8KeyLock=0; //關鍵語句!自鎖清零,為下一步自鎖組合按鍵做準備 Su8KeyStep++; } break; case 5: //判斷S2按鍵 if(1==ROW\_INPUT1&&1==ROW\_INPUT2&&1==ROW\_INPUT3) //S2按鍵沒有被按下 { Su8KeyLock=0; Su16KeyCnt=0; //“馬上更新輸出列的信號狀態” COLUMN\_OUTPUT1=0; //列1輸出0,非常關鍵的代碼! COLUMN\_OUTPUT2=1; COLUMN\_OUTPUT3=1; Su8KeyStep++; //切換到下一個步驟,監控S1是否率先已經松開 } else if(0==Su8KeyLock) { if(0==ROW\_INPUT1&&1==ROW\_INPUT2&&1==ROW\_INPUT3) //S2按鍵被按下 { Su16KeyCnt++; if(Su16KeyCnt>=KEY\_SHORT\_TIME) { Su8KeyLock=1; //組合按鍵的自鎖 vGu8DoubleKeySec=1; //觸發組合按鍵(S1+S2) } } } break; case 6: //等待列輸出穩定,但不是去抖動延時 Su16KeyCnt++; if(Su16KeyCnt>=2) { Su16KeyCnt=0; Su8KeyLock=0; //關鍵語句!自鎖清零,為下一步自鎖組合按鍵做準備 Su8KeyStep++; } break; case 7: //監控S1按鍵是否率先已經松開 if(1==ROW\_INPUT1&&1==ROW\_INPUT2&&1==ROW\_INPUT3) { Su16KeyCnt=0; Su8KeyLock=0; Su8KeyStep=1; //如果S1按鍵已經松開,返回到第一個運行步驟重新開始掃描 Su8ColumnRecord++; if(Su8ColumnRecord>=3) { Su8ColumnRecord=0; } } else { //“馬上更新輸出列的信號狀態” COLUMN\_OUTPUT1=1; COLUMN\_OUTPUT2=0; //列2輸出0,非常關鍵的代碼! COLUMN\_OUTPUT3=1; Su8KeyStep=4; //如果S1按鍵沒有松開,繼續返回判斷S2是否已按下 } break; } } void SingleKeyTask(void) { if(0==vGu8SingleKeySec) { return; } switch(vGu8SingleKeySec) { case 1: //S1按鍵的單擊任務,更改LED燈的顯示狀態 if(0==Gu8LedStatus) { Gu8LedStatus=1; LedOpen(); } else { Gu8LedStatus=0; LedClose(); } vGu8SingleKeySec=0; break; default: vGu8SingleKeySec=0; break; } } void DoubleKeyTask(void) { if(0==vGu8DoubleKeySec) { return; } switch(vGu8DoubleKeySec) { case 1: //S1與S2的組合按鍵觸發,發出“嘀”一聲 vGu8BeepTimerFlag=0; vGu16BeepTimerCnt=KEY\_VOICE\_TIME; vGu8BeepTimerFlag=1; vGu8DoubleKeySec=0; break; } } 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(); } } } }
                  <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>

                              哎呀哎呀视频在线观看