MSP430按鍵輸入和led點陣顯示解讀_第1頁
MSP430按鍵輸入和led點陣顯示解讀_第2頁
MSP430按鍵輸入和led點陣顯示解讀_第3頁
MSP430按鍵輸入和led點陣顯示解讀_第4頁
MSP430按鍵輸入和led點陣顯示解讀_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上第4章 鍵盤和顯示器的應(yīng)用 在單片機(jī)應(yīng)用系統(tǒng)中,鍵盤和顯示器是非常重要的人機(jī)接口。人機(jī)接口是指人與計算機(jī)系統(tǒng)進(jìn)行信息交互的接口,包括信息的輸入和輸出。常用輸入設(shè)備主要是鍵盤,常用輸出設(shè)備包括發(fā)光二極管、數(shù)碼管和液晶顯示器等。4.1 鍵盤輸入 鍵盤用于實現(xiàn)單片機(jī)應(yīng)用系統(tǒng)中的數(shù)據(jù)信息和控制命令的輸入,按結(jié)構(gòu)可分為編碼鍵盤和非編碼鍵盤。編碼鍵盤上閉合鍵的識別由專用的硬件編碼器實現(xiàn),并產(chǎn)生相應(yīng)的鍵碼值,如計算機(jī)鍵盤。非編碼鍵盤是通過軟件的方法產(chǎn)生鍵碼,不需要專用的硬件電路。為了減少電路的復(fù)雜程度,節(jié)省單片機(jī)的I/O口,在單片機(jī)應(yīng)用系統(tǒng)中廣泛使用非編碼鍵盤,主要對象是各種按鍵或

2、開關(guān)。這些按鍵或開關(guān)可以獨立使用(稱之為獨立鍵盤),也可以組合使用(稱之為矩陣式鍵盤)。4.1.1 按鍵電路與按鍵抖動處理按鍵電路連接方法非常簡單,如圖4.1所示。此電路用于通過外力使按鍵瞬時接通開關(guān)的場合,如單片機(jī)的RESET電路中,通過按鍵產(chǎn)生一個瞬時的低電壓,CPU感知這個低電壓后重啟。圖4.1 按鍵復(fù)位電路 由于按鍵的閉合與斷開都是利用其機(jī)械彈性實現(xiàn)的,當(dāng)機(jī)械觸點斷開、閉合時,會產(chǎn)生抖動,這種抖動操作用戶感覺不到,但對CPU來說,其輸出波形則明顯發(fā)生變化,如圖4.2所示。圖4.2 按鍵開、閉時的電壓抖動波形 按鍵按下和釋放時的抖動時間一般為 1020ms ,按鍵的穩(wěn)定閉合期由操作用戶的

3、按鍵動作決定,一般為幾百毫秒到幾秒,而單片機(jī)CPU的處理速度在微秒極,因此,按鍵的一次閉合,有可能導(dǎo)致CPU的多次響應(yīng)。為了避免這種錯誤操作,必須對按鍵電路進(jìn)行去抖動處理。常用的去抖動方法有硬件方式和軟件方式兩種。使用硬件去抖動的方式,需要在按鍵連接的硬件設(shè)計上增加硬件去抖電路,比如將按鍵輸出信號經(jīng)過R-S 觸發(fā)器或 RC 積分電路后再送入單片機(jī),就可以保證按一次鍵只發(fā)出一個脈沖。軟件方式去抖動的基本原理是在軟件中采用時間延遲,對按鍵進(jìn)行兩次測試確認(rèn),即在第一次檢測到按鍵按下后,間隔 10ms左右,再次檢測該按鍵是否按下,只有在兩次都測到按鍵按下時才最終確認(rèn)有鍵按下,這樣就可以避開抖動時間段,

4、消除抖動影響。同樣,在按鍵釋放時也采用相同方法。由于人的按鍵速度比單片機(jī)的運(yùn)行速度要慢很多,所以,軟件延時方法從技術(shù)上完全可行,而且經(jīng)濟(jì)上更加實惠,因此被廣泛采用。 4.1.2 獨立鍵盤檢測 獨立鍵盤是一種最簡單的鍵盤,前面章節(jié)已經(jīng)介紹過使用獨立鍵盤的實例。獨立按鍵的每個鍵單獨占用一根I/O口線,每根I/O口線上的按鍵工作狀態(tài)不會影響其他I/O線的工作狀態(tài)。實例4-1 獨立按鍵編號顯示任務(wù)要求:單片機(jī)端口連接3個按鍵,從13進(jìn)行編號,如果其中一個按鍵按下時,則在LED數(shù)碼管上顯示相應(yīng)的按鍵編號。1)硬件電路設(shè)計選取MSP430F249單片機(jī)的P1口連接數(shù)碼管顯示按鍵編號,P3口的P3.0、 P

