單片機(jī)被廣泛應(yīng)用于工業(yè)控制,家電,消費(fèi)電子,醫(yī)療電子,儀表測(cè)量等領(lǐng)域,為應(yīng)廣大初級(jí)電子工程師/單片機(jī)愛好者之需,電子發(fā)燒友網(wǎng)隆重策劃整合推出《單片機(jī)關(guān)鍵技術(shù)基礎(chǔ)詳解》系列技術(shù)文章,以后會(huì)陸續(xù)推出其他章節(jié),敬請(qǐng)廣大工程師朋友繼續(xù)關(guān)注和留意。應(yīng)廣大工程師網(wǎng)友對(duì)前面章節(jié)熱烈反響,電子發(fā)燒友網(wǎng)會(huì)再接再厲為各位工程師網(wǎng)友推出更多技術(shù)精品系列文章,以饗讀者。
參閱相關(guān)系列章節(jié)
單片機(jī)關(guān)鍵技術(shù)基礎(chǔ)詳解(一)
單片機(jī)關(guān)鍵技術(shù)基礎(chǔ)詳解(二)
單片機(jī)關(guān)鍵技術(shù)基礎(chǔ)詳解(三)
單片機(jī)關(guān)鍵技術(shù)基礎(chǔ)詳解(四)
?
一、單片機(jī)矩陣鍵盤原理與結(jié)構(gòu)
矩陣式結(jié)構(gòu)的鍵盤識(shí)別要復(fù)雜一些,列線通過電阻接正電源,并將行線所接的單片機(jī)的I/O口作為輸出端,而列線所接的I/O口則作為輸入。這樣,當(dāng)按鍵沒有按下時(shí),所有的輸入端都是高電平,代表無鍵按下。行線輸出是低電平,一旦有鍵按下,則輸入線就會(huì)被拉低,這樣,通過讀入輸入線的狀態(tài)就可得知是否有鍵按下了。
在矩陣式鍵盤中,每條水平線和垂直線在交叉處不直接連通,而是通過一個(gè)按鍵加以連接。這樣,一個(gè)端口(如P1口)就可以構(gòu)成4*4=16個(gè)按鍵,比之直接將端口線用于鍵盤多出了一倍,而且線數(shù)越多,區(qū)別越明顯,比如再多加一條線就可以構(gòu)成20鍵的鍵盤,而直接用端口線則只能多出一鍵(9鍵)。由此可見,在需要的鍵數(shù)比較多時(shí),采用矩陣法來做鍵盤是合理的。
《1》確定矩陣式鍵盤上何鍵被按下介紹一種“行掃描法”。
行掃描法 行掃描法又稱為逐行(或列)掃描查詢法,是一種最常用的按鍵識(shí)別方法,如上圖所示鍵盤,介紹過程如下。
1、判斷鍵盤中有無鍵按下 將全部行線Y0-Y3置低電平,然后檢測(cè)列線的狀態(tài)。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵位于低電平線與4根行線相交叉的4個(gè)按鍵之中。若所有列線均為高電平,則鍵盤中無鍵按下。
2、判斷閉合鍵所在的位置 在確認(rèn)有鍵按下后,即可進(jìn)入確定具體閉合鍵的過程。其方法是:依次將行線置為低電平,即在置某根行線為低電平時(shí),其它線為高電平。在確定某根行線位置為低電平后,再逐行檢測(cè)各列線的電平狀態(tài)。若某列為低,則該列線與置為低電平的行線交叉處的按鍵就是閉合的按鍵。
《2》確定矩陣式鍵盤上何鍵被按下介紹一種“高低電平翻轉(zhuǎn)法”。
首先讓P1口高四位為1,低四位為0,。若有按鍵按下,則高四位中會(huì)有一個(gè)1翻轉(zhuǎn)為0,低四位不會(huì)變,此時(shí)即可確定被按下的鍵的行位置。
然后讓P1口高四位為0,低四位為1,。若有按鍵按下,則低四位中會(huì)有一個(gè)1翻轉(zhuǎn)為0,高四位不會(huì)變,此時(shí)即可確定被按下的鍵的列位置。
最后將上述兩者進(jìn)行或運(yùn)算即可確定被按下的鍵的位置。
更多矩陣鍵盤的資料請(qǐng)?jiān)L問http://www.brongaenegriffin.com/zhuanti/20111025226587.html
二、什么是格雷碼
格雷碼(Gray code),又叫循環(huán)二進(jìn)制碼或反射二進(jìn)制碼 在數(shù)字系統(tǒng)中只能識(shí)別0和1,各種數(shù)據(jù)要轉(zhuǎn)換為二進(jìn)制代碼才能進(jìn)行處理,格雷碼是一種無權(quán)碼,采用絕對(duì)編碼方式,典型格雷碼是一種具有反射特性和循環(huán)特性的單步自補(bǔ)碼,它的循環(huán)、單步特性消除了隨機(jī)取數(shù)時(shí)出現(xiàn)重大誤差的可能,它的反射、自補(bǔ)特性使得求反非常方便。格雷碼屬于可靠性編碼,是一種錯(cuò)誤最小化的編碼方式
簡(jiǎn)介
因?yàn)?,自然二進(jìn)制碼可以直接由數(shù)/模轉(zhuǎn)換器轉(zhuǎn)換成模擬信號(hào),但某些情況,例如從十進(jìn)制的3轉(zhuǎn)換成4時(shí)二進(jìn)制碼的每一位都要變,使數(shù)字電路產(chǎn)生很大的尖峰電流脈沖。而格雷碼則沒有這一缺點(diǎn),它是一種數(shù)字排序系統(tǒng),其中的所有相鄰整數(shù)在它們的數(shù)字表示中只有一個(gè)數(shù)字不同。它在任意兩個(gè)相鄰的數(shù)之間轉(zhuǎn)換時(shí),只有一個(gè)數(shù)位發(fā)生變化。它大大地減少了由一個(gè)狀態(tài)到下一個(gè)狀態(tài)時(shí)邏輯的混淆。另外由于最大數(shù)與最小數(shù)之間也僅一個(gè)數(shù)不同,故通常又叫格雷反射碼或循環(huán)碼。
2、格雷碼對(duì)照表
下表為幾種自然二進(jìn)制碼與格雷碼的對(duì)照表:
一般的,普通二進(jìn)制碼與格雷碼可以按以下方法互相轉(zhuǎn)換:
二進(jìn)制碼-》格雷碼(編碼):從最右邊一位起,依次將每一位與左邊一位異或(XOR),作為對(duì)應(yīng)格雷碼該位的值,最左邊一位不變(相當(dāng)于左邊是0);
格雷碼-〉二進(jìn)制碼(解碼):從左邊第二位起,將每位與左邊一位解碼后的值異或,作為該位解碼后的值(最左邊一位依然不變)。
數(shù)學(xué)(計(jì)算機(jī))描述:
原碼:p[n:0];格雷碼:c[n:0](n∈N);編碼:c=G(p);解碼:p=F(c);
書寫時(shí)按從左向右標(biāo)號(hào)依次減小,即MSB-》LSB,編解碼也按此順序進(jìn)行
編碼:
。..。..。..。..。..。...c[n]=p[n],
。..。..。..。..。..。...c[i]=p[i] XOR p[i+1] (i∈N,n-1≥i≥0);
解碼:
。..。..。..。..。..。...p[n]=c[n],
。..。..。..。..。..。...P[i]=c[i] XOR p[i+1] (i∈N, n-1≥i≥0)。
Gray Code是由貝爾實(shí)驗(yàn)室的Frank Gray在20世紀(jì)40年代提出的(是1880年由法國工程師Jean-Maurice-Emlle
Baudot發(fā)明的),用來在使用PCM(Pusle Code Modulation)方法傳送訊號(hào)時(shí)避免出錯(cuò),并于1953年3月17日取得美國專利。由定義可知,Gray Code的編碼方式不是唯一的,這里討論的是最常用的一種。
用異或乘除法實(shí)現(xiàn)二進(jìn)制碼與格雷碼互相轉(zhuǎn)換
如果在二進(jìn)制運(yùn)算中忽略進(jìn)位、退位,那么加減運(yùn)算都變成了異或(XOR)。
用異或代替加減進(jìn)行二進(jìn)制豎式乘除,稱為異或乘除,它的特點(diǎn)是無進(jìn)退位。
由于沒有退位,異或除法將變得更像多項(xiàng)式除法。
如:10101除以11將變成1100余1,而不是111。
二進(jìn)制轉(zhuǎn)格雷碼:
只要異或乘以二分之三,即二進(jìn)制的1.1,然后忽略小數(shù)部分;也可以理解成異或乘以三(即11),再右移一位。
格雷碼轉(zhuǎn)二進(jìn)制:
異或乘以三分之二,即除以1.1,忽略余數(shù);或者左移一位,再異或除以三,忽略余數(shù)。
格雷碼轉(zhuǎn)二進(jìn)制方法
二進(jìn)位碼第n位 = 二進(jìn)位碼第(n+1)位+格雷碼第n位。因?yàn)槎M(jìn)位碼和格雷碼皆有相同位數(shù),所以二進(jìn)位碼可從最高位的左邊位元取0,以進(jìn)行計(jì)算。(注:遇到1+1時(shí)結(jié)果視為0)
例如: 格雷碼0111,為4位數(shù),所以其所轉(zhuǎn)為之二進(jìn)位碼也必為4位數(shù),因此可取轉(zhuǎn)成之二進(jìn)位碼第五位為0,即0 b3 b2 b1 b0。
0+0=0,所以b3=0
0+1=1,所以b2=1
1+1取0,所以b1=0
0+1取1,所以b0=1
因此所轉(zhuǎn)換為之二進(jìn)位碼為0101
格雷碼轉(zhuǎn)換快速方法
(假設(shè)以二進(jìn)制為0的值做為格雷碼的0)
G:格雷碼 B:二進(jìn)位碼
G(N) = B(n+1) XOR B(n)
評(píng)論