久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2158|回復: 1
打印 上一主題 下一主題
收起左側

定時器加按鍵學習

[復制鏈接]
跳轉到指定樓層
樓主
ID:332111 發表于 2018-6-2 15:04 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
8.4 按鍵
8.4.1 獨立按鍵 常用的按鍵電路有兩種形式,獨立式按鍵和矩陣式按鍵,獨立式按鍵比較簡單,它們各自與獨立的輸入線相連接,如圖 8-6 所示。
                              
8-6     獨立式按鍵原理圖
4 條輸入線接到單片機的 IO 口上,當按鍵 K1 按下時,+5V 通過電阻 R1 然后再通過按K1 最終進入GND 形成一條通路,那么這條線路的全部電壓都加到了R1 這個電阻上,KeyIn1 這個引腳就是個低電平。當松開按鍵后,線路斷開,就不會有電流通過,那么 KeyIn1 +5V 就應該是等電位,是一個高電平。我們就可以通過 KeyIn1 這個 IO 口的高低電平來判斷是否有按鍵按下。
準雙向IO 口,如果要正常讀取外部信號的狀態,必須首先得保證自己內部輸出的是 1,如果內部輸出 0,則無論外部信號是 1 還是 0,這個引腳讀進來的都是 0。
8.4.2 矩陣按鍵 在某一個系統設計中,如果需要使用很多的按鍵時,做成獨立按鍵會大量占用IO 口,因此我們引入了矩陣按鍵的設計。如圖 8-8 所示,是我們的 KST-51 開發板上的矩陣按鍵電路原理圖,使用 8 IO 口來實現了 16 個按鍵。
8-8     矩陣按鍵原理圖
如果獨立按鍵理解了,矩陣按鍵也不難理解,那么我們一起來分析一下。圖8-8 中,一共有 4 組按鍵,我們只看其中一組,如圖 8-9 所示。大家認真看一下,如果 KeyOut1 輸出一個低電平,KeyOut1 就相當于是 GND,是否相當于 4 個獨立按鍵呢。當然這時候 KeyOut2、KeyOut3KeyOut4 都必須輸出高電平,它們都輸出高電平才能保證與它們相連的三路按鍵 不會對這一路產生干擾,大家可以對照兩張原理圖分析一下。
8-9     矩陣按鍵變獨立按鍵示意圖
  8.4.4 按鍵消抖 通常按鍵所用的開關都是機械彈性開關,當機械觸點斷開、閉合時,由于機械觸點的彈性作用,一個按鍵開關在閉合時不會馬上就穩定的接通,在斷開時也不會一下子徹底斷開,而是在閉合和斷開的瞬間伴隨了一連串的抖動,如圖 8-10 所示。