5、3.1、P3.2端口分別和3個按鍵連接。硬件電路如圖4.3所示。圖4.3 獨立鍵盤檢測電路圖3個 I/O 口 P3.0、 P3.1、P3.2作為輸入口(輸入方式),分別與 K1、K2、K3 三個按鍵連接。當(dāng)按鍵斷開時,I/O口的輸入為高電平,按鍵閉合時,I/O口的輸入為低電平。此3個引腳上接了上拉電阻,是為了保證按鍵斷開時邏輯電平為高。2)程序設(shè)計按鍵閉合時,與該鍵相連的I/O 引腳為低電平;按鍵斷開時,與該鍵相連的I/O 引腳為高電平。所以在程序中通過P3IN寄存器讀取P3.0、 P3.1、P3.2這3個I/O口的電平狀態(tài),便可檢測按鍵是否按下。另外,在有按鍵按下時,要有一定的延時,以防止由

6、于鍵盤抖動而引起誤操作。當(dāng)確認(rèn)某按鍵按下后,就讓數(shù)碼管顯示其按鍵編號。#include "MSP430f249.h"unsigned char const table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71; /共陰數(shù)碼管段選碼表,無小數(shù)點void delayus(unsigned int t) unsigned int i; while(t-) for(i=1330;i>0;i-);unsigned char ReadKey(void) unsi

7、gned char temp; temp= P3IN&0x07; if(temp!= 0x07) delayus(10); /等待按鍵抖動時間 if(temp = (P3IN&0x07 ) return temp; else return 0xFF; else return 0xFF;void main(void) unsigned char key,i; WDTCTL=WDTPW + WDTHOLD; / 關(guān)閉看門狗 P1DIR=0xFF; / 設(shè)置方向 P1OUT=0x00; P3DIR = 0x00; /P3口作為鍵盤輸入 while(1) key = ReadKey()

8、; switch(key) case 0x06: P1OUT=table1; break; case 0x05: P1OUT=table2; break; case 0x03: P1OUT=table3; break; 程序說明:當(dāng)按鍵按下時,P3口的低三位將不全為高電平。在ReadKey函數(shù)中,當(dāng)判斷到P3的低三位不全為1,即0x07時,則認(rèn)為有按鍵按下,然后延遲20ms,再次判斷P3的低三位,如果低三位依舊不全為1,可以確定是有鍵按下,并獲取鍵值后顯示在數(shù)碼管上。3)仿真結(jié)果與分析雙擊msp430F249單片機(jī),裝載可執(zhí)行文件。運(yùn)行時,LED最初沒有顯示。當(dāng)按下某鍵時,將顯示相應(yīng)的數(shù)值。圖

9、4.4為編號為“3”的按鍵被按下時的仿真效果圖。圖4.4 獨立鍵盤檢測的仿真效果圖4.1.3 矩陣式鍵盤檢測獨立鍵盤與單片機(jī)連接時,每一個按鍵開關(guān)占用一個I/O口線,若單片機(jī)系統(tǒng)中需要較多按鍵時,獨立按鍵的方式便會占用過多的I/O口資源。此時,為了節(jié)省I/O口線,采用矩陣式鍵盤(也稱為行列式鍵盤)。下面以4×4矩陣式鍵盤為例講解其工作原理和檢測方法。將16個按鍵排成4行4列,第一行每個按鍵的一端連接在一起構(gòu)成行線,第一列將每個按鍵的另一端連接在一起構(gòu)成列線,這樣便一共有4行4列共8根線,如圖4-5所示。將這8根線連接到單片機(jī)的8個I/O口上,即可通過程序掃描鍵盤檢測到是哪個按鍵被按下

10、,具體方法見實例4-2。圖4.5 4×4矩陣式鍵盤實例4-2 矩陣鍵盤編號顯示任務(wù)要求:將4×4矩陣式鍵盤編號,如果其中一個按鍵按下時,則在LED數(shù)碼管上顯示相應(yīng)的按鍵編號。 分析說明:4×4矩陣式鍵盤只需要占用一個8位的端口,硬件設(shè)計較為簡潔,重點在于如何在程序中判斷矩陣鍵盤的按鍵位置。1)硬件電路設(shè)計選取MSP430F249單片機(jī)的P1口連接數(shù)碼管,P3口的8個引腳分別和矩陣式鍵盤的行線和列線連接。硬件電路如圖4.6所示。圖4.6 矩陣式鍵盤電路原理圖 圖4.6中列線P3.4P3.7通過上拉電阻接電源,處于輸入狀態(tài),行線P3.0P3.3為輸出狀態(tài)。鍵盤上沒有按

11、鍵閉合時,所有列線P 3.4P 3.7輸入全部為高電平。當(dāng)鍵盤上某個按鍵閉合時,則對應(yīng)的行線和列線短接。例如10號鍵被按下時,行線P3.1和列線P3.5短接,此時P3.5輸入電平由P3.2的輸出電平?jīng)Q定。在檢測是否有鍵按下時,先使4條行線全部輸出低電平,然后讀取4條列線的狀態(tài)。如果全部為高電平則表示沒有任何鍵被按下;如果有任一鍵被按下,由于列線是上拉至VCC則行線上讀到的將是一個非全“1”的值。2)程序設(shè)計確定矩陣式鍵盤上哪個鍵被按下通常采用行掃描法,又稱為逐行(或列)掃描查詢法,其軟件主要基于掃描方式完成。關(guān)于鍵盤掃描查詢的程序大致可分為以下幾個步驟:(1) 檢測當(dāng)前是否有鍵被按下。 首先看

