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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

4*4 矩陣鍵盤工作原理

[復制鏈接]
跳轉到指定樓層
樓主
ID:111050 發表于 2016-3-27 19:41 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

在單片機按鍵使用過程中,當鍵盤中按鍵數量較多時為了減少端口的占用通常將按鍵排列成矩陣 形式如下圖所示,在矩陣式鍵盤中每條水平線和垂直線在交叉處不直接連通而是通過一個按鍵加以連接,到底這樣做是出意何種目的呢?大家看下面電路圖,單片機的整一個8位端口可以構成 4*4=16 個矩陣式按鍵,相比獨立式按鍵接法多出了一倍,而且線數越多區別就越明顯,假如再多加一條線就可以構成20個按鍵的鍵盤,但是獨立式按鍵接法只能多出1個按鍵。由此可見,在需要的按鍵數量比較多時,采用矩陣法來連接鍵盤是非常合理的,矩陣式結構的鍵盤顯然比獨立式鍵盤復雜一些,單片機對其進行識別也要復雜一些。確定矩陣式鍵盤上任何一個鍵被按下通常采用行掃描法。行掃描法又稱為逐行查詢法它是一種最常用的多按鍵識別方法。因此,我們就以行掃描法為例介紹矩陣式鍵盤的工作原理。

圖5-4(4*4矩陣式按鍵的接法)

首先,不斷循環地給低四位獨立的低電平,然后判斷鍵盤中有無鍵按下。將低位中其中一列線(P1.0~P1.3中其中一列)置低電平然后檢測行線的狀態(高4位,即P1.4~P1.7,由于線與關系,只要與低電平列線接通,即跳變成低電平),只要有一行的電平為低就延時一段時間以消除抖動,然后再次判斷,假如依然為低電平,則表示鍵盤中真的有鍵被按下而且閉合的鍵位于低電平的4個按鍵之中任其一,若所有行線均為高電平則表示鍵盤中無鍵按下。再其次,判斷閉合鍵所在的具體位置。在確認有鍵按下后,即可進入確定具體閉合鍵的過程。其方法是:依次將列線置為低電平,即在置某一根列線為低電平時,其它列線為高電平。同時再逐行檢測各行線的電平狀態 ;若某行為低,則該行線與置為低電平的列線交叉處的按鍵就是閉合的按鍵。下面圖5-5是4*4矩陣式按鍵接法的軟件算法操作流程。

下面程序按照上述算法流程編寫的,其電路如圖5-6,只是在圖5-5的基礎上多加了P0端口的8LED燈。從鍵盤中檢測到一個鍵值,然后將這個值寫到LED數碼管上顯示。

另外一種工作原理:


1、4×4矩陣鍵盤的工作原理

矩陣鍵盤又稱為行列式鍵盤,它是用4條I/O線作為行線,4條I/O線作為列線組成的鍵盤。在行線和列線的每一個交叉點上,設置一個按鍵。這樣鍵盤中按鍵的個數是4×4個。這種行列式鍵盤結構能夠有效地提高單片機系統中I/O口的利用率。

圖1為ME300B矩陣鍵盤電路圖,行線接P1.4-P1.7,列線接P1.0-P1.3。

圖1  矩陣鍵盤電路

圖2  按鍵排列

2、數碼管動態掃描顯示電路

在ME300B開發系統中,采用了8位數碼管動態掃描顯示。它將所有數碼管的8個段線相應地并接在一起,并接到 AT89S51的P0口,由P0口控制字段輸出。而各位數碼管的共陽極由AT89S51的P2口控制Q20-Q27來實現8位數碼管的位輸出控制。

這樣,對于一組數碼管動態掃描顯示需要由兩組信號來控制:一組是字段輸出口輸出的字形代碼,用來控制顯示的字形,稱為段碼;另一組是位輸出口輸出的控制信號,用來選擇第幾位數碼管工作,稱為位碼。

