




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
模塊5顯示和鍵盤接口技術任務7LED數(shù)碼管顯示的簡易秒表倒計時設計任務8編制數(shù)碼管動態(tài)顯示程序任務9字符型LCD液晶顯示歡迎界面任務10用矩陣鍵盤控制8路跑馬燈習題5任務7LED數(shù)碼管顯示的簡易秒表倒計時設計
1.任務目的通過對由LED數(shù)碼管顯示一位數(shù)0~9簡易倒計時秒表的制作,熟悉單片機與LED數(shù)碼管的接口技術,進一步了解數(shù)組的定義、賦值、初始化等操作方法。
2.任務要求用單片機實現(xiàn)一位數(shù)簡易秒表倒計時控制,計時范圍為0~9s,并將計時時間在一位數(shù)碼管上顯示出來。
3.電路設計用單片機控制LED數(shù)碼管顯示的簡易秒表硬件電路如圖5.1所示,單片機的P0口8個引腳接到數(shù)碼管的8個段控制端。圖5.1中采用的是共陽極數(shù)碼管,所以COM端(公共端)接P2.7作為選通端。如果是共陰極數(shù)碼管,則須將COM端接地。圖5.1數(shù)碼管倒計時電路
4.程序設計
/*功能:數(shù)碼管顯示10秒倒計時*/
/*數(shù)碼管硬件結(jié)構選擇為:三極管驅(qū)動8位共陽極數(shù)碼管*/
#include<reg51.h>
#defineucharunsignedchar
#defineuintunsignedint
#definesm_dataP0 //?P0選擇段碼
sbitp2_7=P2^7;
voiddelay1s()
{
uchari;
for(i=0;i<0x14;i++)
{
TH1=0x3c;
TL1=0xb0;
TR1=1; //此三行為單片機設定定時時間,在定時計數(shù)章節(jié)詳細介紹
while(!TF1);
TF1=0;
}
}voidmain(){uchari;uintzk[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x18};//共陽極數(shù)碼管對應的0到9十六進制編碼
TMOD=0x10;while(1){
p2_7=0;
for(i=9;i>=0;i--)
{ sm_data=zk[i];
delay1s();
}
}}
5.程序運行測試編譯、鏈接過程參見任務2,將二進制文檔ex5_1.hex下載到單片機的程序存儲器中。接通電路板電源,即可觀察到一位簡易秒表按照9~0的順序顯示。
6.任務小結(jié)本任務采用單片機P0口控制共陽極數(shù)碼管顯示,實現(xiàn)顯示0~9的簡易秒表倒計時。在程序ex5_1.c中,定義zk數(shù)組存放數(shù)字0~9的顯示字型碼,將顯示字型碼通過P0口送到LED段控制端,顯示相應的數(shù)字。將數(shù)組元素的下標作為循環(huán)控制變量是最常用的數(shù)組應用方法。5.1數(shù)組在程序設計中,為了處理方便,通常把具有相同類型的若干數(shù)據(jù)項按有序的形式組織起來,這些按序排列的同類數(shù)據(jù)元素的集合稱為數(shù)組。組成數(shù)組的各個數(shù)據(jù)分項稱為數(shù)組元素。數(shù)組屬于常用的數(shù)據(jù)類型,數(shù)組中的元素有固定數(shù)目和相同的類型,數(shù)組元素的數(shù)據(jù)類型就是該數(shù)組的類型。常用的數(shù)組為一維、二維和字符數(shù)組。5.1.1一維數(shù)組
1.一維數(shù)組的定義定義格式如下:類型說明符 數(shù)組名[常量表達式];類型說明符是數(shù)組中各個元素的數(shù)據(jù)類型;數(shù)組名是用戶定義的數(shù)組標識符;常量表達式表示數(shù)組元素的個數(shù)。如:
inta[4]; //定義整型數(shù)組a,有4個元素,a[0]、a[1]、a[2]、a[3]
charb[5]; //定義字符數(shù)組b,有5個元素定義數(shù)組時,應注意以下幾點:
(1)對于同一數(shù)組,所有元素的數(shù)據(jù)類型都必須是相同的。
(2)數(shù)組名的書寫規(guī)則應符合標識符的書寫規(guī)定。
(3)數(shù)組名不能與其他變量名相同。
(4)方括號中的常量表達式不可以是變量,但可以是符號常數(shù)和常量表達式。如:
#defineNUM4
main()
{
inta[NUM],b[4-2];
}
(5)可以在一個類型說明中,定義多個數(shù)組和變量?!?/p>
2.數(shù)組元素數(shù)組元素也是一種變量,其標識方法為數(shù)組名后跟一個下標。它只能為整型數(shù)或整型表達式。定義格式如下:數(shù)組名[下標]如:zk[7],a[i]?等都是合法的。下標表示該數(shù)組元素在數(shù)值中的位置,其值從0開始,下標為0的數(shù)組元素是數(shù)組中的第一個數(shù)組元素,zk[7]?為該數(shù)組中的第8個元素。在程序中不能一次引用整個數(shù)組,只能逐個使用數(shù)組元素。如任務7中秒表倒計時程序中的程序段:
for(i=9;i>=0;i--)
{
sm_data=zk[i];
}
3.數(shù)組賦值給數(shù)組賦值的方法有賦值語句和初始化賦值兩種。
(1)在程序執(zhí)行過程中,可用賦值語句對數(shù)組元素逐個賦值。如:
for(i=0;i<10;i++)
{
Num[i]=i;
}
(2)數(shù)組初始化賦值是指在數(shù)組定義時給數(shù)組元素賦予初值。如:
intnum[10]={0,1,2,3,4,5,6,7,8,9};這種賦值方式是在編譯階段完成的,可以減少程序運行時間,提高程序執(zhí)行效率。小提示數(shù)組說明和下標變量在形式上有些相似,但這兩者具有完全不同的含義。數(shù)組說明的方括號給出的是長度,即可取下標的最大值加1;而數(shù)組元素中的下標是該元素在數(shù)組中的位置標識。前者只能是常量,后者可以是常量、變量或表達式。5.1.2字符數(shù)組前面介紹的數(shù)組是數(shù)值型的數(shù)組,數(shù)組中的每一個元素都用來存放數(shù)值型的數(shù)據(jù)。數(shù)組不僅可以是數(shù)值型的,也可以是字符型的或其他類型的(如指針型、結(jié)構體型)。字符數(shù)組的定義格式與一維數(shù)組的定義類似,用來存放字符數(shù)據(jù)的數(shù)組是字符數(shù)組。字符數(shù)組中的一個元素就是一個字符。可以在定義字符數(shù)組時對各元素賦初值,即初始化。例如:
charc[10]={'I','','a','m','','h','a','p','p','y'};把10個字符分別賦給c[0]~c[9]這10個元素。如果在定義字符數(shù)組時不進行初始化,則數(shù)組中各元素的值是不可預知的。如果大括號中提供的初值個數(shù)大于數(shù)組長度,則按語法錯誤處理。如果初值個數(shù)小于數(shù)組長度,則只將這些字符賦給數(shù)組中前面那些元素,其余的元素自動定義為空字符(即?'\0'?)。任務8編制數(shù)碼管動態(tài)顯示程序
1.任務目的根據(jù)電路編寫在4個數(shù)碼管上穩(wěn)定顯示“1234”的程序,了解數(shù)碼管動態(tài)顯示的驅(qū)動。
2.任務要求采用動態(tài)顯示方式,用單片機實現(xiàn)4位數(shù)碼管穩(wěn)定顯示“1234”。
3.電路設計電路設計圖如圖5.2所示。圖5.24個共陽極數(shù)碼管電路
4.程序設計
4位數(shù)碼管動態(tài)顯示“1234”的程序如下:
/*功能:讓4個數(shù)碼管依次顯示1~4,調(diào)整delay函數(shù)中的數(shù)值,可使數(shù)碼管全亮或每次只亮一個*/
/*數(shù)碼管硬件結(jié)構選擇為:三極管驅(qū)動8位共陽極數(shù)碼管*/
#include<reg51.h>
#defineucharunsignedchar
#defineuintunsignedint
#definesm_dataP0 //?P0選擇段碼
#definesm_dpP2 //?P2選擇位
voiddelay(uintx);
voidmain()
{
uchari;
uintzk[10]={0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x18};
//共陽極數(shù)碼管對應的1到9十六進制編碼
while(1){for(i=0;i<4;i++){ sm_dp=(i==0)?0xEF:(sm_dp<<1)+1;//?(sm_dp<<1)+1保證每次只點亮一個數(shù)碼管
sm_data=zk[i];
delay(5); //延時時間決定只亮一個數(shù)碼管,還是所有數(shù)碼管均有顯示改變delay函數(shù)中的數(shù)值,可觀察到不同的視覺暫留效果。根據(jù)實踐所得,當delay函數(shù)中的數(shù)值為1~5時,數(shù)碼管全亮效果最佳;當delay函數(shù)中的數(shù)值為80以上時,清楚可見每次只有一個數(shù)碼管有顯示
}}}
voiddelay(uintn)
{
uchari;
while(n--)
for(i=0;i<125;i++);
}
5.任務小結(jié)與靜態(tài)顯示方式相比,當顯示位數(shù)較多時,動態(tài)顯示方式可以節(jié)省I/O端口資源,硬件電路簡單。但其顯示的亮度低于靜態(tài)顯示方式;由于CPU要不斷地依次運行掃描顯示程序,將占用CPU更多的時間。若顯示位數(shù)較少,采用靜態(tài)顯示方式更加簡便。5.2單片機與LED數(shù)碼管接口5.2.1LED數(shù)碼管的結(jié)構及原理
1.?LED數(shù)碼管的結(jié)構在單片機系統(tǒng)中,經(jīng)常采用LED數(shù)碼管來顯示單片機系統(tǒng)的工作狀態(tài)、運算結(jié)果等各種信息。LED數(shù)碼管是單片機人機對話的一種重要輸出設備。單個LED數(shù)碼管的外形如圖5.3所示,外部引腳如圖5.4所示。LED數(shù)碼管由8個發(fā)光二極管組成,通過不同的發(fā)光字段組合可顯示數(shù)字0~9、字符A~F、H、L、P、R、U、Y、符號“—”及小數(shù)點“.”等。按照內(nèi)部8個發(fā)光二極管連接方式的不同,LED數(shù)碼管可分為共陽極型LED數(shù)碼管和共陰極型LED數(shù)碼管兩種。其內(nèi)部結(jié)構如圖5.5所示。圖5.3數(shù)碼管外形圖圖5.4數(shù)碼管引腳圖圖5.5LED數(shù)碼管內(nèi)部結(jié)構圖
2.?LED數(shù)碼管的工作原理這里以共陽極型為例說明LED數(shù)碼管的工作原理。從任務8中我們知道,若將數(shù)值0送至單片機的P0口,數(shù)碼管上不會顯示數(shù)字“0”。顯然,要使數(shù)碼管顯示數(shù)字或字符,直接將相應的數(shù)字或字符送至數(shù)碼管的段控制端是不行的,必須使段控制端輸出相應的字型編碼。如圖5.5(a)所示,共陽極數(shù)碼管的8個發(fā)光二極管的陽極連接在一起,作為公共控制端(com),陰極作為“段”控制端。
(1)當公共端接低電平時,每個發(fā)光二極管都是截止的狀態(tài),無法發(fā)光。
(2)當公共端接高電平時,當某段控制端為低電平時,該段對應的發(fā)光二極管導通并點亮。通過點亮不同的段,顯示出不同的字符。如顯示數(shù)字1時,b、c兩端接低電平,其他各端接高電平。在任務8中,單片機P0口的八個引腳依次與數(shù)碼管的a、b、…、f、dp八個段控制引腳相連接。要顯示數(shù)字“0”,數(shù)碼管的a、b、c、d、e、f六個段應點亮,其他段熄滅,需向P0口傳送數(shù)據(jù)11000000(C0H),該數(shù)據(jù)就是與字符“0”相對應的共陽極字型編碼。共陰極型LED數(shù)碼管的發(fā)光原理與共陽極型的類似,請讀者根據(jù)圖5.5(b)所示的結(jié)構圖進行分析。表5.1分別列出了共陽極、共陰極數(shù)碼管的顯示字型編碼。表5.1數(shù)碼管字型編碼5.2.2LED數(shù)碼管靜態(tài)顯示
1.靜態(tài)顯示的概念靜態(tài)顯示是指當數(shù)碼管顯示某一字符時,相應的某段發(fā)光二極管恒定導通或恒定截止。這種顯示方式的各位數(shù)碼管的公共端恒定接地(共陰極)或+5?V電源(共陽極)。每個數(shù)碼管的8個段位控制引腳分別與一個8位I/O端口相連。只要I/O端口有顯示字型碼輸出,數(shù)碼管就顯示給定字符,并保持不變,直到I/O端口輸出新的段碼。任務7采用的就是一位數(shù)碼管的靜態(tài)顯示方式。
2.靜態(tài)顯示的接口采用靜態(tài)顯示方式,較小的電流就可獲得較高的亮度,且占用CPU時間少,編程簡單,顯示便于監(jiān)測和控制,但占用單片機的I/O端口線多,n位數(shù)碼管的靜態(tài)顯示需占用8?×?n個I/O端口,所以限制了單片機連接數(shù)碼管的個數(shù)。同時,硬件電路復雜,成本高,只適合顯示位數(shù)較少的場合。靜態(tài)顯示接口電路如圖5.6所示。圖5.6數(shù)碼管靜態(tài)顯示電路5.2.3LED數(shù)碼管動態(tài)顯示
1.動態(tài)顯示的概念動態(tài)顯示是一種按位輪流點亮各位數(shù)碼管的顯示方式,即在某一時段,只讓其中一位數(shù)碼管的“位選端”有效,并送出相應的字型顯示編碼。此時,其他位的數(shù)碼管因“位選端”無效而都處于熄滅狀態(tài);下一時段按順序選通另外一位數(shù)碼管,并送出相應的字型顯示編碼,按此規(guī)律循環(huán)下去,即可使各位數(shù)碼管分別間斷地顯示出相應的字符。雖然在同一時刻只有一位數(shù)碼管在點亮,但利用人眼的視覺暫留效應和發(fā)光二極管熄滅時的余輝效應,看到的卻是多位數(shù)碼“同時”顯示。這一過程稱為動態(tài)掃描顯示。
2.動態(tài)顯示的接口任務8中圖5.2給出了用動態(tài)顯示方式點亮4個共陽極數(shù)碼管的電路。圖中將各個共陽極數(shù)碼管相應的段選控制端并聯(lián)在一起,僅用一個P0口控制。各位數(shù)碼管的公共端也稱為“位選端”,由P2口高四位控制,用4個PNP型三極管驅(qū)動。任務9字符型LCD液晶顯示歡迎界面
1.任務目的通過字符型LCD液晶歡迎界面的顯示,讓讀者了解LCD顯示器與單片機的接口方法,理解LCD顯示程序的設計思路。
2.任務要求實現(xiàn)在1602液晶的第一行顯示“WELCOME!”,第二行顯示“WWW.WTC.EDU.CN”。
3.電路設計
LCD液晶顯示電路如圖5.7所示?,F(xiàn)對接口做簡要說明:圖5.7LCD液晶顯示電路液晶1、2端為電源端,15、16為背光電源端,為防止直接加5V電壓燒壞背光燈,在15腳串入一個10Ω電阻限流。3端為液晶對比度調(diào)節(jié)端,通過一個10Ω的可調(diào)電阻來調(diào)節(jié)顯示對比度。4端為向液晶的控制器寫數(shù)據(jù)或?qū)懨畹倪x擇端,接單片機的P3.5端口。5端為讀/寫選擇端,此任務中,只向液晶寫入命令和顯示數(shù)據(jù),所以此端始終為“寫”狀態(tài),即低電平狀態(tài)。6端為使能信號,是操作時必須的信號,接P3.4口。
4.程序設計
#include<reg51.h>
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetable[]="WELCOME!";
ucharcodetable1[]="WWW.WTC.EDU.CN";sbitlcden=P3^4; //液晶使能端sbitlcdrs=P3^5; //液晶數(shù)據(jù)命令選擇端sbitdula=P2^6; //申明U1鎖存器的鎖存端sbitwela=P2^7; //申明U2鎖存器的鎖存端ucharnum;voiddelay(uintz){
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);}voidwrite_command(ucharcom){
lcdrs=0; //選擇寫命令模式
P0=com; //將要寫的命令字送到數(shù)據(jù)總線上
delay(5); //稍做延時以待數(shù)據(jù)穩(wěn)定
lcden=1; //使能端給一高電平,因為初始化函數(shù)中已將lcden置為0 delay(5); lcden=0; //將使能端置0以完成高脈沖}voidwrite_data(uchardat){
lcdrs=1;
P0=dat;
delay(5);
lcden=1;
delay(5);
cden=0;}voidinit(){
dula=0;
wela=0;
lcden=0;
write_command(0x38); //設置16?×?2顯示,5?×?7點陣,8位數(shù)據(jù)接口
write_command(0x0c); //設置開顯示,不顯示光標
write_command(0x06); //寫一個字符后地址指針加1
write_command(0x01); //顯示清0,數(shù)據(jù)指針清0}voidmain(){
init();
write_command(0x80);
for(num=0;num<8;num++){
write_data(table[num]);
delay(5);}
write_command(0x80+0x40);
for(num=0;num<14;num++)
{
write_data(table1[num]);
delay(5);
}
while(1);}
5.任務小結(jié)本任務通過對字符型LCD的顯示控制,讓讀者熟悉字符型LCD液晶顯示原理,練習單片機并行I/O端口和字符串的應用能力。5.3單片機與LCD液晶顯示器接口5.3.1LCD芯片介紹液晶是一種高分子材料,因其特殊的物理、化學、光學特性,20世紀中葉開始廣泛應用在輕薄型顯示器上。液晶顯示器(LiquidCrystalDisplay,LCD)的主要原理是以電流刺激液晶分子產(chǎn)生點、線、面并配合背部燈管構成畫面。通常,我們把各種液晶顯示器都直接叫做液晶。各種型號的液晶通常是按照現(xiàn)實字符的行數(shù)或液晶點陣的行、列數(shù)來命名的。比如:1602的意思是每行顯示16個字符,一共可以顯示兩行;類似的命名還有0801、0802、1601等。這類液晶通常都是字符型液晶,只能顯示ASCII碼字符,如數(shù)字、大小寫字母、各種符號等。12232液晶屬于圖形型液晶,它由122列、32行組成,即共有122?×?32個點來顯示各種圖形;類似的命名還有12864、19264、192128等。根據(jù)客戶需求,廠家還可以設計出任意數(shù)組合的點陣液晶。字符液晶在實際的產(chǎn)品中運用較多,對于單片機的學習而言,掌握1602的用法是每一個學習者必然經(jīng)歷的過程。目前市面上的字符液晶絕大多數(shù)是基于HD44780液晶芯片的,控制原理完全相同。因此,基于HD44780寫的控制程序可以很方便地應用于市面上大部分的字符型液晶。字符型點陣液晶顯示模塊LCD1602如圖5.8所示,通常有14條引腳線或16條引腳線的LCD,多出來的2條線是背光電源線VCC(15腳)和地線GND(16腳),其控制原理與14腳的LCD完全一樣。其引腳排列如圖5.9所示,引腳定義如表5.2所示。圖5.81602液晶的正面(綠色背光,黑色字體)圖5.91602液晶顯示模塊引腳表5.21602引腳功能表5.3.2HD44780中的存儲器
HD44780內(nèi)置了DDRAM、CGROM和CGRAM存儲器。
1.DDRAM
DDRAM就是顯示數(shù)據(jù)RAM,用來寄存待顯示的字符代碼。其中共80個字節(jié),其地址和屏幕的對應關系如表5.3所示。也就是說,想要在LCD1602屏幕的第一行第一列顯示一個“A”字,就要向DDRAM的00H地址寫入“A”字的代碼就行了。但具體的寫入是要按LCD模塊的指令格式來進行的。一行有40個地址,在1602中我們只用前16個地址;第二行也只用前16個地址。具體對應關系如表5.4所示。表5.3地址和屏幕的對應關系表5.4DDRAM地址與顯示位置的對應關系事實上,我們往DDRAM里的00H地址處送一個數(shù)據(jù),譬如0x31(數(shù)字1的代碼),并不能顯示1出來。原因是,若要在DDRAM的00H地址處顯示數(shù)據(jù),則必須將00H加上80H,即80H;若要在DDRAM的01H處顯示數(shù)據(jù),則必須將01H加上80H,即81H。依次類推。
2.?CGROM
1602液晶模塊內(nèi)部的字符發(fā)生存儲器(CGROM)存儲了160個不同的點陣字符圖形,如表5.5所示。這些字符有阿拉伯數(shù)字、英文字母的大小寫、常用的符號和日文假名等,每一個字符都有一個固定的代碼,比如大寫的英文字母“A”的代碼是01000001B(41H),顯示時模塊把地址41H中的點陣字符圖形顯示出來,我們就能看到字母“A”。表5.5CGROM中存儲的點陣字符圖形上表中的字符代碼與我們PC中的字符代碼是基本一致的。因此我們在向DDRAM寫C51字符代碼程序時,甚至可以直接用P1='A'?這樣的方法。PC在編譯時就把“A”轉(zhuǎn)換為41H代碼了。
3.?CGRAM字符代碼0x00~0x0F為用戶自定義的字符圖形RAM,就是CGRAM了。
0x20~0x7F為標準的ASCII碼,0xA0~0xFF為日文字符和希臘文字符,其余字符碼(0x10~0x1F及0x80~0x9F)沒有定義。5.3.3HD44780指令集那么如何對DDRAM的內(nèi)容和地址進行具體操作呢?下面先說說HD44780的指令集及其設置說明。請瀏覽該指令集,并找出對DDRAM的內(nèi)容和地址進行操作的指令。
1.清屏指令
功能:
(1)清除液晶顯示器,即將DDRAM的內(nèi)容全部填入“空白”的ASCII碼20H。
(2)光標歸位,即將光標撤回液晶顯示屏的左上方。
(3)將地址計數(shù)器(AC)的值設為0。
2.光標歸位指令
功能:
(1)把光標撤回到顯示器的左上方。
(2)把地址計數(shù)器(AC)的值設置為0。
(3)保持DDRAM的內(nèi)容不變。
3.進入模式設置指令功能:設定每次寫入1位數(shù)據(jù)后光標的移位方向,并且設定每次寫入的一個字符是否移動。參數(shù)設定的情況如下所示:位名 設置
I/D 0?=?寫入新數(shù)據(jù)后光標左移
1?=?寫入新數(shù)據(jù)后光標右移
S 0?=?寫入新數(shù)據(jù)后顯示屏不移動
1?=?寫入新數(shù)據(jù)后顯示屏整體右移1個字
4.顯示開關控制指令
功能:控制顯示器開/關、光標顯示/關閉以及光標是否閃爍。參數(shù)設定的情況如下:位名 設置
D 0?=?顯示功能關1?=?顯示功能開
C 0?=?無光標 1?=?有光標
B 0?=?光標閃爍 1?=?光標不閃爍
5.設定顯示屏或光標移動方向指令功能:使光標移位或使整個顯示屏幕移位。參數(shù)設定的情況如下:
S/CR/L設定情況
00光標左移1格,且AC值減1
01光標右移1格,且AC值加1
10顯示器上字符全部左移一格,但光標不動
11顯示器上字符全部右移一格,但光標不動
6.功能設定指令
功能:設定數(shù)據(jù)總線位數(shù)、顯示的行數(shù)及字型。參數(shù)設定的情況如下:位名 設置
DL 0?=?數(shù)據(jù)總線為4位
1?=?數(shù)據(jù)總線為8位
N 0?=?顯示1行
1?=?顯示2行
F 0?=?5?×?7點陣/每字符
1?=?5?×?10點陣/每字符
7.設定CGRAM地址指令
功能:設定下一個要存入數(shù)據(jù)的CGRAM的地址。
8.設定DDRAM地址指令
功能:設定下一個要存入數(shù)據(jù)的CGRAM的地址。注意,這里我們送地址的時候應該是0x80+Address,這也是前面說到寫地址命令的時候要加上0x80的原因。
9.讀取忙信號或AC地址指令功能:
(1)讀取忙碌信號FB的內(nèi)容,F(xiàn)B?=?1表示液晶顯示器忙,暫時無法接收單片機送來的數(shù)據(jù)或指令;當FB?=?0時,液晶顯示器可以接收單片機送來的數(shù)據(jù)或指令。
(2)讀取地址計數(shù)器(AC)的內(nèi)容。
小提示:原則上每次對控制器進行讀/寫操作之前,都必須進行讀/寫檢測,確保DB7為0。實際上,由于單片機的操作速度慢于液晶控制器的反應速度,因此可以不進行讀/寫檢測,或只進行簡短的延時即可。
10.數(shù)據(jù)寫入DDRAM或CGRAM指令一覽功能:
(1)將字符碼寫入DDRAM,以使液晶顯示屏顯示出相對應的字符。
(2)將使用者自己設計的圖形存入CGRAM。
11.從CGRAM或DDRAM讀出數(shù)據(jù)的指令一覽功能:讀取DDRAM或CGRAM中的內(nèi)容。5.3.4字符型LCD1602的基本操作與應用
1.基本操作時序
LCD1602的基本操作有四種:寫命令、寫數(shù)據(jù)、讀狀態(tài)和讀數(shù)據(jù)。讀狀態(tài)輸入:RS?=?L,RW?=?H,E?=?H
輸出:DB0~DB7?=?狀態(tài)字寫命令輸入:RS?=?L,RW?=?L,E?=?下降沿脈沖,DB0~DB7?=?指令碼輸出:無讀數(shù)據(jù)輸入:RS?=?H,RW?=?H,E?=?H
輸出:DB0~DB7=數(shù)據(jù)寫數(shù)據(jù)輸入:RS?=?H,RW?=?L,E?=?下降沿脈沖,DB0~DB7=數(shù)據(jù)輸出:無
2.程序設計任務9中寫命令程序段如下:
voidwrite_command(ucharcom)
{
lcdrs=0; //選擇寫命令模式
P0=com; //將要寫的命令字送到數(shù)據(jù)總線上
delay(5); //稍做延時以待數(shù)據(jù)穩(wěn)定
lcden=1; //使能端給一高電平,因為初始化函數(shù)中已將lcden置為0
delay(5);
lcden=0; //將使能端置0以完成高脈沖
}任務9中寫數(shù)據(jù)程序段如下:
voidwrite_data(uchardat)
{
lcdrs=1;
P0=dat;
delay(5);
lcden=1;
delay(5);
lcden=0;
}對以上程序段分析如下:
(1)寫命令操作和寫數(shù)據(jù)操作分別用兩個獨立的函數(shù)來完成,函數(shù)內(nèi)部唯一的區(qū)別就是液晶數(shù)據(jù)命令選擇端的電平。
(2)進入主函數(shù),執(zhí)行完初始化函數(shù)后,用“write_command(0x80);”命令先將數(shù)據(jù)指針定位到第一行第一個字處,然后寫完第一行要顯示的字,在每兩個字之間做簡短延時。這個時間可以自行測試,時間太長會影響寫入及顯示速度,時間太短會影響控制器接收數(shù)據(jù)的穩(wěn)定性,以測試穩(wěn)定為最佳。
(3)寫第二行時,需要重新定位數(shù)據(jù)指針:write_command(0x80+0x40)。讀狀態(tài)程序段如下:
//************12864讀狀態(tài)函數(shù)**************//
voidReadStatus_12864(void)
//讀忙
{
ucharbuffer;
while(1)
{
RS=0;
RW=1;
E=1;
buffer=IO;
delay40us(1);
E=0;
if((buffer&0x80)==0x00)break;
}
}以讀忙狀態(tài)函數(shù)為例說明讀狀態(tài)指令。在程序段中可以看到如下三條指令:
RS=0;
RW=1;
E=1;這三條指令即為讀狀態(tài)時要給液晶輸入引腳寫入的電平值,當RS、RW和E三個輸入信號端為響應電平時,單片機即判斷為讀取狀態(tài)。在一般的LCD模塊當中,有一個重要功能,就是讀LCD狀態(tài),可以通過此操作獲取當前LCD模塊的忙狀態(tài)以及一些相關的狀態(tài)信息。當LCD模塊處于忙狀態(tài)時,不宜對它進行數(shù)據(jù)的寫入或讀出操作(有很多老式的LCD控制器規(guī)定在忙的狀態(tài)下不允許寫入或讀出數(shù)據(jù))。所以,在很多LCD的驅(qū)動程序當中,會在寄存器寫入、數(shù)據(jù)寫入/讀出的操作前加入讀取LCD狀態(tài)并判別忙狀態(tài)的代碼。因為液晶屏控制IC執(zhí)行每條指令需要時間,在這期間不能接受其他指令操作,所以會將狀態(tài)位置為busy,等執(zhí)行完這條指令后才能接受其他指令,這時才會將狀態(tài)為置為ready。所以,寫每條指令前都要判斷這個狀態(tài),要是ready才能寫入,這就是讀忙函數(shù)的作用。讀數(shù)據(jù)指令就是從LCD中讀出顯示的數(shù)據(jù)。以下三條指令就是命令單片機從液晶中讀出數(shù)據(jù):
RS=1;
RW=1;
E=1;讀出的數(shù)據(jù)從數(shù)據(jù)端DB0~DB7輸出。任務10用矩陣鍵盤控制8路跑馬燈
1.任務目的通過本任務的學習掌握矩陣鍵盤按鍵的識別方法。
2.任務要求采用列掃描法,按下S0時,第1位燈亮;按下S1時,第2位燈亮;按下S2時,第3位燈亮;按下S3時,第4位燈亮;按下S4時,第5位燈亮;按下S5時,第6位燈亮;按下S6時,第7位燈亮;按下S7時,第8位燈亮;按下S8時,第1、2位燈亮;按下S9時,第2、3位燈亮;按下S10時,第3、4位燈亮;按下S11時,第4、5位燈亮;按下S12時,第5、6位燈亮;按下S13時,第6、7位燈亮;按下S14時,第7、8位燈亮;按下S15時,8位燈全亮。
3.電路設計采用矩陣鍵盤控制8路跑馬燈的電路如圖5.10所示,16個矩陣按鍵由P2口的8根I/O線聯(lián)合控制,8路跑馬燈由P1口控制。圖5.10矩陣鍵盤控制8路跑馬燈電路
4.程序設計
//功能:采用列掃描法,每按下一個按鍵,對應的1位或2位燈亮。
//這種方法基于單片機輸出端口未被置0或1時,均保持高電平(端口為1)的特性
//?P2.0控制第1行,P2.1控制第2行,P2.2控制第3行,P2.3控制第4行
//?P2.4控制第1列,P2.5控制第2列,P2.6控制第3列,P2.7控制第4列
#include<reg51.h>
#include<intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
#definesm_dataP1//?P1控制8路跑馬燈sbitc0=P2^0;sbitc1=P2^1;sbitc2=P2^2;sbitc3=P2^3;sbitc4=P2^4;sbitc5=P2^5;sbitc6=P2^6;sbitc7=P2^7;voiddelay1(uchartime);ucharjianpanzhi(); //確定按鍵編號,返回的a值表示按鍵的編號。這是一個通用的程序,
//若想按下某個按鍵,實現(xiàn)某個功能,只要傳遞a值即可voiddisplay(ucharb);voidmain(){ucharx;while(1){x=jianpanzhi();delay1(50); //按鍵釋放后,去抖
display(x);}}ucharjianpanzhi(){uinti,a;c4=0; //初始化P2口,使P2_4~P2_7均為0,創(chuàng)造出判斷是否有鍵按下的初試條件c5=0;c6=0;c7=0;if(P2!=0x0f) //判斷是否有鍵按下
{delay1(50); //按下按鍵時,去抖
if(P2!=0x0f) //再次判斷是否有鍵按下
for(i=0;i<4;i++){ switch(i) //列掃描
{ case0: //只將P2.4置0,如果第一列有鍵按下,則P2.0~P2.3某個
//端口為0;其余端口保持高電平
c4=0; c5=1; c6=1; c7=1; break; case1: //只將P2.5置0,如果第一列有鍵按下,則P2.0~P2.3 //某個端口為0;其余端口保持高電平
c4=1; c5=0; c6=1; c7=1; break; case2: //只將P2.6置0,如果第一列有鍵按下,則P2.0~P2.3 //某個端口為0;其余端口保持高電平
c4=1; c5=1; c6=0; c7=1; break;case3: //只將P2.7置0,如果第一列有鍵按下,則P2.0~P2.3 //某個端口為0;其余端口保持高電平
c4=1; c5=1; c6=1; c7=0; break; default: break;}//通過計算得到鍵值,即確定a值,也就是被按下按鍵的編號,
//?S0:a=1,S1:a=2,…,S15:a=16 if(!c0) //若P2.0=0,則表示s0(i為0時)、s1(i為1時)、s3(i為2時)或
//?s3(i為3時)被按下
{ a=i+1; break; }if(!c1) //若P2.1=0,則表示s4(i為0時)、s5(i為1時)、s6(i為2時)或s7(i為3時)被按下
{ a=i+5; break; }if(!c2) //若P2.2=0,則表示s8(i為0時)、s9(i為1時)、s10(i為2時)或s11(i為3時)被按下
{ a=i+9; break; } if(!c3) //若P2.3=0,則表示s12(i為0時)、s13(i為1時)、s14(i為2時)或s15(i為3時)被按下
{ a=i+13; break; } }}//若在此處加上elsea=0,則當鍵盤按下時,有數(shù)值顯示;按鍵釋放后,數(shù)值消失
returna;}//顯示程序,按下S0時,第1位燈亮;按下S1時,第2位燈亮;按下S2時,第3位燈亮;按下S3時,第4位燈亮//?**********按下S4時,第5位燈亮;按下S5時,第6位燈亮;按下S6時,第7位燈亮;按下S7時,第8位燈亮//?**********按下S8時,第1、2位燈亮;按下S9時,第2、3位燈亮;按下S10時,第3、4位燈亮;按下S11時,第4、5位燈亮//?**********按下S12時,第5、6位燈亮;按下S13時,第6、7位燈亮;按下S14時,第7、8位燈亮;按下S15時,8位燈全亮voiddisplay(ucharb){switch(b){case1:sm_data=0xFE;break;case2:sm_data=0xFD;break;case3:sm_data=0xFB;break;case4:sm_data=0xF7;break;case5:sm_data=0xEF;break;case6:sm_data=0xDF;break;case7:sm_data=0xBF;break;case8:sm_data=0x7F;break;case9:sm_data=0xFC;break;case10:sm_data=0xF9;break;case11:sm_data=0xF3;break;case12:sm_data=0xE7;break;case13:sm_data=0xCF;break;case14:sm_data=0x9F;break;case15:sm_data=0x3F;break;case16:sm_data=0x00;break;
default:
sm_data=0xff;
break;
}
}
voiddelay1(uchartime)
{
while(time--) _nop_();
}
5.任務小結(jié)
本任務綜合應用了單片機的跑馬燈、鍵盤接口技術,進一步訓練了單片機并行I/O口的應用能力、鍵盤查詢程序設計的能力,同時讓讀者初步了解了單片機鍵盤接口技術和程序設計的方法。5.4單片機與鍵盤接口常用開關如圖5.11所示,有輕觸開關、撥動開關、按鍵開關、微動開關、直鍵開關、滑動式開關等。它們廣泛應用于各種電子玩具,視聽設備、數(shù)碼相機、手機、筆記本電腦、MP3、MP4、DV及家用電器等。在單片機應用系統(tǒng)中,按鍵式開關的使用最為廣泛。圖5.11各種單片機常用開關5.4.1按鍵的去抖
1.按鍵抖動的原理機械式按鍵在按下或釋放時,由于機械彈性作用的影響,通常伴隨有一定時間的觸點機械抖動,如圖5.12所示,然后其觸點再穩(wěn)定下來,抖動時間一般為5~10ms。在觸點抖動期間監(jiān)測按鍵的通與斷的狀態(tài),可能會導致判斷出錯。
2.按鍵去抖的方法
1)硬件去抖在鍵數(shù)較少時可用硬件方法消除鍵抖動。圖5.13所示的RS觸發(fā)器為常用的硬件去抖電路。圖5.12按鍵觸點的機械抖動圖5.13硬件去抖電路圖中兩個“與非”門構成一個RS觸發(fā)器。當鍵未按下時,輸出為1;當鍵按下時,輸出為0。此時利用按鍵的機械性能,使按鍵因彈性抖動而產(chǎn)生瞬時斷開(抖動跳開B),只要按鍵不返回原始狀態(tài)A,雙穩(wěn)態(tài)電路的狀態(tài)不改變,輸出保持為0,就不會產(chǎn)生抖動的波形。也就是說,即使B點的電壓波形是抖動的,但經(jīng)雙穩(wěn)態(tài)電路之后,其輸出為正規(guī)的矩形波。
2)軟件去抖如果按鍵較多,則常用軟件方法去抖,即檢測出鍵閉合后執(zhí)行一個延時程序,產(chǎn)生5~10ms的延時,讓前沿抖動消失后再一次檢測鍵的狀態(tài),如果仍保持閉合狀態(tài)電平,則確認為真正有鍵按下。當檢測到按鍵釋放后,也要給5~10ms的延時,待后沿抖動消失后才能轉(zhuǎn)入該鍵的處理程序。5.4.2獨立式按鍵
1.獨立式按鍵介紹圖5.14所示為單片機與獨立式按鍵的接口電路,直接用單片機的I/O端口線P3.2~P3.5控制按鍵。每個按鍵單獨占用一根I/O端口線,相互獨立,每個按鍵工作不會影響其他I/O端口線的狀態(tài)。獨立式按鍵的電路配置靈活,軟件結(jié)構簡單,但每個按鍵必須占用一根I/O端口線。因此,在按鍵較多時,I/O端口線浪費較大,不宜采用。圖5.14獨立按鍵電路2.程序設計
【例5.1】通過編寫程序模擬出汽車左右轉(zhuǎn)向的控制,了解獨立式按鍵的工作原理及控制原理。獨立式按鍵程序設計既可采用中斷方式,也可采用查詢方式。中斷方式在模塊四中已提及,此處僅以查詢方式為例進行介紹。查詢方式的思路是逐位查詢每根I/O端口線的輸入狀態(tài),如果某一根I/O端口線的輸入為低電平,則可確認該I/O端口線所對應的按鍵已按下,然后,再轉(zhuǎn)向該按鍵的功能處理程序。圖5.15所示的模擬汽車轉(zhuǎn)向燈控制電路就是由2個獨立式按鍵(S17和S18)控制2個發(fā)光二極管(VD1和VD8)。圖5.15獨立式按鍵控制汽車轉(zhuǎn)向控制電路程序如下:
//程序:lrlight.c
//功能:按鍵控制信號燈亮滅
#include<reg51.h> //包含頭文件
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權】 ISO/IEC 19566-7:2022/AMD1:2025 EN Information technologies - JPEG systems - Part 7: JPEG linked media format (JLINK) - Amendment 1: Revision to the JLINK XMP expressions
- 【正版授權】 ISO/IEC/IEEE 29119-5:2024 EN Software and systems engineering - Software testing - Part 5: Keyword-driven testing
- 杭州全日制勞動合同
- 磚塊購銷合同磚塊購銷合同
- 虛擬現(xiàn)實技術內(nèi)容開發(fā)合作協(xié)議
- 招投標文件合同協(xié)議書
- 購房押金合同書
- 房歸女方所有離婚協(xié)議書
- 幼兒端午活動方案
- 商場柜臺轉(zhuǎn)讓協(xié)議書
- 1企業(yè)網(wǎng)絡與信息安全管理組織架構
- 綠色建筑設計標準-云南
- 《公路智慧養(yǎng)護信息化建設指南(征求意見稿)》
- 《書籍裝幀設計》 課件 項目4 書籍裝幀版式設計
- 作物栽培學課件
- 2024年遼寧大連中遠海運川崎船舶工程有限公司招聘筆試參考題庫含答案解析
- 資產(chǎn)盤點方案策劃
- 血漿置換的護理
- 加油站安全生產(chǎn)標準化檔案清單
- 《群英會蔣干中計》課件38張 2023-2024學年高教版(2023)中職語文基礎模塊下冊
- 大單元教學和集體備課研究
評論
0/150
提交評論