12、輸入的列線,假設(shè)4條行線都輸出低電平,4條列線都是上拉至VCC的,在沒有任何按鍵按下時4條列線輸入都為“1”。但當(dāng)與某一條行線相連的4個按鍵中的任何一個被按下時,這條列線將輸入低電平,即當(dāng)某條列線輸入低電平時,必定是連接在這條列線上的某個按鍵被按下了。(2)去除鍵抖動。當(dāng)檢測到有鍵被按下后,延時一段時間再作下一步的檢測判斷。(3) 若有鍵被按下,檢測出是哪一個鍵被按下。逐行掃描方式:在4條行線上分別輸出“0”信號,也就是說,第一次,在P3.0上輸出低電平,其他的行線(P3.1、P3.2、P3.3)上輸出高電平;接著第二次,在P3.1上輸出低電平,其他的行線(P3.0、P3.2、P3.3)上輸出

13、高電平;第三次,在P3.2上輸出低電平,其他的行線(P3.0、P3.1、P3.3)上輸出高電平;第四次,在P3.3上輸出低電平,其他的行線(P3.0、P3.1、P3.2)上輸出高電平。當(dāng)某一行線上輸出低電平時,如果此行上有鍵被按下,那么相應(yīng)按鍵的列線上則會讀取到“0”,于是可以惟一的確定是哪一按鍵被按下了。假設(shè)圖4.6中的編號“6”的按鍵被按下,當(dāng)?shù)谝淮螔呙钑r,P3.0口輸出“0”,P3.1、P3.2、P3.3輸出“1”,則P3.4P3.7所讀到的電平全為“1”;當(dāng)?shù)诙螔呙钑r,P3.1口輸出“0”,P3.0、P3.2、P3.3輸出“1”,此時,P3.4、P3.5、P3.6、P3.7讀到的電平

14、分別為“1”、“1”、“0”、“1”。因此,即能確定P3.1行線和P3.6列線交叉的編號“6”按鍵的具體位置。 矩陣式鍵盤的按鍵檢測過程如圖4.8所示。YNYN送行掃描值行掃描值左移延時去抖動返回鍵值鍵值為無效掃描鍵盤有鍵按下找到按鍵圖4.8 矩陣鍵盤識別流程圖 此實例的源程序如下: #include <msp430f249.h> unsigned char const table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71; /共陰數(shù)碼管段選碼表,無小數(shù)點stat

15、ic char key;void delayus(unsigned int t) unsigned int i; while(t-) for(i=1330;i>0;i-);char keyscan(void) char sccode,recode; P3OUT = 0x00; if(P3IN&0xF0)!=0xF0) /判斷是否有有鍵按下 delayus(20); if(P3IN&0xF0)!=0xF0) /再次判斷按鍵是否有抖動,如果是返回 sccode=0xFE; /逐行掃描初值,先掃描第1行P3.0 while(sccode&0x0F)!=0x0F) /行掃

16、描完成 P3OUT = sccode; /輸出行掃描碼 if(P3IN&0xF0)!=0xF0) /當(dāng)前行有鍵按下 recode=(P3IN&0xF0)|0x0F; /讀取高四位列值,低四位置1 key=(sccode & recode); /行和列組合得到鍵盤編碼 return key; else /所掃描沒有鍵按下,則掃描下一行 sccode=(sccode<<1)|0x01; /行掃描碼左移一位 return 0xFF; /無鍵按下 return 0xFF; /無鍵按下char getkeyval(char keycode) char keyval;

17、switch(keycode) case 0x77:/0b: keyval = 0; break; case 0x7B:/0b: keyval = 1; break; case 0x7D:/0b: keyval = 2; break; case 0x7E:/0b: keyval = 3; break; case 0xB7:/0b: keyval = 4; break; case 0xBB:/0b: keyval = 5; break; case 0xBD:/0b: keyval = 6; break; case 0xBE:/0b: keyval = 7; break; case 0xD7:/0

18、b: keyval = 8; break; case 0xDB:/0b: keyval = 9; break; case 0xDD:/0b: keyval = 10; break; case 0xDE:/0b: keyval = 11; break; case 0xE7:/0b: keyval = 12; break; case 0xEB:/0b: keyval = 13; break; case 0xED:/0b: keyval = 14; break; case 0xEE:/0b: keyval = 15; break; default: keyval = 255; return keyv

19、al;void main(void) unsigned char key,i; WDTCTL=WDTPW + WDTHOLD; / 關(guān)閉看門狗 P1DIR=0xFF; / 設(shè)置方向 P1SEL=0; / 設(shè)置為普通I/O 口 P1OUT=0x00; P3DIR = 0x0F; /P3.4P3.7口作為鍵盤輸入,P3.0P3.3口作為鍵盤掃描信號輸出 while(1) key = getkeyval(keyscan(); if(key != 255) P1OUT=tablekey; 程序說明:主程序通過調(diào)用鍵盤掃描程序獲取鍵值,并通過數(shù)碼管顯示出鍵盤編號。鍵盤掃描首先通過讀取列線輸入,如果不是全

20、為1,則延遲20ms后再次判斷列線是否全為1,如果依舊不是全為1,可以確定是穩(wěn)定的按鍵動作;通過逐行掃描的方式得到按鍵的位置。從程序上來看還存在兩個問題:一是按鍵掃描中延遲去抖需要20ms的時間,浪費(fèi)的單片機(jī)的運(yùn)算資源。二是在掃描到按鍵后如果按鍵按下不動,主程序會得到多個相同的鍵值,即重復(fù)按鍵,這種情況可以通過判斷按鍵彈起的動作予以解決。3) 仿真結(jié)果與分析 裝載可執(zhí)行文件,運(yùn)行后的仿真結(jié)果圖如圖4.9所示。圖4.9 矩陣式鍵盤仿真電路圖4.2 LED點陣顯示 LED點陣顯示器由發(fā)光二極管LED按矩陣的方式排成一個n×m的點陣,每個發(fā)光二極管構(gòu)成點陣中的一個點。這種點陣顯示器不僅可以