由于各位數碼管的段線并聯,段碼的輸出對各位數碼管來說都是相同的。因此,同一時刻如果各位數碼管的位選線都處于選通狀態的話,8位數碼管將顯示相同的字符。若要各位數碼管能夠顯示出與本位相應的字符,就必須采用掃描顯示方式。即在某一時刻,只讓某一位的位選線處于導通狀態,而其它各位的位選線處于關閉狀態。同時,段線上輸出相應位要顯示字符的字型碼。這樣同一時刻,只有選通的那一位顯示出字符,而其它各位則是熄滅的,如此循環下去,就可以使各位數碼管顯示出將要顯示的字符。

雖然這些字符是在不同時刻出現的,而且同一時刻,只有一位顯示,其它各位熄滅,但由于數碼管具有余輝特性和人眼有視覺暫留現象,只要每位數碼管顯示間隔足夠短,給人眼的視覺印象就會是連續穩定地顯示。

圖3  數碼管電路

數碼管不同位顯示的時間間隔可以通過調整延時程序的延時長短來完成。數碼管顯示的時間間隔也能夠確定數碼管顯示時的亮度,若顯示的時間間隔長,顯示時數碼管的亮度將亮些,若顯示的時間間隔短,顯示時數碼管的亮度將暗些。若顯示的時間間隔過長的話,數碼管顯示時將產生閃爍現象。所以,在調整顯示的時間間隔時,即要考慮到顯示時數碼管的亮度,又要數碼管顯示時不產生閃爍現象。

在ME300B單片機開發系統中使用數碼管來顯示信息時,要將JP2的2、3端短接。見圖3

二、演示程序的編程方法

1、4×4矩陣鍵盤的編程方法:

1.1、先讀取鍵盤的狀態,得到按鍵的特征編碼。

先從P1口的高四位輸出低電平,低四位輸出高電平,從P1口的低四位讀取鍵盤狀態。再從P1口的低四位輸出低電平,高四位輸出高電平,從P1口的高四位讀取鍵盤狀態。將兩次讀取結果組合起來就可以得到當前按鍵的特征編碼。使用上述方法我們得到16個鍵的特征編碼。

舉例說明如何得到按鍵的特征編碼:

假設“1”鍵被按下,找其按鍵的特征編碼。

從P1口的高四位輸出低電平,即P1.4-P1.7為輸出口。低四位輸出高電平,即P1.0-P1.3為輸入口。讀P1口的低四位狀態為“ 1101”,其值為“0DH”。

再從P1口的高四位輸出高電平,即P1.4-P1.7為輸入口。低四位輸出低電平,即P10-P13為輸出口,讀P1口的高四位狀態為“1110”,其值為“E0H”。

將兩次讀出的P0口狀態值進行邏輯或運算就得到其按鍵的特征編碼為“EDH”。

用同樣的方法可以得到其它15個按鍵的特征編碼。

1.2、根據按鍵的特征編碼,查表得到按鍵的順序編碼。

將用上述方法得到的
16
個按鍵的特征編碼按圖
2
按鍵排列的順序排成一張特征編碼與順序編碼的對應關系表,然后用當前讀得的特征編碼來查表,當表中有該特征編碼時,它所在的位置就是對應的順序編碼。

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:1 發表于 2016-3-27 20:09 | 只看該作者

矩陣鍵盤的編程方法——讀取鍵值

矩陣鍵盤的使用在單品機的學習當中十分廣泛,可是對于許多新手,包括本人有時也是搞不明白,昨天晚上和今天早上的思考和同行們的討論,終于有了點頭緒,所以想記錄下讀取鍵盤的思路。在單片機的學習版中,矩陣鍵盤通常如下圖設計:


下面就以按下S16鍵來講解其思路:
首先:
P3的高位P3.4~P3.7輸出為0,低位P3.0~P3.3輸出為1;即P3=0x0F,當按下S16鍵后(有消抖動過程),P3.3的值為0,則P3的值更新為0x07;
其次:
P3的高位P3.4~P3.7輸出為1,低位P3.0~P3.3輸出為0;即P3=0xF0,當按下S16鍵后(有消抖動過程),P3.4的值為0,則P3的值更新為0xE0;
最后將兩個值相加得P3=0xE7;

在keyscan()函數(假設我們的鍵盤掃描程序為unsigned char keyscan())返回其鍵盤的值供后續的程序調用,通常會有一個switch塊根據其返回值來確定輸出的是哪一個數值。

下面提供一段KeilC51語言的代碼來解釋一下:
  1. /*------------------------------------------------
  2.               鍵盤掃描程序
  3. ------------------------------------------------*/  
  4. uchar keyscan( void )  //鍵盤掃描函數,使用行列反轉掃描法  
  5. {  
  6.     uchar cord_h,cord_l;//行列值中間變量  
  7.     P3 = 0x0f;            //行線輸出全為0  
  8.     cord_h = P3 & 0x0f;     //讀入列線值  
  9.     if( cord_h != 0x0f )    //先檢測有無按鍵按下  
  10.     {  
  11.         delay( 100 );        //去抖  
  12.         if( cord_h != 0x0f )  
  13.         {  
  14.             cord_h = P3 & 0x0f;  //讀入列線值  
  15.             P3 = cord_h | 0xf0;  //輸出當前列線值  
  16.             cord_l = P3 & 0xf0;  //讀入行線值  
  17.             return( cord_h + cord_l );//鍵盤最后組合碼值  
  18.         }  
  19.     }  
  20.     return( 0xff );     //返回該值  
  21. }  
復制代碼


首先把P3的口賦值為0x0f,同時把P3和0x0f賦值給cord_h(行的數值),倘若有按鍵按下,那么P3的值就會改變,隨后cord_h的只也會隨之變化,經過消抖之后記錄cord_h的值,
即cord_h = P3 & 0x0f;
(若以S16為例,那么P3.3的值變為0,所以cord_h的值就會變為0x07;)
接下來:P3 = cord_h | 0xf0;
意在不改變P3的第四位,把P3的高四位賦為高電平,那么P3=0x0f7;
到了關鍵的一步:
cord_l = P3 & 0xf0;我當初以為cord_l=0xf0呢,結果就和程序運行的不一樣嘍,最后還是問了我的同行(非常感謝劉偉同志!指點迷津。,其實在第二個if語言內,S16已經被按下了的,所以P3的值立刻就變為0x0e的了,以至于cord_l=0x0e,最后返回行和列的和return( cord_h + cord_l );(0xe7)。這才是最終對的結果,各位看官懂了嗎?O(∩_∩)O哈哈~
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品视频入口 | 99视频在线免费观看 | 亚洲自拍偷拍欧美 | 人人操日日干 | 成人国产精品久久久 | 视频第一区 | 综合国产 | 亚洲精品黄色 | 久久精品综合网 | 日韩中文字幕在线 | 欧美综合视频在线 | 欧美1区 | 人人干免费 | 免费在线观看一区二区三区 | 色综合一区二区 | 一区二区精品 | 欧美精品一区三区 | 91成人精品 | av影音| 91天堂网| 国产精品久久久久一区二区三区 | 夜夜操天天艹 | 红桃视频一区二区三区免费 | 国产精品99久久久久久大便 | 亚洲 精品 综合 精品 自拍 | 综合一区 | 日韩高清国产一区在线 | 亚洲aⅴ一区二区 | 一区二区三区精品视频 | 国产黄色麻豆视频 | 精品国产乱码久久久久久闺蜜 | 日韩在线电影 | 色视频欧美 | 亚洲看片网站 | 欧美日韩一区二区在线观看 | 日韩在线中文字幕 | 欧美综合久久 | 亚洲在线免费 | 激情一区二区三区 | 欧美在线小视频 | 久久99精品久久久久久国产越南 |