8-10    按鍵抖動狀態圖按鍵穩定閉合時間長短是由操作人員決定的,通常都會在 100ms 以上,刻意快速按的話能達到 40-50ms 左右,很難再低了。抖動時間是由按鍵的機械特性決定的,一般都會在 10ms 以內,為了確保程序對按鍵的一次閉合或者一次斷開只響應一次,必須進行按鍵的消抖處理先等待一個10ms 左右的延時時間,讓抖動消失后再進行一次按鍵狀態檢測,如果與剛才檢測到的狀態相同,就可以確認按鍵已經穩定的動作了。將上一個的程 序稍加改動,得到新的帶消抖功能的程序如下。
那么消抖操作所需要的延時該怎么處理呢?其實除了這種簡單的延時,我們還有更優異的方法來處理按鍵抖動問題。舉個例子:我們啟用一個定時中斷,每 2ms 進一次中斷,掃描一次按鍵狀態并且存儲起來,連續掃描8 次后,看看這連續8 次的按鍵狀態是否是一致的。8 次按鍵的時間大概是 16ms,這 16ms 內如果按鍵狀態一直保持一致,那就可以確定現在按鍵處于穩定的階段,而非處于抖動的階段,如圖 8-12。
8-12    按鍵連續掃描判斷
假如左邊時間是起始 0 時刻,每經過 2ms 左移一次,每移動一次,判斷當前連續的 8       
        
   
   
        
        
   
   
        
        
   
   
   
按鍵狀態是不是全 1 或者全 0,如果是全 1 則判定為彈起,如果是全 0 則判定為按下,如果0 1 交錯,就認為是抖動,不做任何判定。想一下,這樣是不是比簡單的延時更加可靠?利用這種方法,就可以避免通過延時消抖占用單片機執行時間,而是轉化成了一種按鍵狀態判定而非按鍵過程判定,我們只對當前按鍵的連續 16ms 8 次狀態進行判斷,而不再關心它在這16ms 內都做了什么事情.
8.4.5 矩陣按鍵的掃描
我們講獨立按鍵掃描的時候,大家已經簡單認識了矩陣按鍵是什么樣子了。矩陣按鍵相當于 4 組每組各 4 個獨立按鍵,一共是 16 個按鍵。那我們如何區分這些按鍵呢?想一下我們生活所在的地球,要想確定我們所在的位置,就要借助經緯線,而矩陣按鍵就是通過行線 和列線來確定哪個按鍵被按下的。那么在程序中我們又如何進行這項操作呢?
前邊講過,按鍵按下通常都會保持 100ms 以上,如果在按鍵掃描中斷中,我們每次讓矩陣按鍵的一個 KeyOut 輸出低電平,其它三個輸出高電平,判斷當前所有 KeyIn 的狀態,下次中斷時再讓下一個 KeyOut 輸出低電平,其它三個輸出高電平,再次判斷所有 KeyIn,通過快速的中斷不停的循環進行判斷,就可以最終確定哪個按鍵按下了,這個原理是不是跟數碼 管動態掃描有點類似?數碼管我們在動態賦值,而按鍵這里我們在動態讀取狀態。至于掃描 間隔時間和消抖時間,因為現在有 4 KeyOut 輸出,要中斷 4 次才能完成一次全部按鍵的掃描,顯然再采用 2ms 中斷判斷 8 次掃描值的方式時間就太長了2*4*8=64ms),那么我們就改用 1ms 中斷判斷 4 次采樣值,這樣消抖時間還是 16ms(1*4*4)。下
/**************按鍵掃描***********************
*  函數名稱:Keyscan
*  函數參數:void
*  函數功能:完成矩陣按鍵或單獨按鍵的掃描,矩陣按鍵使用二維數組;單獨按鍵使用一維數組
*  作者:ZYD
*  日期:2018
*/
void Keyscan(void)  //本函數要循環4次起作用
{
         uint8i;
         staticuint8 keyout = 0;
         staticuint8 keybuf[4][4] =
         {
                  {0xff,0xff,0xff,0xff,},  //可用緩沖區
                  {0xff,0xff,0xff,0xff,},
                  {0xff,0xff,0xff,0xff,},
                  {0xff,0xff,0xff,0xff,},
         };
/***********按鍵的out伏低電平,掃描低電平***********/
         switch(keyout)
         {
                  case0:P2=0x7f;break;  //0111 1111
                  case1:P2=0xbf;break;  //1011 1111
                  case2:P2=0xdf;break;  //1101 1111
                  case3:P2=0xef;break;  //1110 1111
                  default:break;
         }      
         //P21= 1; //單獨賦值,保證數碼管最后一位正常      
/************按鍵按列掃描移位,一個語句完成一列*******/
         keybuf[keyout][0]<<=1;keybuf[keyout][0]|=P20;  //in1
//     keybuf[keyout][1]<<=1;keybuf[keyout][1]|=P21;  //in2
//     keybuf[keyout][2]<<=1;keybuf[keyout][2]|=P22;  //in3
//     keybuf[keyout][3]<<=1;keybuf[keyout][3]|=P23;  //in4
P21 = 0; //單獨賦值,保證數碼管最后一位正常   
         for(i=0;i<4;i++)     //4次中斷的取樣
         {
                  if((keybuf[keyout]&0x0f)== 0x0f)    //只要掃描不連續的四位就可以,形成16ms消抖
                  {                                       //4*4MS內都是0000,就成立了
                          keysta[keyout]= 1;
                  }
                  elseif((keybuf[keyout]&0x0f) == 0x00)
                          keysta[keyout]= 0;
                  else
                     {}
         }
         keyout++;
         keyout&=0x03;//與字來清零
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1 發表于 2018-8-26 04:14 | 只看該作者
此貼需要補全資料后才可獲得積分
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久国产一区二区三区 | 免费国产一区二区 | 亚洲国产精品一区二区第一页 | 小草久久久久久久久爱六 | 日日干日日操 | 日韩天堂av | 欧美性a视频 | 亚洲综合日韩精品欧美综合区 | 国产在线观看av | 宅女噜噜66国产精品观看免费 | 久久久久久久久国产精品 | 一级黄色录像毛片 | www.五月天婷婷.com | 亚洲综合色视频在线观看 | 亚洲成a人片 | 国产精品美女久久久 | 1区2区3区视频 | 综合久久国产 | 一级片在线免费看 | av毛片在线播放 | 在线免费黄色小视频 | 中文字幕av在线播放 | 免费电影av | 国产视频福利在线观看 | 成人欧美一区二区三区在线观看 | 天天色官网 | 国产精品视频一区二区三区四区国 | 黄色91在线 | 国产一区2区 | 亚洲欧美日韩中文在线 | 国产精品国产成人国产三级 | 欧美成人免费 | 久久综合久久久 | 国产成人a亚洲精品 | 91亚洲精品在线 | 国产精品久久久久aaaa九色 | 精品日韩在线 | 国产精品99久久久久久宅男 | 国产一区二区在线免费观看 | 午夜国产一级 | 日韩一区二区福利视频 |