21、靜態(tài)的顯示信息,而且可以通過動態(tài)滾動,增加信息顯示的容量和效果,因此應(yīng)用十分廣泛。4.2.1 LED點陣顯示原理 LED點陣顯示器的分類有多種方法:按陣列點數(shù)可分為5×7、5×8、6×8、8×8這4種,按發(fā)光顏色可分為單色、雙色、三色;按極性排列方式可分為共陽極型和共陰極型。圖4.10為常見的8×8 LED點陣顯示器,它由64個發(fā)光二極管組成,且每個發(fā)光二極管是放置在行線和列線的交叉點上。當(dāng)對應(yīng)的某一行置1電平,某一列置0電平,則相應(yīng)的二極管就亮。如要將第一個點亮,則將第9腳接高電平第13腳接低電平;如果要將第一行點亮,則將第9腳要接高電平,而

22、第13、3、4、10、6、11、15、16這些引腳接低電平;如要將第一列點亮,則第13腳接低電平,而第9、14、8、12、1、7、2、5引腳接高電平。從原理上來說,模塊沒有共陽或共陰之分,共陽的翻轉(zhuǎn)90度就是共陰的了,共陰的翻轉(zhuǎn)90度就是共陽的了。但電路會有行掃描接陰或行掃描接陽之分。圖4.10 8×8 LED點陣管腳圖 顯示單個字母、數(shù)字時,只需要一個5×7的LED點陣顯示器即可,顯示漢字時,需要使用多個LED點陣顯示器組合,最常見的組合方式有15×14、16×15、16×16、32×32等。例如一個16×16的點陣由4個

23、8×8點陣組合而成,即每一個漢字在縱、橫各16點的區(qū)域內(nèi)顯示,需要筆畫經(jīng)過地方的發(fā)光二極管都為點亮狀態(tài)(即“1”),沒有筆畫地方的發(fā)光二極管都為熄滅狀態(tài)(即“0”),這樣就可以表示不同的漢字。 LED點陣顯示器與LED數(shù)碼管類似,常用的工作方式有靜態(tài)顯示和動態(tài)顯示兩種方式。所謂靜態(tài)顯示,就是當(dāng)顯示器顯示一個字符時,相應(yīng)的發(fā)光二極管始終保持導(dǎo)通或截止,在顯示的這個過程中,其狀態(tài)是靜止不變的,直到一個字符顯示完畢,將要顯示下一個字符時其狀態(tài)才改變。而動態(tài)顯示方式則不同,它在顯示每一個字符的過程中,都是按列(或行)不停掃描,一位一位地輪流點亮要顯示的各個位,如此反復(fù)循環(huán)。動態(tài)顯示方式利用了

24、人眼的視覺暫留性質(zhì),當(dāng)掃描的速度足夠快時,可以得到靜態(tài)的顯示效果。由于 LED點陣引腳設(shè)計的特殊性,一般采用動態(tài)掃描顯示方式。 下面介紹用動態(tài)掃描方式在8×8 共陽極LED點陣顯示器上顯示字符“B”的過程(如圖4.11所示),由此簡要說明動態(tài)掃描的原理。圖4.11 用動態(tài)掃描方式顯示字符“B”的過程 假設(shè)X、Y為兩個8位的字節(jié)型數(shù)據(jù),X的每位對應(yīng)LED點陣的8條列線X7X0,同樣Y的每位對應(yīng)LED點陣的8條行線Y7Y0。Y叫行掃描線,在每個時刻只有一條為“1”,即有效行選通電平;X叫列數(shù)據(jù)線,其內(nèi)容就是點陣化的字模數(shù)據(jù)的體現(xiàn)。 Y=0x01,X=0xFF,如圖4-11中的第一幀; Y

25、=0x02,X=0x87,如圖4-11中的第二幀; Y=0x04,X=0xBB,如圖4-11中的第三幀; Y=0x08,X=0xBB,如圖4-11中的第四幀; Y=0x10,X=0x87,如圖4-11中的第五幀; Y=0x20,X=0xBB,如圖4-11中的第六幀; Y=0x40,X=0xBB,如圖4-11中的第七幀; Y=0x80,X=0x87,如圖4-11中的第八幀; 跳到第步循環(huán)。如果高速地進(jìn)行的循環(huán),且兩個步驟的間隔時間小于1/24s,則由于視覺暫留,LED顯示屏上將呈現(xiàn)出一個完整的“B”字符。4.2.2 8×8 LED點陣顯示實例實例4-3 8×8 LED點陣數(shù)字

