




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第4章 鍵盤和顯示器的應(yīng)用 在單片機(jī)應(yīng)用系統(tǒng)中,鍵盤和顯示器是非常重要的人機(jī)接口。人機(jī)接口是指人與計(jì)算機(jī)系統(tǒng)進(jìn)行信息交互的接口,包括信息的輸入和輸出。常用輸入設(shè)備主要是鍵盤,常用輸出設(shè)備包括發(fā)光二極管、數(shù)碼管和液晶顯示器等。4.1 鍵盤輸入 鍵盤用于實(shí)現(xiàn)單片機(jī)應(yīng)用系統(tǒng)中的數(shù)據(jù)信息和控制命令的輸入,按結(jié)構(gòu)可分為編碼鍵盤和非編碼鍵盤。編碼鍵盤上閉合鍵的識(shí)別由專用的硬件編碼器實(shí)現(xiàn),并產(chǎn)生相應(yīng)的鍵碼值,如計(jì)算機(jī)鍵盤。非編碼鍵盤是通過軟件的方法產(chǎn)生鍵碼,不需要專用的硬件電路。為了減少電路的復(fù)雜程度,節(jié)省單片機(jī)的I/O口,在單片機(jī)應(yīng)用系統(tǒng)中廣泛使用非編碼鍵盤,主要對(duì)象是各種按鍵或開關(guān)。這些按鍵或開關(guān)可以獨(dú)
2、立使用(稱之為獨(dú)立鍵盤),也可以組合使用(稱之為矩陣式鍵盤)。4.1.1 按鍵電路與按鍵抖動(dòng)處理按鍵電路連接方法非常簡(jiǎn)單,如圖4.1所示。此電路用于通過外力使按鍵瞬時(shí)接通開關(guān)的場(chǎng)合,如單片機(jī)的RESET電路中,通過按鍵產(chǎn)生一個(gè)瞬時(shí)的低電壓,CPU感知這個(gè)低電壓后重啟。圖4.1 按鍵復(fù)位電路 由于按鍵的閉合與斷開都是利用其機(jī)械彈性實(shí)現(xiàn)的,當(dāng)機(jī)械觸點(diǎn)斷開、閉合時(shí),會(huì)產(chǎn)生抖動(dòng),這種抖動(dòng)操作用戶感覺不到,但對(duì)CPU來說,其輸出波形則明顯發(fā)生變化,如圖4.2所示。圖4.2 按鍵開、閉時(shí)的電壓抖動(dòng)波形 按鍵按下和釋放時(shí)的抖動(dòng)時(shí)間一般為 1020ms ,按鍵的穩(wěn)定閉合期由操作用戶的按鍵動(dòng)作決定,一般為幾百毫
3、秒到幾秒,而單片機(jī)CPU的處理速度在微秒極,因此,按鍵的一次閉合,有可能導(dǎo)致CPU的多次響應(yīng)。為了避免這種錯(cuò)誤操作,必須對(duì)按鍵電路進(jìn)行去抖動(dòng)處理。常用的去抖動(dòng)方法有硬件方式和軟件方式兩種。使用硬件去抖動(dòng)的方式,需要在按鍵連接的硬件設(shè)計(jì)上增加硬件去抖電路,比如將按鍵輸出信號(hào)經(jīng)過R-S 觸發(fā)器或 RC 積分電路后再送入單片機(jī),就可以保證按一次鍵只發(fā)出一個(gè)脈沖。軟件方式去抖動(dòng)的基本原理是在軟件中采用時(shí)間延遲,對(duì)按鍵進(jìn)行兩次測(cè)試確認(rèn),即在第一次檢測(cè)到按鍵按下后,間隔 10ms左右,再次檢測(cè)該按鍵是否按下,只有在兩次都測(cè)到按鍵按下時(shí)才最終確認(rèn)有鍵按下,這樣就可以避開抖動(dòng)時(shí)間段,消除抖動(dòng)影響。同樣,在按鍵
4、釋放時(shí)也采用相同方法。由于人的按鍵速度比單片機(jī)的運(yùn)行速度要慢很多,所以,軟件延時(shí)方法從技術(shù)上完全可行,而且經(jīng)濟(jì)上更加實(shí)惠,因此被廣泛采用。 4.1.2 獨(dú)立鍵盤檢測(cè) 獨(dú)立鍵盤是一種最簡(jiǎn)單的鍵盤,前面章節(jié)已經(jīng)介紹過使用獨(dú)立鍵盤的實(shí)例。獨(dú)立按鍵的每個(gè)鍵單獨(dú)占用一根I/O口線,每根I/O口線上的按鍵工作狀態(tài)不會(huì)影響其他I/O線的工作狀態(tài)。實(shí)例4-1 獨(dú)立按鍵編號(hào)顯示任務(wù)要求:?jiǎn)纹瑱C(jī)端口連接3個(gè)按鍵,從13進(jìn)行編號(hào),如果其中一個(gè)按鍵按下時(shí),則在LED數(shù)碼管上顯示相應(yīng)的按鍵編號(hào)。1)硬件電路設(shè)計(jì)選取MSP430F249單片機(jī)的P1口連接數(shù)碼管顯示按鍵編號(hào),P3口的P3.0、 P3.1、P3.2端口分別和
5、3個(gè)按鍵連接。硬件電路如圖4.3所示。圖4.3 獨(dú)立鍵盤檢測(cè)電路圖3個(gè) I/O 口 P3.0、 P3.1、P3.2作為輸入口(輸入方式),分別與 K1、K2、K3 三個(gè)按鍵連接。當(dāng)按鍵斷開時(shí),I/O口的輸入為高電平,按鍵閉合時(shí),I/O口的輸入為低電平。此3個(gè)引腳上接了上拉電阻,是為了保證按鍵斷開時(shí)邏輯電平為高。2)程序設(shè)計(jì)按鍵閉合時(shí),與該鍵相連的I/O 引腳為低電平;按鍵斷開時(shí),與該鍵相連的I/O 引腳為高電平。所以在程序中通過P3IN寄存器讀取P3.0、 P3.1、P3.2這3個(gè)I/O口的電平狀態(tài),便可檢測(cè)按鍵是否按下。另外,在有按鍵按下時(shí),要有一定的延時(shí),以防止由于鍵盤抖動(dòng)而引起誤操作。當(dāng)
6、確認(rèn)某按鍵按下后,就讓數(shù)碼管顯示其按鍵編號(hào)。#include "MSP430f249.h"unsigned char const table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71; /共陰數(shù)碼管段選碼表,無(wú)小數(shù)點(diǎn)void delayus(unsigned int t) unsigned int i; while(t-) for(i=1330;i>0;i-);unsigned char ReadKey(void) unsigned char tem
7、p; temp= P3IN&0x07; if(temp!= 0x07) delayus(10); /等待按鍵抖動(dòng)時(shí)間 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(); switch(key)
8、 case 0x06: P1OUT=table1; break; case 0x05: P1OUT=table2; break; case 0x03: P1OUT=table3; break; 程序說明:當(dāng)按鍵按下時(shí),P3口的低三位將不全為高電平。在ReadKey函數(shù)中,當(dāng)判斷到P3的低三位不全為1,即0x07時(shí),則認(rèn)為有按鍵按下,然后延遲20ms,再次判斷P3的低三位,如果低三位依舊不全為1,可以確定是有鍵按下,并獲取鍵值后顯示在數(shù)碼管上。3)仿真結(jié)果與分析雙擊msp430F249單片機(jī),裝載可執(zhí)行文件。運(yùn)行時(shí),LED最初沒有顯示。當(dāng)按下某鍵時(shí),將顯示相應(yīng)的數(shù)值。圖4.4為編號(hào)為“3”的按鍵
9、被按下時(shí)的仿真效果圖。圖4.4 獨(dú)立鍵盤檢測(cè)的仿真效果圖4.1.3 矩陣式鍵盤檢測(cè)獨(dú)立鍵盤與單片機(jī)連接時(shí),每一個(gè)按鍵開關(guān)占用一個(gè)I/O口線,若單片機(jī)系統(tǒng)中需要較多按鍵時(shí),獨(dú)立按鍵的方式便會(huì)占用過多的I/O口資源。此時(shí),為了節(jié)省I/O口線,采用矩陣式鍵盤(也稱為行列式鍵盤)。下面以4×4矩陣式鍵盤為例講解其工作原理和檢測(cè)方法。將16個(gè)按鍵排成4行4列,第一行每個(gè)按鍵的一端連接在一起構(gòu)成行線,第一列將每個(gè)按鍵的另一端連接在一起構(gòu)成列線,這樣便一共有4行4列共8根線,如圖4-5所示。將這8根線連接到單片機(jī)的8個(gè)I/O口上,即可通過程序掃描鍵盤檢測(cè)到是哪個(gè)按鍵被按下,具體方法見實(shí)例4-2。圖
10、4.5 4×4矩陣式鍵盤實(shí)例4-2 矩陣鍵盤編號(hào)顯示任務(wù)要求:將4×4矩陣式鍵盤編號(hào),如果其中一個(gè)按鍵按下時(shí),則在LED數(shù)碼管上顯示相應(yīng)的按鍵編號(hào)。 分析說明:4×4矩陣式鍵盤只需要占用一個(gè)8位的端口,硬件設(shè)計(jì)較為簡(jiǎn)潔,重點(diǎn)在于如何在程序中判斷矩陣鍵盤的按鍵位置。1)硬件電路設(shè)計(jì)選取MSP430F249單片機(jī)的P1口連接數(shù)碼管,P3口的8個(gè)引腳分別和矩陣式鍵盤的行線和列線連接。硬件電路如圖4.6所示。圖4.6 矩陣式鍵盤電路原理圖 圖4.6中列線P3.4P3.7通過上拉電阻接電源,處于輸入狀態(tài),行線P3.0P3.3為輸出狀態(tài)。鍵盤上沒有按鍵閉合時(shí),所有列線P 3.
11、4P 3.7輸入全部為高電平。當(dāng)鍵盤上某個(gè)按鍵閉合時(shí),則對(duì)應(yīng)的行線和列線短接。例如10號(hào)鍵被按下時(shí),行線P3.1和列線P3.5短接,此時(shí)P3.5輸入電平由P3.2的輸出電平?jīng)Q定。在檢測(cè)是否有鍵按下時(shí),先使4條行線全部輸出低電平,然后讀取4條列線的狀態(tài)。如果全部為高電平則表示沒有任何鍵被按下;如果有任一鍵被按下,由于列線是上拉至VCC則行線上讀到的將是一個(gè)非全“1”的值。2)程序設(shè)計(jì)確定矩陣式鍵盤上哪個(gè)鍵被按下通常采用行掃描法,又稱為逐行(或列)掃描查詢法,其軟件主要基于掃描方式完成。關(guān)于鍵盤掃描查詢的程序大致可分為以下幾個(gè)步驟:(1) 檢測(cè)當(dāng)前是否有鍵被按下。 首先看輸入的列線,假設(shè)4條行線都
12、輸出低電平,4條列線都是上拉至VCC的,在沒有任何按鍵按下時(shí)4條列線輸入都為“1”。但當(dāng)與某一條行線相連的4個(gè)按鍵中的任何一個(gè)被按下時(shí),這條列線將輸入低電平,即當(dāng)某條列線輸入低電平時(shí),必定是連接在這條列線上的某個(gè)按鍵被按下了。(2)去除鍵抖動(dòng)。當(dāng)檢測(cè)到有鍵被按下后,延時(shí)一段時(shí)間再作下一步的檢測(cè)判斷。(3) 若有鍵被按下,檢測(cè)出是哪一個(gè)鍵被按下。逐行掃描方式:在4條行線上分別輸出“0”信號(hào),也就是說,第一次,在P3.0上輸出低電平,其他的行線(P3.1、P3.2、P3.3)上輸出高電平;接著第二次,在P3.1上輸出低電平,其他的行線(P3.0、P3.2、P3.3)上輸出高電平;第三次,在P3.2
13、上輸出低電平,其他的行線(P3.0、P3.1、P3.3)上輸出高電平;第四次,在P3.3上輸出低電平,其他的行線(P3.0、P3.1、P3.2)上輸出高電平。當(dāng)某一行線上輸出低電平時(shí),如果此行上有鍵被按下,那么相應(yīng)按鍵的列線上則會(huì)讀取到“0”,于是可以惟一的確定是哪一按鍵被按下了。假設(shè)圖4.6中的編號(hào)“6”的按鍵被按下,當(dāng)?shù)谝淮螔呙钑r(shí),P3.0口輸出“0”,P3.1、P3.2、P3.3輸出“1”,則P3.4P3.7所讀到的電平全為“1”;當(dāng)?shù)诙螔呙钑r(shí),P3.1口輸出“0”,P3.0、P3.2、P3.3輸出“1”,此時(shí),P3.4、P3.5、P3.6、P3.7讀到的電平分別為“1”、“1”、“0
14、”、“1”。因此,即能確定P3.1行線和P3.6列線交叉的編號(hào)“6”按鍵的具體位置。 矩陣式鍵盤的按鍵檢測(cè)過程如圖4.8所示。YNYN送行掃描值行掃描值左移延時(shí)去抖動(dòng)返回鍵值鍵值為無(wú)效掃描鍵盤有鍵按下找到按鍵圖4.8 矩陣鍵盤識(shí)別流程圖 此實(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ù)碼管段選碼表,無(wú)小數(shù)點(diǎn)static char key;v
15、oid 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) /再次判斷按鍵是否有抖動(dòng),如果是返回 sccode=0xFE; /逐行掃描初值,先掃描第1行P3.0 while(sccode&0x0F)!=0x0F) /行掃描完成 P3OUT = s
16、ccode; /輸出行掃描碼 if(P3IN&0xF0)!=0xF0) /當(dāng)前行有鍵按下 recode=(P3IN&0xF0)|0x0F; /讀取高四位列值,低四位置1 key=(sccode & recode); /行和列組合得到鍵盤編碼 return key; else /所掃描沒有鍵按下,則掃描下一行 sccode=(sccode<<1)|0x01; /行掃描碼左移一位 return 0xFF; /無(wú)鍵按下 return 0xFF; /無(wú)鍵按下char getkeyval(char keycode) char keyval; switch(keycod
17、e) case 0x77:/0b01110111: keyval = 0; break; case 0x7B:/0b01111011: keyval = 1; break; case 0x7D:/0b01111101: keyval = 2; break; case 0x7E:/0b01111110: keyval = 3; break; case 0xB7:/0b10110111: keyval = 4; break; case 0xBB:/0b10111011: keyval = 5; break; case 0xBD:/0b10111101: keyval = 6; break; cas
18、e 0xBE:/0b11011110: keyval = 7; break; case 0xD7:/0b11010111: keyval = 8; break; case 0xDB:/0b11011011: keyval = 9; break; case 0xDD:/0b11011101: keyval = 10; break; case 0xDE:/0b11011110: keyval = 11; break; case 0xE7:/0b11100111: keyval = 12; break; case 0xEB:/0b11101011: keyval = 13; break; case
19、0xED:/0b11101101: keyval = 14; break; case 0xEE:/0b11101110: keyval = 15; break; default: keyval = 255; return keyval;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口作為鍵盤掃描信號(hào)輸出 while(1)
20、key = getkeyval(keyscan(); if(key != 255) P1OUT=tablekey; 程序說明:主程序通過調(diào)用鍵盤掃描程序獲取鍵值,并通過數(shù)碼管顯示出鍵盤編號(hào)。鍵盤掃描首先通過讀取列線輸入,如果不是全為1,則延遲20ms后再次判斷列線是否全為1,如果依舊不是全為1,可以確定是穩(wěn)定的按鍵動(dòng)作;通過逐行掃描的方式得到按鍵的位置。從程序上來看還存在兩個(gè)問題:一是按鍵掃描中延遲去抖需要20ms的時(shí)間,浪費(fèi)的單片機(jī)的運(yùn)算資源。二是在掃描到按鍵后如果按鍵按下不動(dòng),主程序會(huì)得到多個(gè)相同的鍵值,即重復(fù)按鍵,這種情況可以通過判斷按鍵彈起的動(dòng)作予以解決。3) 仿真結(jié)果與分析 裝載可執(zhí)
21、行文件,運(yùn)行后的仿真結(jié)果圖如圖4.9所示。圖4.9 矩陣式鍵盤仿真電路圖4.2 LED點(diǎn)陣顯示 LED點(diǎn)陣顯示器由發(fā)光二極管LED按矩陣的方式排成一個(gè)n×m的點(diǎn)陣,每個(gè)發(fā)光二極管構(gòu)成點(diǎn)陣中的一個(gè)點(diǎn)。這種點(diǎn)陣顯示器不僅可以靜態(tài)的顯示信息,而且可以通過動(dòng)態(tài)滾動(dòng),增加信息顯示的容量和效果,因此應(yīng)用十分廣泛。4.2.1 LED點(diǎn)陣顯示原理 LED點(diǎn)陣顯示器的分類有多種方法:按陣列點(diǎn)數(shù)可分為5×7、5×8、6×8、8×8這4種,按發(fā)光顏色可分為單色、雙色、三色;按極性排列方式可分為共陽(yáng)極型和共陰極型。圖4.10為常見的8×8 LED點(diǎn)陣顯示器,
22、它由64個(gè)發(fā)光二極管組成,且每個(gè)發(fā)光二極管是放置在行線和列線的交叉點(diǎn)上。當(dāng)對(duì)應(yīng)的某一行置1電平,某一列置0電平,則相應(yīng)的二極管就亮。如要將第一個(gè)點(diǎn)亮,則將第9腳接高電平第13腳接低電平;如果要將第一行點(diǎn)亮,則將第9腳要接高電平,而第13、3、4、10、6、11、15、16這些引腳接低電平;如要將第一列點(diǎn)亮,則第13腳接低電平,而第9、14、8、12、1、7、2、5引腳接高電平。從原理上來說,模塊沒有共陽(yáng)或共陰之分,共陽(yáng)的翻轉(zhuǎn)90度就是共陰的了,共陰的翻轉(zhuǎn)90度就是共陽(yáng)的了。但電路會(huì)有行掃描接陰或行掃描接陽(yáng)之分。圖4.10 8×8 LED點(diǎn)陣管腳圖 顯示單個(gè)字母、數(shù)字時(shí),只需要一個(gè)5&
23、#215;7的LED點(diǎn)陣顯示器即可,顯示漢字時(shí),需要使用多個(gè)LED點(diǎn)陣顯示器組合,最常見的組合方式有15×14、16×15、16×16、32×32等。例如一個(gè)16×16的點(diǎn)陣由4個(gè)8×8點(diǎn)陣組合而成,即每一個(gè)漢字在縱、橫各16點(diǎn)的區(qū)域內(nèi)顯示,需要筆畫經(jīng)過地方的發(fā)光二極管都為點(diǎn)亮狀態(tài)(即“1”),沒有筆畫地方的發(fā)光二極管都為熄滅狀態(tài)(即“0”),這樣就可以表示不同的漢字。 LED點(diǎn)陣顯示器與LED數(shù)碼管類似,常用的工作方式有靜態(tài)顯示和動(dòng)態(tài)顯示兩種方式。所謂靜態(tài)顯示,就是當(dāng)顯示器顯示一個(gè)字符時(shí),相應(yīng)的發(fā)光二極管始終保持導(dǎo)通或截止,在顯示的
24、這個(gè)過程中,其狀態(tài)是靜止不變的,直到一個(gè)字符顯示完畢,將要顯示下一個(gè)字符時(shí)其狀態(tài)才改變。而動(dòng)態(tài)顯示方式則不同,它在顯示每一個(gè)字符的過程中,都是按列(或行)不停掃描,一位一位地輪流點(diǎn)亮要顯示的各個(gè)位,如此反復(fù)循環(huán)。動(dòng)態(tài)顯示方式利用了人眼的視覺暫留性質(zhì),當(dāng)掃描的速度足夠快時(shí),可以得到靜態(tài)的顯示效果。由于 LED點(diǎn)陣引腳設(shè)計(jì)的特殊性,一般采用動(dòng)態(tài)掃描顯示方式。 下面介紹用動(dòng)態(tài)掃描方式在8×8 共陽(yáng)極LED點(diǎn)陣顯示器上顯示字符“B”的過程(如圖4.11所示),由此簡(jiǎn)要說明動(dòng)態(tài)掃描的原理。圖4.11 用動(dòng)態(tài)掃描方式顯示字符“B”的過程 假設(shè)X、Y為兩個(gè)8位的字節(jié)型數(shù)據(jù),X的每位對(duì)應(yīng)LED點(diǎn)陣的
25、8條列線X7X0,同樣Y的每位對(duì)應(yīng)LED點(diǎn)陣的8條行線Y7Y0。Y叫行掃描線,在每個(gè)時(shí)刻只有一條為“1”,即有效行選通電平;X叫列數(shù)據(jù)線,其內(nèi)容就是點(diǎn)陣化的字模數(shù)據(jù)的體現(xiàn)。 Y=0x01,X=0xFF,如圖4-11中的第一幀; Y=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中的第八
26、幀; 跳到第步循環(huán)。如果高速地進(jìn)行的循環(huán),且兩個(gè)步驟的間隔時(shí)間小于1/24s,則由于視覺暫留,LED顯示屏上將呈現(xiàn)出一個(gè)完整的“B”字符。4.2.2 8×8 LED點(diǎn)陣顯示實(shí)例實(shí)例4-3 8×8 LED點(diǎn)陣數(shù)字顯示任務(wù)要求:利用MSP430F249單片機(jī)控制一個(gè)8×8 LED點(diǎn)陣顯示器,使其循環(huán)顯示數(shù)字09。1) 硬件電路設(shè)計(jì) 選用MSP430F249單片機(jī)的P2口控制LED點(diǎn)陣的行掃描信號(hào),P1口控制點(diǎn)陣的列顯示數(shù)據(jù),硬件原理圖如圖4.12所示。圖4.12 點(diǎn)陣顯示數(shù)字字符硬件原理圖2)程序設(shè)計(jì)#include "msp430f249.h"#
27、define uchar unsigned char#define uint unsigned int/數(shù)字09的8*8點(diǎn)陣編碼const uchar Table_OF_Digits = 0x00,0x3C,0x66,0x42,0x42,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
28、,0x00,/4 0x00,0x7E,0x40,0x7C,0x02,0x42,0x3C,0x00,/5 0x00,0x3C,0x40,0x7C,0x42,0x42,0x3C,0x00,/6 0x00,0x7E,0x44,0x08,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 d
29、elayus(uint t) uint i; while(t-) for(i=1300;i>0;i-); /仿真時(shí),取值130void main(void) char i,j,t=0; WDTCTL = WDTPW + WDTHOLD; P1DIR = 0xFF; P2DIR = 0xFF; while(1) P1OUT = 0xFF; /關(guān)閉顯示,防止切換數(shù)字時(shí)產(chǎn)生拖影 P2OUT = 0xFF; for(i = 0;i < 10;i+) /循環(huán)顯示09 for(j = 0 ;j < 255 ; j+) /每個(gè)字符顯示穩(wěn)定 P2OUT = scan_tabt; /送行掃描信
30、號(hào) P1OUT = Table_OF_Digitst+8*i;/送列顯示數(shù)據(jù) delayus(2); if(+t=8) t=0; 程序說明:在主循環(huán)中對(duì)09這10個(gè)數(shù)字進(jìn)行循環(huán)顯示,每個(gè)數(shù)字掃描次數(shù)為255,是為了讓每個(gè)數(shù)字顯示時(shí)間足夠長(zhǎng),得到穩(wěn)定的顯示效果。P2口送出行掃描信號(hào)后,P1口給出列顯示數(shù)據(jù),注意此例中8×8點(diǎn)陣為共陰極接法,顯示數(shù)據(jù)是經(jīng)過取反后送出的。3)仿真結(jié)果 加載程序后,運(yùn)行得到仿真圖如圖4.13所示。圖4.13 點(diǎn)陣顯示數(shù)字字符仿真圖4.2.3 16×16漢字點(diǎn)陣顯示與字母和數(shù)字顯示原理一樣,16×16漢字點(diǎn)陣的顯示也是采用動(dòng)態(tài)逐行(或逐列)
31、掃描的方式完成,只是列掃描需要16位,而每列數(shù)據(jù)需要2×8位(2字節(jié)),一個(gè)完整的漢字則需要32字節(jié)。1、點(diǎn)陣驅(qū)動(dòng)電路實(shí)例4-3中,單片機(jī)控制一個(gè)8×8 LED點(diǎn)陣顯示器,需要兩組I/O口,其中一組實(shí)現(xiàn)點(diǎn)陣的行掃描,另一組輸出列數(shù)據(jù)。按照這種硬件連接方式,如果利用單片機(jī)控制一個(gè)16×16漢字點(diǎn)陣實(shí)現(xiàn)顯示功能,則需要8組I/O口;如果控制多個(gè)漢字點(diǎn)陣顯示,則需要更多的I/O口。顯然,這種連接方式是難以實(shí)現(xiàn)的。因此,在多個(gè)點(diǎn)陣驅(qū)動(dòng)電路設(shè)計(jì)中,一般采用移位寄存器的方法來減少對(duì)單片機(jī)I/O口的需求。寄存器是存放二進(jìn)制數(shù)的電路,由D觸發(fā)器構(gòu)成,如圖4.14所示。在CP時(shí)鐘信
32、號(hào)的上升沿,將輸入的數(shù)字DI存入到D觸發(fā)器中,Q端的輸出就與DI相同,即無(wú)論觸發(fā)器Q原來的值是什么,只要時(shí)鐘脈沖CP上升沿到來,加在數(shù)據(jù)輸入端的數(shù)據(jù)就立即被送入觸發(fā)器中,當(dāng)DI端信號(hào)消失,輸出Q保持不變,數(shù)據(jù)被保存在觸發(fā)器中,所以又稱為寄存器。將多個(gè)寄存器級(jí)聯(lián),第一級(jí)D觸發(fā)器接輸入信號(hào)DI ,其余觸發(fā)器輸入D接前級(jí)輸出Q,所有CP連在一起接輸入移位脈沖,所有D觸發(fā)器都在一個(gè)CP的上升沿工作,這種電路稱為移位寄存器。以4個(gè)D觸發(fā)器構(gòu)成的4級(jí)移位寄存器為例,如圖4.15所示。 圖4.14 D觸發(fā)器移位脈沖CP3214串入DI 圖4.15 4位移位寄存器在移位脈沖的作用下,輸入信息的當(dāng)前數(shù)字DI存入
33、第一級(jí)D觸發(fā)器,第一級(jí)D觸發(fā)器的狀態(tài)存入到第二級(jí)D觸發(fā)器,依此類推,低位D觸發(fā)器存入高位D觸發(fā)器狀態(tài),實(shí)現(xiàn)了輸入數(shù)碼在移位脈沖的作用下向左逐位移存。假設(shè)所有寄存器初態(tài)為0,DI = 1101串行送入寄存器輸入,如圖4-16所示。當(dāng)?shù)谝粋€(gè)移位脈沖上升沿到來后,DI =1,第一個(gè)觸發(fā)器輸出Q=D,而因?yàn)槌跏贾刀紴?,所有Q2、3、Q4依然為0。當(dāng)?shù)诙€(gè)移位脈沖上升沿到來后,DI=1,因此Q1=1,而Q2的值等于觸發(fā)器Q1之前的輸出1,依次類推,當(dāng)?shù)谒膫€(gè)脈沖的上升沿到來后,Q4Q3Q2Q1=1101。圖4.16 4位移位寄存器串行移位在4個(gè)CP作用下,輸入的4位串行數(shù)碼1101全部存入了寄存器中。這
34、種方式稱為串行輸入。寄存器中的4位數(shù)碼1101是并行輸出,這種方式稱為并行輸出。當(dāng)移位脈沖繼續(xù)產(chǎn)生,而輸入全部為0時(shí),可以看到每一個(gè)觸發(fā)器的輸出都是在對(duì)輸入的1101進(jìn)行移位操作。移位寄存器的特點(diǎn)如下:(1)單向移位寄存器中的數(shù)字,在CP脈沖操作下,可以依次右移或左移。(2)n位單向移位寄存器可以寄存n位二進(jìn)制代碼。n個(gè)CP脈沖即可完成串行輸入工作,此后可從Q1Qn端獲得并行的n位二進(jìn)制數(shù)字,再用n個(gè)CP脈沖又可實(shí)現(xiàn)串行輸出操作。(3)若串行輸入端狀態(tài)為0,則n個(gè)CP脈沖后,寄存器便被清零。利用移位寄存器串行輸入、并行輸出的特點(diǎn),在驅(qū)動(dòng)16×16點(diǎn)陣的列信號(hào)時(shí),可以在單片機(jī)和點(diǎn)陣之間
35、增加一個(gè)8位的移位寄存器。由單片機(jī)產(chǎn)生CP時(shí)鐘信號(hào)和所需的串行數(shù)據(jù)輸出信號(hào),在8個(gè)CP時(shí)鐘后,可以將串行數(shù)據(jù)移入移位寄存器并行輸出。因此,這種驅(qū)動(dòng)方式只需要單片機(jī)的兩個(gè)I/O口,大大節(jié)約了單片機(jī)的占用引腳資源。本書選擇點(diǎn)陣顯示系統(tǒng)中常用移位寄存器74HC595來實(shí)現(xiàn)點(diǎn)陣列數(shù)據(jù)的串行輸入、并行輸出功能。74HC595的管腳圖和邏輯圖如圖4.17和4.18所示。 圖4.17 74HC595管腳圖 4.18 74HC595邏輯功能圖74HC595輸入端是8位串行移位寄存器,輸出端是8位并行緩存器,具有鎖存功能。其管腳功能描述如表4-1所示。表4-1 74HC595管腳描述管腳符號(hào)管腳編號(hào)描述Q0 到
36、Q715, 1到 7并行數(shù)據(jù)輸出GND 8地Q7 9 串行數(shù)據(jù)輸出MR 10復(fù)位,低電平有效SHCP11串行移位時(shí)鐘STCP12 鎖存時(shí)鐘OE 13 輸出使能,低電平有效DS14串行數(shù)據(jù)輸入VCC16電源74HC595的邏輯功能是在串行移位時(shí)鐘SHCP的上升沿,將串行數(shù)據(jù)輸入DS的數(shù)據(jù),從低位到高位依次移入內(nèi)部的寄存器中,當(dāng)8個(gè)數(shù)據(jù)都移入后,若OE為低電平,通過STCP 的上升沿將8個(gè)數(shù)據(jù)輸出到Q0Q7引腳上。由于74HC595輸出電流較大,可以直接驅(qū)動(dòng)LED,因此,在亮度要求不高的設(shè)計(jì)中,可以直接將74HC595輸出端連接到LED點(diǎn)陣。一片74HC595能驅(qū)動(dòng)一個(gè)8位的點(diǎn)陣列輸入,若需要驅(qū)動(dòng)
37、多個(gè)點(diǎn)陣,則可利用74HC595的Q7串行數(shù)據(jù)輸出端,將多個(gè)74HC595串聯(lián)起來使用,如圖4.19所示。VIQ7Q78x8點(diǎn)陣8x8點(diǎn)陣8x8點(diǎn)陣74HC59574HC59574HC595·············· 圖4.19 多片74HC595級(jí)聯(lián)驅(qū)動(dòng)點(diǎn)陣示意圖另外,由于74HC595串行數(shù)據(jù)時(shí)鐘和鎖存時(shí)鐘是獨(dú)立的,移位時(shí)鐘SHCP的上升沿將串行數(shù)據(jù)移入內(nèi)部的寄存器后,在鎖存時(shí)鐘STCP的作用下才會(huì)輸出到Q0Q7。當(dāng)多片74HC595級(jí)聯(lián)驅(qū)動(dòng)點(diǎn)陣的時(shí)
38、候,通過同一個(gè)鎖存時(shí)鐘STCP,在所有列數(shù)據(jù)準(zhǔn)備好后,啟動(dòng)鎖存信號(hào)使所有數(shù)據(jù)同時(shí)鎖存并輸出,滿足多個(gè)點(diǎn)陣列數(shù)據(jù)并行輸出的目的。串行數(shù)據(jù)時(shí)鐘,串行數(shù)據(jù)輸入對(duì)于430單片機(jī)可以通過內(nèi)部的SPI接口實(shí)現(xiàn)高速數(shù)據(jù)傳輸,也可以采用I/O端口模擬所需的時(shí)序的方式。串行數(shù)據(jù)時(shí)鐘模擬的方法是按照移位脈沖時(shí)序圖,利用單片機(jī)的I/O端口定時(shí)輸出高電平或者低電平,以獲得所需的時(shí)鐘信號(hào)。對(duì)串行數(shù)據(jù)的輸出,可以通過程序判斷8位的數(shù)據(jù)的最高位是否為1,將數(shù)據(jù)輸出端口置高或者置低。并將數(shù)據(jù)左移一位,循環(huán)八次后即可實(shí)現(xiàn)輸出8位的串行數(shù)據(jù)。下面以單片機(jī)向74HC595串行發(fā)送一個(gè)字節(jié)函數(shù)send_byte為例。#define
39、SHCP_H P3OUT |= BIT2#define SHCP_L P3OUT &= BIT2#define DS_H P3OUT |= BIT1#define DS_L P3OUT &= BIT1void send_byte(char data) char i,k; for(i=0; i< 8 ; i+) /循環(huán)8次發(fā)送一個(gè)字節(jié) if (data&0x80)= 0) /最高為1 DS_L; /串行輸出信號(hào)置低 else DS_H; /串行輸出信號(hào)置高 data=data<<1; /數(shù)據(jù)左移1位 SHCP_H; /移位時(shí)鐘信號(hào)產(chǎn)生上升沿 for(k=
40、2;k>0;k-);/ 時(shí)鐘延遲 SHCP_L; for(k=2;k>0;k-); 其中DS_L和DS_H分別是單片機(jī)I/O端口輸出串行數(shù)據(jù)的宏定義,SHCP_L和SHCP_H是輸出串行移位脈沖的宏定義,假定串行數(shù)據(jù)用P3.1端口,串行移位脈沖用P3.2端口。從程序可以看出,通過軟件模擬串行移位方式是參照移位寄存器的時(shí)序圖實(shí)現(xiàn)的,這種方式可以推廣到具有串行輸入或者輸出方式的芯片驅(qū)動(dòng)中。同理,除了列數(shù)據(jù)輸出電路以外,還需要行輸出電路實(shí)現(xiàn)逐行選通控制功能,即16×16的漢字點(diǎn)陣需要從上到下循環(huán)掃描16次,每次掃描過程中某一行被選通,而其他行都要關(guān)閉。為減少單片機(jī)端口的占用,可
41、以使用74HC154譯碼器實(shí)現(xiàn)點(diǎn)陣行掃描的驅(qū)動(dòng)。74HC154是一種4線/16線譯碼器,數(shù)據(jù)輸入端有4位,數(shù)據(jù)輸出端有24 = 16個(gè)。74HC154譯碼器的管腳圖如圖4.20所示,其輸入輸出關(guān)系如表4-2所示。圖4.20 74HC154管腳圖表4-2 74HC154的輸入輸出關(guān)系表輸入輸出ABCDY0Y1Y2Y3Y4Y5Y6Y7Y8Y9Y10Y11Y12Y13Y14Y150000011111111111111100011011111111111111001011011111111111110011111011111111111101001111011111111111010111111011
42、1111111101101111110111111111011111111110111111111000111111110111111110011111111110111111101011111111110111111011111111111110111111001111111111110111110111111111111110111110111111111111110111111111111111111110從上表可以看出,當(dāng)輸入一個(gè)015的二進(jìn)制數(shù)據(jù)時(shí),對(duì)應(yīng)的某個(gè)Y引腳輸出低電平,而其它輸出引腳為高電平,正好滿足行掃描的要求。如果需要行掃描時(shí)輸出高電平,通過74HC154輸出端接入反相器
43、即可。值得注意的是,74HC154輸出電流只有20mA,按每一個(gè)LED器件需要10 mA計(jì)算,16個(gè)LED同時(shí)發(fā)光時(shí),需要160 mA電流,因此實(shí)際應(yīng)用中應(yīng)增加專用電流驅(qū)動(dòng)電路如ULN2803或者三極管才能實(shí)現(xiàn)行掃描驅(qū)動(dòng)。如果需要完成16×16點(diǎn)陣的驅(qū)動(dòng),則共需要4片74HC595級(jí)聯(lián)實(shí)現(xiàn)其列數(shù)據(jù)輸入,其級(jí)聯(lián)方式參照漢字取模的方式。每片74HC595的Q0Q7連接一個(gè)8×8點(diǎn)陣的8根列數(shù)據(jù)輸入引腳,而點(diǎn)陣的行掃描信號(hào)連接到1片74HC154的Y0Y15即可。依照此方式,可以完成更多點(diǎn)陣級(jí)聯(lián)的驅(qū)動(dòng)電路。2、漢字字模提取根據(jù)前面所述,16×16點(diǎn)陣由4個(gè)8×
44、8點(diǎn)陣組成,分別為ABCD四個(gè)部分,如圖4.22所示。圖4.22 16×16點(diǎn)陣組成示意圖其漢字顯示需要先獲得漢字點(diǎn)陣的數(shù)據(jù)后,才能通過單片機(jī)驅(qū)動(dòng)點(diǎn)陣顯示,這種獲得漢字點(diǎn)陣的方法稱為取模,取模方式按照點(diǎn)陣驅(qū)動(dòng)的不同,可以有ABCD、ACBD、BACD、CABD4種順序。取模后得到的數(shù)據(jù)保存在數(shù)組中。由于這些數(shù)據(jù)是常量,在程序設(shè)計(jì)中一般用const關(guān)鍵字來描述。對(duì)于430序列單片機(jī),常量會(huì)保存到單片機(jī)內(nèi)部的flash存儲(chǔ)器中,以節(jié)省內(nèi)存空間的占用。漢字取模通常用取模軟件完成,如字模提取軟件,zimo等。本書使用的是字模提取軟件如圖4.23所示。圖4.23 字模提取軟件這里字模提取方式為
45、橫向取模,取模順序?yàn)锳BCD。比如漢字“中”取模得到的數(shù)據(jù)為: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數(shù)據(jù)共32個(gè)字節(jié),對(duì)照上面提取軟件的點(diǎn)陣圖像可以看出,0x01對(duì)應(yīng)是左上的第一行數(shù)據(jù),0x00對(duì)應(yīng)的是右上的第一行,如此類推。根據(jù)取模的方式,硬件上對(duì)74HC595級(jí)聯(lián)時(shí),如果是ABCD這種方式,則是AB級(jí)聯(lián),CD級(jí)聯(lián),
46、我們?cè)趩纹瑱C(jī)程序中輸出數(shù)據(jù)的順序也要按照取模的順序。3、16×16LED點(diǎn)陣漢字顯示實(shí)例實(shí)例4-4 16×64 LED點(diǎn)陣漢字顯示任務(wù)要求:利用16個(gè)8×8點(diǎn)陣構(gòu)成4個(gè)16×16點(diǎn)陣,顯示四個(gè)漢字字符:“中國(guó)你好”。分析說明:4個(gè)16×16點(diǎn)陣用8片74HC595輸出列數(shù)據(jù)驅(qū)動(dòng),行掃描可以用1片74HC154譯碼器實(shí)現(xiàn),將占用單片機(jī)I/0口的資源降到最低,同時(shí)也解決了單片機(jī)輸出電流不足的問題。1)硬件電路設(shè)計(jì)16個(gè)8×8 點(diǎn)陣構(gòu)成 4個(gè)16×16點(diǎn)陣漢字,單片機(jī)控制其顯示的原理框圖如圖4-24所示。該點(diǎn)陣為“行共陰極”,即一
47、行中所有的陰極接在一起。16條行選通利用單片機(jī)的4個(gè)I/O口控制4線/16線譯碼器74HC154,實(shí)現(xiàn)16條行線的低電平分別選通。每1個(gè)8×8 點(diǎn)陣的列線由1片8位串入并出移位寄存器 74HC595控制。74HC595輸出具有鎖存功能,使得74HC595鎖存顯示某一行數(shù)據(jù)時(shí),單片機(jī)可以進(jìn)行下一行數(shù)據(jù)的傳送。16x16點(diǎn)陣74HC15416x16點(diǎn)陣16x16點(diǎn)陣16x16點(diǎn)陣行掃描輸出列數(shù)據(jù)輸出74HC595 x274HC595 x274HC595 x274HC595 x2STCPDSSHCPMSP430單片機(jī)圖4.24 16×64 LED點(diǎn)陣顯示原理框圖圖4.24中,74
48、HC595首尾串行連接,每?jī)善?qū)動(dòng)一個(gè)16×16點(diǎn)陣的列,一共有8片74HC595,所有74HC595共用SHcp和STcp時(shí)鐘信號(hào),在單片機(jī)輸出的SHcp驅(qū)動(dòng)下,數(shù)據(jù)從DS端輸入到第一片74HC595的DS端,經(jīng)過8個(gè)時(shí)鐘脈沖將第一個(gè)數(shù)據(jù)輸出到第一片74HC595,在下一個(gè)時(shí)鐘脈沖的作用下,一方面第一片74HC595繼續(xù)接收數(shù)據(jù),另一方面將接收的數(shù)據(jù)移位輸出到第二片74HC595,如此經(jīng)過16x8 = 256個(gè)時(shí)鐘的驅(qū)動(dòng),可將所有的行數(shù)據(jù)保存在16個(gè)74HC595內(nèi)部寄存器中,再經(jīng)過STcp鎖存信號(hào)驅(qū)動(dòng)輸出到LED點(diǎn)陣。同時(shí)單片機(jī)此時(shí)應(yīng)輸出行的編號(hào),通過74HC154選通行信號(hào)點(diǎn)亮
49、漢字字模對(duì)應(yīng)的LED。當(dāng)所有的行掃描結(jié)束后再次循環(huán),從而輸出所需的漢字。按照顯示原理框圖設(shè)計(jì)的proteus硬件電路如圖4.25所示。圖4.25 16×64 LED點(diǎn)陣硬件電路圖圖4.25中,為簡(jiǎn)化圖紙,芯片之間的電路連接都采用網(wǎng)絡(luò)標(biāo)號(hào)實(shí)現(xiàn)。其中P1.0、P1.1、P1.2、P1.3作為74HC154譯碼器輸入信號(hào),P3.0作為鎖存時(shí)鐘信號(hào)STcp輸出端,P3.1作為串行數(shù)據(jù)輸出端連接到74HC595的DS端,P3.2作為串行移位時(shí)鐘信號(hào)輸出端連接到74HC595的SHcp端。2)程序設(shè)計(jì)#include "msp430f249.h"#define SHCP_H
50、P3OUT |= BIT2#define SHCP_L P3OUT &= BIT2#define DS_H P3OUT |= BIT1#define DS_L P3OUT &= BIT1#define STCP_H 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,0
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業(yè)玉米收購(gòu)合同范本
- 外賣品牌加盟合同范本
- 醫(yī)院廚房協(xié)議合同范本
- 司機(jī)和公司合同范本
- 2025年腫瘤醫(yī)療服務(wù)合作協(xié)議書
- 叉車質(zhì)保合同范本
- 南京古玩買賣合同范本
- 勞動(dòng)合同范本 證明
- 印刷材料合同范本
- 公司服務(wù)用房合同范例
- 湖北聯(lián)投集團(tuán)2024校園招聘【298人】管理單位遴選500模擬題附帶答案詳解
- 機(jī)柜 施工方案
- 設(shè)計(jì)質(zhì)量、進(jìn)度、安全、保密等管理方案及保障措施
- 單片機(jī)應(yīng)用技術(shù)學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 文藝復(fù)興史學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 產(chǎn)后出血-教學(xué)查房
- 2024年新疆中考數(shù)學(xué)試卷(含答案解析)
- 2025年高考物理二輪復(fù)習(xí)的教學(xué)對(duì)策與思考講座
- 血液透析并發(fā)癥頭痛
- 職業(yè)病防護(hù)設(shè)施與個(gè)體防護(hù)用品的使用和維護(hù)
- 2023年全國(guó)職業(yè)院校技能大賽-直播電商賽項(xiàng)規(guī)程
評(píng)論
0/150
提交評(píng)論