26、顯示任務(wù)要求:利用MSP430F249單片機(jī)控制一個8×8 LED點陣顯示器,使其循環(huán)顯示數(shù)字09。1) 硬件電路設(shè)計 選用MSP430F249單片機(jī)的P2口控制LED點陣的行掃描信號,P1口控制點陣的列顯示數(shù)據(jù),硬件原理圖如圖4.12所示。圖4.12 點陣顯示數(shù)字字符硬件原理圖2)程序設(shè)計#include "msp430f249.h"#define uchar unsigned char#define uint unsigned int/數(shù)字09的8*8點陣編碼const uchar Table_OF_Digits = 0x00,0x3C,0x66,0x42,0

27、x42,0x66,0x3C,0x00,/0 0x00,0x08,0x38,0x08,0x08,0x08,0x3E,0x00,/1 0x00,0x3C,0x42,0x04,0x08,0x32,0x7E,0x00,/2 0x00,0x3C,0x42,0x1C,0x02,0x42,0x3C,0x00,/3 0x00,0x0C,0x14,0x24,0x44,0x3C,0x0C,0x00,/4 0x00,0x7E,0x40,0x7C,0x02,0x42,0x3C,0x00,/5 0x00,0x3C,0x40,0x7C,0x42,0x42,0x3C,0x00,/6 0x00,0x7E,0x44,0x08,

28、0x10,0x10,0x10,0x00,/7 0x00,0x3C,0x42,0x24,0x5C,0x42,0x3C,0x00,/8 0x00,0x38,0x46,0x42,0x3E,0x06,0x3C,0x00 /9 ;const uchar scan_tab=0x01,0x02,0x04,0x08,0x010,0x20,0x40,0x80; / 掃描代碼void delayus(uint t) uint i; while(t-) for(i=1300;i>0;i-); /仿真時,取值130void main(void) char i,j,t=0; WDTCTL = WDTPW + WD

29、THOLD; P1DIR = 0xFF; P2DIR = 0xFF; while(1) P1OUT = 0xFF; /關(guān)閉顯示,防止切換數(shù)字時產(chǎn)生拖影 P2OUT = 0xFF; for(i = 0;i < 10;i+) /循環(huán)顯示09 for(j = 0 ;j < 255 ; j+) /每個字符顯示穩(wěn)定 P2OUT = scan_tabt; /送行掃描信號 P1OUT = Table_OF_Digitst+8*i;/送列顯示數(shù)據(jù) delayus(2); if(+t=8) t=0; 程序說明:在主循環(huán)中對09這10個數(shù)字進(jìn)行循環(huán)顯示,每個數(shù)字掃描次數(shù)為255,是為了讓每個數(shù)字顯示時

30、間足夠長,得到穩(wěn)定的顯示效果。P2口送出行掃描信號后,P1口給出列顯示數(shù)據(jù),注意此例中8×8點陣為共陰極接法,顯示數(shù)據(jù)是經(jīng)過取反后送出的。3)仿真結(jié)果 加載程序后,運(yùn)行得到仿真圖如圖4.13所示。圖4.13 點陣顯示數(shù)字字符仿真圖4.2.3 16×16漢字點陣顯示與字母和數(shù)字顯示原理一樣,16×16漢字點陣的顯示也是采用動態(tài)逐行(或逐列)掃描的方式完成,只是列掃描需要16位,而每列數(shù)據(jù)需要2×8位(2字節(jié)),一個完整的漢字則需要32字節(jié)。1、點陣驅(qū)動電路實例4-3中,單片機(jī)控制一個8×8 LED點陣顯示器,需要兩組I/O口,其中一組實現(xiàn)點陣的行

31、掃描,另一組輸出列數(shù)據(jù)。按照這種硬件連接方式,如果利用單片機(jī)控制一個16×16漢字點陣實現(xiàn)顯示功能,則需要8組I/O口;如果控制多個漢字點陣顯示,則需要更多的I/O口。顯然,這種連接方式是難以實現(xiàn)的。因此,在多個點陣驅(qū)動電路設(shè)計中,一般采用移位寄存器的方法來減少對單片機(jī)I/O口的需求。寄存器是存放二進(jìn)制數(shù)的電路,由D觸發(fā)器構(gòu)成,如圖4.14所示。在CP時鐘信號的上升沿,將輸入的數(shù)字DI存入到D觸發(fā)器中,Q端的輸出就與DI相同,即無論觸發(fā)器Q原來的值是什么,只要時鐘脈沖CP上升沿到來,加在數(shù)據(jù)輸入端的數(shù)據(jù)就立即被送入觸發(fā)器中,當(dāng)DI端信號消失,輸出Q保持不變,數(shù)據(jù)被保存在觸發(fā)器中,所以

32、又稱為寄存器。將多個寄存器級聯(lián),第一級D觸發(fā)器接輸入信號DI ,其余觸發(fā)器輸入D接前級輸出Q,所有CP連在一起接輸入移位脈沖,所有D觸發(fā)器都在一個CP的上升沿工作,這種電路稱為移位寄存器。以4個D觸發(fā)器構(gòu)成的4級移位寄存器為例,如圖4.15所示。 圖4.14 D觸發(fā)器移位脈沖CP3214串入DI 圖4.15 4位移位寄存器在移位脈沖的作用下,輸入信息的當(dāng)前數(shù)字DI存入第一級D觸發(fā)器,第一級D觸發(fā)器的狀態(tài)存入到第二級D觸發(fā)器,依此類推,低位D觸發(fā)器存入高位D觸發(fā)器狀態(tài),實現(xiàn)了輸入數(shù)碼在移位脈沖的作用下向左逐位移存。假設(shè)所有寄存器初態(tài)為0,DI = 1101串行送入寄存器輸入,如圖4-16所示。當(dāng)

33、第一個移位脈沖上升沿到來后,DI =1,第一個觸發(fā)器輸出Q=D,而因為初始值都為0,所有Q2、3、Q4依然為0。當(dāng)?shù)诙€移位脈沖上升沿到來后,DI=1,因此Q1=1,而Q2的值等于觸發(fā)器Q1之前的輸出1,依次類推,當(dāng)?shù)谒膫€脈沖的上升沿到來后,Q4Q3Q2Q1=1101。圖4.16 4位移位寄存器串行移位在4個CP作用下,輸入的4位串行數(shù)碼1101全部存入了寄存器中。這種方式稱為串行輸入。寄存器中的4位數(shù)碼1101是并行輸出,這種方式稱為并行輸出。當(dāng)移位脈沖繼續(xù)產(chǎn)生,而輸入全部為0時,可以看到每一個觸發(fā)器的輸出都是在對輸入的1101進(jìn)行移位操作。移位寄存器的特點如下:(1)單向移位寄存器中的數(shù)字

34、,在CP脈沖操作下,可以依次右移或左移。(2)n位單向移位寄存器可以寄存n位二進(jìn)制代碼。n個CP脈沖即可完成串行輸入工作,此后可從Q1Qn端獲得并行的n位二進(jìn)制數(shù)字,再用n個CP脈沖又可實現(xiàn)串行輸出操作。(3)若串行輸入端狀態(tài)為0,則n個CP脈沖后,寄存器便被清零。利用移位寄存器串行輸入、并行輸出的特點,在驅(qū)動16×16點陣的列信號時,可以在單片機(jī)和點陣之間增加一個8位的移位寄存器。由單片機(jī)產(chǎn)生CP時鐘信號和所需的串行數(shù)據(jù)輸出信號,在8個CP時鐘后,可以將串行數(shù)據(jù)移入移位寄存器并行輸出。因此,這種驅(qū)動方式只需要單片機(jī)的兩個I/O口,大大節(jié)約了單片機(jī)的占用引腳資源。本書選擇點陣顯示系統(tǒng)

35、中常用移位寄存器74HC595來實現(xiàn)點陣列數(shù)據(jù)的串行輸入、并行輸出功能。74HC595的管腳圖和邏輯圖如圖4.17和4.18所示。 圖4.17 74HC595管腳圖 4.18 74HC595邏輯功能圖74HC595輸入端是8位串行移位寄存器,輸出端是8位并行緩存器,具有鎖存功能。其管腳功能描述如表4-1所示。表4-1 74HC595管腳描述管腳符號管腳編號描述Q0 到Q715, 1到 7并行數(shù)據(jù)輸出GND 8地Q7 9 串行數(shù)據(jù)輸出MR 10復(fù)位,低電平有效SHCP11串行移位時鐘STCP12 鎖存時鐘OE 13 輸出使能,低電平有效DS14串行數(shù)據(jù)輸入VCC16電源74HC595的邏輯功能是

36、在串行移位時鐘SHCP的上升沿,將串行數(shù)據(jù)輸入DS的數(shù)據(jù),從低位到高位依次移入內(nèi)部的寄存器中,當(dāng)8個數(shù)據(jù)都移入后,若OE為低電平,通過STCP 的上升沿將8個數(shù)據(jù)輸出到Q0Q7引腳上。由于74HC595輸出電流較大,可以直接驅(qū)動LED,因此,在亮度要求不高的設(shè)計中,可以直接將74HC595輸出端連接到LED點陣。一片74HC595能驅(qū)動一個8位的點陣列輸入,若需要驅(qū)動多個點陣,則可利用74HC595的Q7串行數(shù)據(jù)輸出端,將多個74HC595串聯(lián)起來使用,如圖4.19所示。VIQ7Q78x8點陣8x8點陣8x8點陣74HC59574HC59574HC595···&#

37、183;·········· 圖4.19 多片74HC595級聯(lián)驅(qū)動點陣示意圖另外,由于74HC595串行數(shù)據(jù)時鐘和鎖存時鐘是獨立的,移位時鐘SHCP的上升沿將串行數(shù)據(jù)移入內(nèi)部的寄存器后,在鎖存時鐘STCP的作用下才會輸出到Q0Q7。當(dāng)多片74HC595級聯(lián)驅(qū)動點陣的時候,通過同一個鎖存時鐘STCP,在所有列數(shù)據(jù)準(zhǔn)備好后,啟動鎖存信號使所有數(shù)據(jù)同時鎖存并輸出,滿足多個點陣列數(shù)據(jù)并行輸出的目的。串行數(shù)據(jù)時鐘,串行數(shù)據(jù)輸入對于430單片機(jī)可以通過內(nèi)部的SPI接口實現(xiàn)高速數(shù)據(jù)傳輸,也可以采用I/O端口

38、模擬所需的時序的方式。串行數(shù)據(jù)時鐘模擬的方法是按照移位脈沖時序圖,利用單片機(jī)的I/O端口定時輸出高電平或者低電平,以獲得所需的時鐘信號。對串行數(shù)據(jù)的輸出,可以通過程序判斷8位的數(shù)據(jù)的最高位是否為1,將數(shù)據(jù)輸出端口置高或者置低。并將數(shù)據(jù)左移一位,循環(huán)八次后即可實現(xiàn)輸出8位的串行數(shù)據(jù)。下面以單片機(jī)向74HC595串行發(fā)送一個字節(jié)函數(shù)send_byte為例。#define SHCP_H P3OUT |= BIT2#define SHCP_L P3OUT &= BIT2#define DS_H P3OUT |= BIT1#define DS_L P3OUT &= BIT1void se

39、nd_byte(char data) char i,k; for(i=0; i< 8 ; i+) /循環(huán)8次發(fā)送一個字節(jié) if (data&0x80)= 0) /最高為1 DS_L; /串行輸出信號置低 else DS_H; /串行輸出信號置高 data=data<<1; /數(shù)據(jù)左移1位 SHCP_H; /移位時鐘信號產(chǎn)生上升沿 for(k=2;k>0;k-);/ 時鐘延遲 SHCP_L; for(k=2;k>0;k-); 其中DS_L和DS_H分別是單片機(jī)I/O端口輸出串行數(shù)據(jù)的宏定義,SHCP_L和SHCP_H是輸出串行移位脈沖的宏定義,假定串行數(shù)據(jù)用

40、P3.1端口,串行移位脈沖用P3.2端口。從程序可以看出,通過軟件模擬串行移位方式是參照移位寄存器的時序圖實現(xiàn)的,這種方式可以推廣到具有串行輸入或者輸出方式的芯片驅(qū)動中。同理,除了列數(shù)據(jù)輸出電路以外,還需要行輸出電路實現(xiàn)逐行選通控制功能,即16×16的漢字點陣需要從上到下循環(huán)掃描16次,每次掃描過程中某一行被選通,而其他行都要關(guān)閉。為減少單片機(jī)端口的占用,可以使用74HC154譯碼器實現(xiàn)點陣行掃描的驅(qū)動。74HC154是一種4線/16線譯碼器,數(shù)據(jù)輸入端有4位,數(shù)據(jù)輸出端有24 = 16個。74HC154譯碼器的管腳圖如圖4.20所示,其輸入輸出關(guān)系如表4-2所示。圖4.20 74H

41、C154管腳圖表4-2 74HC154的輸入輸出關(guān)系表輸入輸出ABCDY0Y1Y2Y3Y4Y5Y6Y7Y8Y9Y10Y11Y12Y13Y14Y1500000111111111111111000110111111111111110010110111111111111100111110111111111111010011110111111111110101111110111111111101101111110111111111011111111110111111111000111111110111111110011111111110111111101011111111110111111011111

42、111111110111111001111111111110111110111111111111110111110111111111111110111111111111111111110從上表可以看出,當(dāng)輸入一個015的二進(jìn)制數(shù)據(jù)時,對應(yīng)的某個Y引腳輸出低電平,而其它輸出引腳為高電平,正好滿足行掃描的要求。如果需要行掃描時輸出高電平,通過74HC154輸出端接入反相器即可。值得注意的是,74HC154輸出電流只有20mA,按每一個LED器件需要10 mA計算,16個LED同時發(fā)光時,需要160 mA電流,因此實際應(yīng)用中應(yīng)增加專用電流驅(qū)動電路如ULN2803或者三極管才能實現(xiàn)行掃描驅(qū)動。如果需要

43、完成16×16點陣的驅(qū)動,則共需要4片74HC595級聯(lián)實現(xiàn)其列數(shù)據(jù)輸入,其級聯(lián)方式參照漢字取模的方式。每片74HC595的Q0Q7連接一個8×8點陣的8根列數(shù)據(jù)輸入引腳,而點陣的行掃描信號連接到1片74HC154的Y0Y15即可。依照此方式,可以完成更多點陣級聯(lián)的驅(qū)動電路。2、漢字字模提取根據(jù)前面所述,16×16點陣由4個8×8點陣組成,分別為ABCD四個部分,如圖4.22所示。圖4.22 16×16點陣組成示意圖其漢字顯示需要先獲得漢字點陣的數(shù)據(jù)后,才能通過單片機(jī)驅(qū)動點陣顯示,這種獲得漢字點陣的方法稱為取模,取模方式按照點陣驅(qū)動的不同,可以

44、有ABCD、ACBD、BACD、CABD4種順序。取模后得到的數(shù)據(jù)保存在數(shù)組中。由于這些數(shù)據(jù)是常量,在程序設(shè)計中一般用const關(guān)鍵字來描述。對于430序列單片機(jī),常量會保存到單片機(jī)內(nèi)部的flash存儲器中,以節(jié)省內(nèi)存空間的占用。漢字取模通常用取模軟件完成,如字模提取軟件,zimo等。本書使用的是字模提取軟件如圖4.23所示。圖4.23 字模提取軟件這里字模提取方式為橫向取模,取模順序為ABCD。比如漢字“中”取模得到的數(shù)據(jù)為:0x01,0x00,0x01,0x00,0x01,0x04,0x7F,0xFE,0x41,0x04,0x41,0x04,0x41,0x04,0x41,0x04,0x7F

45、,0xFC,0x41,0x04,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00數(shù)據(jù)共32個字節(jié),對照上面提取軟件的點陣圖像可以看出,0x01對應(yīng)是左上的第一行數(shù)據(jù),0x00對應(yīng)的是右上的第一行,如此類推。根據(jù)取模的方式,硬件上對74HC595級聯(lián)時,如果是ABCD這種方式,則是AB級聯(lián),CD級聯(lián),我們在單片機(jī)程序中輸出數(shù)據(jù)的順序也要按照取模的順序。3、16×16LED點陣漢字顯示實例實例4-4 16×64 LED點陣漢字顯示任務(wù)要求:利用16個8×8點陣構(gòu)成4個16×16點陣,顯示四

46、個漢字字符:“中國你好”。分析說明:4個16×16點陣用8片74HC595輸出列數(shù)據(jù)驅(qū)動,行掃描可以用1片74HC154譯碼器實現(xiàn),將占用單片機(jī)I/0口的資源降到最低,同時也解決了單片機(jī)輸出電流不足的問題。1)硬件電路設(shè)計16個8×8 點陣構(gòu)成 4個16×16點陣漢字,單片機(jī)控制其顯示的原理框圖如圖4-24所示。該點陣為“行共陰極”,即一行中所有的陰極接在一起。16條行選通利用單片機(jī)的4個I/O口控制4線/16線譯碼器74HC154,實現(xiàn)16條行線的低電平分別選通。每1個8×8 點陣的列線由1片8位串入并出移位寄存器 74HC595控制。74HC595輸

47、出具有鎖存功能,使得74HC595鎖存顯示某一行數(shù)據(jù)時,單片機(jī)可以進(jìn)行下一行數(shù)據(jù)的傳送。16x16點陣74HC15416x16點陣16x16點陣16x16點陣行掃描輸出列數(shù)據(jù)輸出74HC595 x274HC595 x274HC595 x274HC595 x2STCPDSSHCPMSP430單片機(jī)圖4.24 16×64 LED點陣顯示原理框圖圖4.24中,74HC595首尾串行連接,每兩片驅(qū)動一個16×16點陣的列,一共有8片74HC595,所有74HC595共用SHcp和STcp時鐘信號,在單片機(jī)輸出的SHcp驅(qū)動下,數(shù)據(jù)從DS端輸入到第一片74HC595的DS端,經(jīng)過8個

48、時鐘脈沖將第一個數(shù)據(jù)輸出到第一片74HC595,在下一個時鐘脈沖的作用下,一方面第一片74HC595繼續(xù)接收數(shù)據(jù),另一方面將接收的數(shù)據(jù)移位輸出到第二片74HC595,如此經(jīng)過16x8 = 256個時鐘的驅(qū)動,可將所有的行數(shù)據(jù)保存在16個74HC595內(nèi)部寄存器中,再經(jīng)過STcp鎖存信號驅(qū)動輸出到LED點陣。同時單片機(jī)此時應(yīng)輸出行的編號,通過74HC154選通行信號點亮漢字字模對應(yīng)的LED。當(dāng)所有的行掃描結(jié)束后再次循環(huán),從而輸出所需的漢字。按照顯示原理框圖設(shè)計的proteus硬件電路如圖4.25所示。圖4.25 16×64 LED點陣硬件電路圖圖4.25中,為簡化圖紙,芯片之間的電路連

49、接都采用網(wǎng)絡(luò)標(biāo)號實現(xiàn)。其中P1.0、P1.1、P1.2、P1.3作為74HC154譯碼器輸入信號,P3.0作為鎖存時鐘信號STcp輸出端,P3.1作為串行數(shù)據(jù)輸出端連接到74HC595的DS端,P3.2作為串行移位時鐘信號輸出端連接到74HC595的SHcp端。2)程序設(shè)計#include "msp430f249.h"#define SHCP_H P3OUT |= BIT2#define SHCP_L P3OUT &= BIT2#define DS_H P3OUT |= BIT1#define DS_L P3OUT &= BIT1#define STCP_H

50、 P3OUT |= BIT0#define STCP_L P3OUT &= BIT0#define DECODE_PORT P1OUTconst char tab=0x01,0x00,0x01,0x00,0x01,0x04,0x7F,0xFE,0x41,0x04,0x41,0x04,0x41,0x04,0x41,0x04,/中0x7F,0xFC,0x41,0x04,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x04,0x7F,0xFE,0x40,0x24,0x5F,0xF4,0x41,0x04,0x41,0x04,0x41,0x44,0x4

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論