版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
講座四講座四11.多位LED顯示2.鍵盤管理模塊3.點(diǎn)陣、字符液晶顯示器4.字模提取軟件1.多位LED顯示2LED的工作原理(a)典型的七段式LED器件(b)共陽(yáng)極LED(c)共陰極LEDLED的工作原理(a)典型的七段式LED器件(b)共陽(yáng)極3四位數(shù)七段LED數(shù)碼管模塊
(左為正面圖、右為背面圖)四位數(shù)七段LED數(shù)碼管模塊
(左為正面圖、右為背面圖)4單片機(jī)與液晶顯示器課件5LED數(shù)碼管和單片機(jī)的連接1
單片機(jī)P2.0P2.7abcdefgdp+5v+5vabcdefgdpP0.0P0.7編程:(以共陽(yáng)極為例)MOV P2,#11111001B(0F9H)MOV P0,#10100100B(0A4H)SJMP $靜態(tài)連接靜態(tài)顯示LED數(shù)碼管和單片機(jī)的連接1P2.0P2.7abcdefgd6LED數(shù)碼管和單片機(jī)的連接2
單片機(jī)P2.0P2.7abcdefgdpP0.0P0.1P0.2P0.3想一想:和靜態(tài)連接的區(qū)別在哪里?LED數(shù)碼管和單片機(jī)的連接2P2.0P2.7abcdefgd7
單片機(jī)
P2.0P2.7abcdefgdpP0.0P0.1P0.2P0.3電路的接法決定了必須采用逐位掃描顯示方式。即從段選口送出某位LED的字型碼,然后選通該位LED,并保持一段延時(shí)時(shí)間。然后選通下一位,直到所有位掃描完。怎樣實(shí)現(xiàn)顯示呢?P2.0P2.7abcdefgdpP0.0P0.1P0.2P8靜態(tài)、動(dòng)態(tài)顯示方式總結(jié)靜態(tài)顯示連接所有LED的位選均共同連接到+VCC或GND,每個(gè)LED的8根段選線分別連接一個(gè)8位并行I/O口。原理簡(jiǎn)單;顯示無(wú)閃爍;占用I/O資源較多。動(dòng)態(tài)顯示連接所有LED的段選線共同連接在一起共用一個(gè)8位I/O口而每個(gè)LED的位選分別由一根相應(yīng)的I/O口線控制。因此必須采用動(dòng)態(tài)掃描顯示方式。靜態(tài)、動(dòng)態(tài)顯示方式總結(jié)靜態(tài)顯示連接9例:74ls164+led(proteus)
例:74ls164+led(proteus)
10獨(dú)立鍵盤獨(dú)立鍵盤11case0x01: key1();//鍵盤1功能函數(shù)。break; case0x02: key2();//鍵盤2功能函數(shù)。 break; case0x04: key3();//鍵盤3功能函數(shù)。break; case0x08: key4();//鍵盤4功能函數(shù)。 break; case0x10: key5();//鍵盤5功能函數(shù)。break; case0x20: key6();//鍵盤6功能函數(shù)。 break; case0x40: key7();//鍵盤7功能函數(shù)。break; case0x80: key8();//鍵盤8功能函數(shù)。 break; default:break;}}}}說(shuō)明:采用輪詢方式查詢P1口,采用延時(shí)法消除鍵盤抖動(dòng)----------------*/#include<reg51.h>/********************************函數(shù)名稱:delay()功能:用于鍵盤消抖的延時(shí)函數(shù)說(shuō)明:無(wú)入口參數(shù):無(wú)返回值:無(wú)********************************/voiddelay(){unsignedchari;for(i=400;i>0;i--);}//主函數(shù)main()voidmain(void){unsignedcharkey;while(1){P1=0xff;//要想從P1口讀數(shù)據(jù)必須先給P1口寫(xiě)1key=P1;//讀入P1口的數(shù)據(jù),賦值給變量keyif(key!=0x00)//判斷是否有鍵按下,當(dāng)沒(méi)有鍵按下時(shí),P1口的數(shù)據(jù)為0x00 {delay();//延時(shí)去抖key=P1;//再次讀入P1口的數(shù)據(jù),賦值給變量key if(key!=0x00)//再次判斷是否有鍵按下switch(key) {case0x01:說(shuō)明:采用輪詢方式查詢P1口,采用延時(shí)12矩陣式鍵盤控制矩陣式鍵盤控制134x4鍵盤的內(nèi)部結(jié)構(gòu)4x4鍵盤的內(nèi)部結(jié)構(gòu)14市售一體成型的4x4鍵盤市售一體成型的4x4鍵盤15低電平掃描-按下“0”鍵低電平掃描-按下“0”鍵16X3 X2 X1 X0Y3 Y2 Y1 Y0動(dòng)作按鍵1 1 1 01 1 1 0Key01 1 0 1Key11 0 1 1Key20 1 1 1Key31 1 0 11 1 1 0Key41 1 0 1Key51 0 1 1Key60 1 1 1Key71 0 1 11 1 1 0Key81 1 0 1Key91 0 1 1KeyA0 1 1 1KeyB0 1 1 11 1 1 0KeyC1 1 0 1KeyD1 0 1 1KeyE0 1 1 1KeyFx x x x1 1 1 1無(wú)按鍵按下低電平動(dòng)作鍵盤動(dòng)作分析表X3 X2 X1 X0Y3 Y2 Y1 Y0動(dòng)作按鍵1 1 17高電平掃描-按下“0”鍵高電平掃描-按下“0”鍵18X3 X2 X1 X0Y3 Y2 Y1 Y0動(dòng)作按鍵0 0 0 10 0 0 1Key00 0 1 0Key10 1 0 0Key21 0 0 0Key30 0 1 00 0 0 1Key40 0 1 0Key50 1 0 0Key61 0 0 0Key70 1 0 00 0 0 1Key80 0 1 0Key90 1 0 0KeyA1 0 0 0KeyB1 0 0 00 0 0 1KeyC0 0 1 0KeyD0 1 0 0KeyE1 0 0 0KeyFx x x x0 0 0 0無(wú)按鍵按下高電平動(dòng)作鍵盤動(dòng)作分析表X3 X2 X1 X0Y3 Y2 Y1 Y0動(dòng)作按鍵0 0 194×4鍵盤掃描電路4×4鍵盤掃描電路20基本原理:分行掃描檢查是否有鍵按下若有,確定哪個(gè)鍵被按下1.行掃描法的原理基本原理:1.行掃描法的原理21判斷哪一個(gè)鍵被按下的流程判斷哪一個(gè)鍵被按下的流程22
P1=0xfe;
n=P1;
n&=0xf0;
if(n!=0xf0){
delay();
P1=0xfe;
n=P1;
n&=0xf0;
if(n!=0xf0){
switch(n){
case(0xe0):display(0);break;
case(0xd0):display(1);break;
case(0xb0):display(2);break;
case(0x70):display(3);break;
}
}
}
P1=0xfd;
n=P1;
n&=0xf0;
if(n!=0xf0){
delay();
P1=0xfd;
n=P1;
n&=0xf0;
if(n!=0xf0){
switch(n){
case(0xe0):display(4);break;
case(0xd0):display(5);break;
case(0xb0):display(6);break;
case(0x70):display(7);break;
}
}
}
P1=0xfb;
n=P1;
n&=0xf0;
if(n!=0xf0){
delay();
P1=0xfb;
n=P1;
n&=0xf0;
if(n!=0xf0){
switch(n){
case(0xe0):display(8);break;
case(0xd0):display(9);break;
case(0xb0):display(10);break;
case(0x70):display(11);break;
}
}
}
P1=0xf7;
n=P1;
n&=0xf0;
if(n!=0xf0){
delay();
P1=0xf7;
n=P1;
n&=0xf0;
if(n!=0xf0){
switch(n){
case(0xe0):display(12);break;
case(0xd0):display(13);break;
case(0xb0):display(14);break;
case(0x70):display(15);break;
}
}
}}
voiddisplay(unsignedchari){
unsignedchartable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
P2=0xfe;
P0=table[i];
}
P1=0xfe;
n=P1;
n&=0xf0;
if232.行反轉(zhuǎn)法的原理行線、列線分別接并行口行線輸出,列線輸入列線輸出讀得的值,行線輸入2.行反轉(zhuǎn)法的原理行線、列線分別接并行口24行反轉(zhuǎn)法的流程
行反轉(zhuǎn)法的流程25ucharkeyscan(void)//鍵盤掃描函數(shù),使用行列反轉(zhuǎn)掃描法{ucharcord_h,cord_l;//行列值P3=0x0f;//行線輸出全為0cord_h=P3&0x0f;//讀入列線值if(cord_h!=0x0f)//先檢測(cè)有無(wú)按鍵按下{delay(100);//去抖if(cord_h!=0x0f){cord_h=P3&0x0f;//讀入列線值P3=cord_h|0xf0;//輸出當(dāng)前列線值cord_l=P3&0xf0;//讀入行線值return(cord_h+cord_l);//鍵盤最后組合碼值}
此處仿真ucharkeyscan(void)//鍵盤掃描函數(shù),使用26測(cè)控系統(tǒng)中必不可少的組成——人機(jī)界面圖1測(cè)控系統(tǒng)的組成部分測(cè)控系統(tǒng)中必不可少的組成——人機(jī)界面圖1測(cè)控系統(tǒng)的組成部27液晶顯示器的原理字符型液晶(1602)
方法:通過(guò)向指定顯示位置對(duì)應(yīng)的DDRAM中寫(xiě)數(shù)據(jù)來(lái)顯示字符。 例如:在第2行第2列顯示字符‘a(chǎn)’,查表1可知a對(duì)應(yīng)的代碼為01100001即0x31,則可向地址0x41中寫(xiě)入數(shù)據(jù)0x31即可顯示。圖21602的顯示地址與DDRAM地址液晶顯示器的原理字符型液晶(1602)圖21602的顯示地28點(diǎn)陣型液晶(12864)在點(diǎn)陣型LCD上顯示一幅圖片或是字符,如上圖所示,只需黑色的部分點(diǎn)亮,空白的點(diǎn)置0即可。可以將LCD看成128*64個(gè)LED燈來(lái)幫助理解。點(diǎn)陣型液晶(12864)在點(diǎn)陣型LCD上顯示一幅圖片或是字符29正面圖背面圖正面圖背面圖3012864分類128×64點(diǎn)陣液晶顯示屏有三種控制器,分別是KS0107(KS0108)、T6963C和ST7920,三種控制器主要區(qū)別是:KS0107(KS0108)不帶任何字庫(kù)、T6963C帶ASCII碼,ST7920帶國(guó)標(biāo)二級(jí)字庫(kù)(8千多個(gè)漢字)。12864分類31圖312864的DDRAM地址圖312864的DDRAM地址32XY地址計(jì)數(shù)器實(shí)際上是作為DDRAM的地址指針,X地址計(jì)數(shù)器為DDRAM的頁(yè)指針,Y地址計(jì)數(shù)器為DDRAM的Y(列)地址指針。X地址計(jì)數(shù)器沒(méi)有記數(shù)功能,只能用指令設(shè)置。Y地址計(jì)數(shù)器具有循環(huán)記數(shù)功能,各顯示數(shù)據(jù)寫(xiě)入后,Y地址自動(dòng)加1,Y地址指針從0到63。從上圖可以看出數(shù)據(jù)按字節(jié)在屏幕上是豎向排列的。上方為低位,下方為高位。因此在橫向上(也就是Y)就一共是128列數(shù)據(jù)。分為CS1和CS2兩個(gè)64列來(lái)寫(xiě)入。在豎方向上(也就是X)一字節(jié)數(shù)據(jù)顯示8個(gè)點(diǎn),豎向64個(gè)點(diǎn)分為8個(gè)字節(jié),稱做8頁(yè)(X=0-7)。了解這些后我們就知道要滿屏顯示一張圖就要從y=0…127、X=0…7一共寫(xiě)128×8=1024個(gè)字節(jié)的數(shù)據(jù)。同樣在AT89S51中存一張圖就要1024個(gè)字節(jié)的空間。
XY地址計(jì)數(shù)器實(shí)際上是作為DDRAM的地址指針,X地址計(jì)數(shù)器33圖片在12864上的顯示簡(jiǎn)單來(lái)說(shuō),主要分為兩步:1)將一幅圖片轉(zhuǎn)化為一系列二進(jìn)制數(shù)據(jù)2)將數(shù)據(jù)按字節(jié)(8位)寫(xiě)入液晶對(duì)應(yīng)的DDRAM 由圖3可知,12864的DDRAM有128*8=1024個(gè) 地址,只需將圖片轉(zhuǎn)化的數(shù)據(jù)按字節(jié)寫(xiě)入這其 對(duì)應(yīng)的DDRAM地址即可。
圖片在12864上的顯示簡(jiǎn)單來(lái)說(shuō),主要分為兩步:34字符在12864上的顯示 上圖中,漢字為16*16點(diǎn)陣,ASCII碼為8*16點(diǎn)陣,同圖片一樣,一個(gè)漢字(ASCII)由16*2(8*2)個(gè)字節(jié)數(shù)據(jù)組成,字符顯示原理與圖片一致,只需將字符代碼寫(xiě)入相應(yīng)DDRAM地址。字體大小可以根據(jù)需要改變。字符在12864上的顯示 上圖中,漢字為16*16點(diǎn)陣,AS35小結(jié)簡(jiǎn)而言之,無(wú)論是字符型還是點(diǎn)陣型LCD,其基本原理都是通過(guò)將數(shù)據(jù)寫(xiě)入所對(duì)應(yīng)的DDRAM地址中來(lái)顯示所需要的圖形或是字符。12864點(diǎn)陣型液晶對(duì)應(yīng)的DDRAM有1024個(gè)地址,當(dāng)需顯示的字符或圖片已轉(zhuǎn)為二進(jìn)制數(shù)據(jù)時(shí),確定將數(shù)據(jù)寫(xiě)入對(duì)應(yīng)的DDRAM地址就是你所要做的工作!小結(jié)簡(jiǎn)而言之,無(wú)論是字符型還是點(diǎn)陣型LCD,其基本原理都是通36單片機(jī)與液晶顯示器的硬件連接液晶顯示器(12864)主要包含了以下接口(圖6):1)使能E(51的RD和WR經(jīng)或非門接LCD的使能E)2)片選CS1(左半屏)、CS2(右半屏),見(jiàn)圖33)命令/數(shù)據(jù)選擇RS(0——命令,1——數(shù)據(jù))4)讀/寫(xiě)選擇R/W(0——寫(xiě),1——讀)5)數(shù)據(jù)總線DB0~DB76)負(fù)壓產(chǎn)生和負(fù)壓輸入(對(duì)比度)調(diào)整7)復(fù)位RST8)電源與地和背景光電源單片機(jī)與液晶顯示器的硬件連接液晶顯示器(12864)主要包含37軟件編程 注意:程序的編寫(xiě)與硬件是分不開(kāi)的。以圖6為例,A11~A8對(duì)應(yīng)CS2、CS1、R/W、RS,未用的地址線為高。見(jiàn)圖5 則當(dāng)向12864的左半屏(CS1=1,CS2=0)寫(xiě)(R/W=0)數(shù)據(jù)(RS=1)時(shí),總線地址為0x1111010111111111。即0xF5FF。 C文件中定義如下:#defineWD1XBYTE[0xF5FF] 定義了總線地址后,對(duì)外部地址的操作變得非常簡(jiǎn)單。 如向左半屏寫(xiě)數(shù)據(jù)0xFF : WD1=0xFF 讀左半屏數(shù)據(jù) : data=RD1(data存儲(chǔ)讀取到的數(shù)據(jù))軟件編程 注意:程序的編寫(xiě)與硬件是分不開(kāi)的。以圖6為例,A138舉例下面簡(jiǎn)單介紹程序編寫(xiě)的流程1)定義所有總線地址#defineWI1XBYTE[0xF4FF] //向左半屏寫(xiě)命令#defineWD1XBYTE[0xF5FF] //向左半屏寫(xiě)數(shù)據(jù)#defineRI1XBYTE[0xF6FF] //讀左半屏命令#defineRD1XBYTE[0xF7FF] //讀左半屏數(shù)據(jù)#defineWI2XBYTE[0xF8FF] //向右半屏寫(xiě)命令#defineWD2XBYTE[0xF9FF] //向右半屏寫(xiě)數(shù)據(jù)#defineRI2XBYTE[0xFAFF] //讀右半屏命令#defineRD2XBYTE[0xFBFF] //讀右半屏數(shù)據(jù)舉例下面簡(jiǎn)單介紹程序編寫(xiě)的流程392)編寫(xiě)底層程序(查忙,寫(xiě)數(shù)據(jù),讀數(shù)據(jù))查忙(讀BF標(biāo)志即DB7總線,亦即讀命令)
BF=1表示模塊在內(nèi)部操作,此時(shí)模塊不接受外部指令和數(shù)據(jù);
BF=0時(shí)模塊為準(zhǔn)備狀態(tài),隨時(shí)可接受外部指令和數(shù)據(jù);
b=RI1或者b=RI2,觀察b中最高位是否為0,否則忙。寫(xiě)數(shù)據(jù)a WD1=a 或者 WD2=a讀數(shù)據(jù)到data data=RD1 或者 data=RD2
注意:無(wú)論是寫(xiě)數(shù)據(jù)還是讀數(shù)據(jù)一定要先查忙(對(duì)左右半屏讀命令),只有在BF=0時(shí)才能對(duì)LCD進(jìn)行操作2)編寫(xiě)底層程序(查忙,寫(xiě)數(shù)據(jù),讀數(shù)據(jù))403)LCD初始化 包含開(kāi)顯示(0x3F),起始行(0xC0),設(shè)置起始頁(yè)地址(0xB8)和Y地址(0x40),即分別向LCD的左右半屏寫(xiě)命令??砂蠢ㄌ?hào)內(nèi)的數(shù)據(jù)進(jìn)行初始化。具體可查閱12864的PDF資料。4)清屏(向DDRAM所有地址寫(xiě)0) 顯示一幅新圖片前必須清屏,否則之前顯示的數(shù)據(jù)仍存在于液晶上。3)LCD初始化415)指定位置顯示一個(gè)ASCII碼 首先將起始頁(yè)地址和起始Y地址設(shè)置好,寫(xiě)入ASCII碼的上半部分(8個(gè)字節(jié)數(shù)據(jù)) 重新設(shè)置起始頁(yè)地址和起始Y地址,寫(xiě)入ASCII碼的下半部分(另8個(gè)字節(jié)數(shù)據(jù)) 注意:在對(duì)DDRAM進(jìn)行讀寫(xiě)操作后,Y地址指針自動(dòng)加1,指向下一個(gè)DDRAM單元。5)指定位置顯示一個(gè)ASCII碼 注意:在對(duì)DDRAM進(jìn)行讀426)指定位置顯示漢字
同顯示ASCII碼基本相似,只是上下部分分別有16個(gè)字節(jié)數(shù)據(jù)需要寫(xiě)入DDRAM。 7)顯示一張圖片
對(duì)于圖片,必然從第0頁(yè)第0列開(kāi)始,可以一頁(yè)一頁(yè)(不分左右屏)顯示,也可以先寫(xiě)左半屏后寫(xiě)右半屏。所謂的兩種方法差別正在設(shè)置的起始頁(yè)地址和Y地址的不同。圖3
6)指定位置顯示漢字43小結(jié)12864點(diǎn)陣型液晶對(duì)應(yīng)的DDRAM有1024個(gè)地址,無(wú)論是顯示字符還是圖片,靈活設(shè)置起始頁(yè)地址和Y地址,可以達(dá)到想要的結(jié)果。C語(yǔ)言中用到總線操作必須添加頭文件“absacc.h”,另如使用仿真器,需在debug中的setting里選擇使用xbus(數(shù)據(jù)總線)??墒褂萌∽帜\浖⒆址驁D片轉(zhuǎn)為一系列二進(jìn)制數(shù)據(jù)。小結(jié)12864點(diǎn)陣型液晶對(duì)應(yīng)的DDRAM有1024個(gè)地址,無(wú)44寫(xiě)程序:附件寫(xiě)程序:附件453)寫(xiě)數(shù)據(jù)datvoidWriteData(uchardat,bitside){ CheckBusy(side); if(side==Left) WD1=dat; else WD2=dat;}寫(xiě)命令cmd(side——0為左,1為右)voidWriteCmd(ucharcmd,bitside){ CheckBusy(side); if(side==Left) //Left=0(宏定義) WI1=cmd; else WI2=cmd;}3)寫(xiě)數(shù)據(jù)dat寫(xiě)命令cmd(side——0為左,1為右)46讀操作時(shí)序讀操作時(shí)序471)查忙程序voidCheckBusy(bitside) //side——0為左1為右{unsignedcharbuf=0xFF; while(buf){ if(!side) buf=RI1;//單片機(jī)命令 else buf=RI2; buf&=0x80; //取D7若為1則忙,忙則buf!=0(LCD回信號(hào)) }}1)查忙程序48初始化:初始化:49單片機(jī)與液晶顯示器課件504)初始化程序voidLCD_Init(){ WriteCmd(0x3F,Left);//顯示開(kāi) WriteCmd(0x3F,Right); WriteCmd(0xC0,Left);//起始行 WriteCmd(0xC0,Right); WriteCmd(0xB8,Left); WriteCmd(0xB8,Right);//起始x,y坐標(biāo)(0,0) WriteCmd(0x40,Left); WriteCmd(0x40,Right);}4)初始化程序515)清屏(一般dat=0)voidLCD_Clear(uchardat){ uchari,j; for(i=0;i<8;i++){ WriteCmd(0xB8+i,Left); WriteCmd(0xB8+i,Right); WriteCmd(0x40,Left); WriteCmd(0x40,Right); for(j=0;j<64;j++){ WriteData(dat,Left); WriteData(dat,Right); } }}5)清屏(一般dat=0)52總結(jié)理解12864是如何顯示字符和圖形的知曉單片機(jī)與12864的硬件連接根據(jù)硬件接線,確定所有的總線地址(8個(gè))明白如何通過(guò)總線操作對(duì)12864進(jìn)行數(shù)據(jù)與命令的交換參考12864的命令字進(jìn)行軟件編程學(xué)會(huì)如何使用取字模軟件總結(jié)理解12864是如何顯示字符和圖形的53圖6AT89C51與12864的硬件連接圖6AT89C51與12864的硬件連接54LCD12864模塊的20個(gè)引腳定義如下:1.Vss
邏輯電源地
2.VDD邏輯電源正5v
3.V0LCD驅(qū)動(dòng)電壓
4.RS數(shù)據(jù)/指令選擇:高電平為數(shù)據(jù),低電平為指令
5.R/W讀/寫(xiě)選擇:高電平為讀數(shù)據(jù),低電平為寫(xiě)數(shù)據(jù)6.E讀寫(xiě)使能,高電平有效,下降沿鎖定數(shù)據(jù)
7.DB0數(shù)據(jù)輸入輸出引腳
8.DB1數(shù)據(jù)輸入輸出引腳
9.DB2數(shù)據(jù)輸入輸出引腳
10.DB3數(shù)據(jù)輸入輸出引腳
11.DB4數(shù)據(jù)輸入輸出引腳
12.DB5數(shù)據(jù)輸入輸出引腳
13.DB6數(shù)據(jù)輸入輸出引腳
14.DB7數(shù)據(jù)輸入輸出引腳
15.CS1片選擇號(hào),低電平時(shí)選擇前64列
16.CS2片選擇號(hào),低電平時(shí)選擇后64列
17.RET復(fù)位信號(hào),低電平有效。
18.VEE輸出-15v電源給V0提供驅(qū)動(dòng)電源
19.A背光電源LED正極
20.K背光電源LED負(fù)極圖5.LCD引腳圖LCD12864模塊的20個(gè)引腳定義如下:圖5.LCD引腳圖55帶字庫(kù)12864帶字庫(kù)的12864的基本特性:(1)顯示分辨率:128×64點(diǎn)(就是64行,每行128個(gè)點(diǎn))(2)內(nèi)置漢字字庫(kù),提供8192個(gè)16×16點(diǎn)陣漢字(12864內(nèi)部有一個(gè)CGROM,內(nèi)容掉電可以存儲(chǔ),所以漢字字庫(kù)會(huì)存放在里面。滿屏最多顯示4*8=32個(gè)漢字)。(3)內(nèi)置128個(gè)16×8點(diǎn)陣ASCII字符(12864一次最多可以顯示4*16=64個(gè)ASCII字符)。(4)通訊方式:串行、并口可選(數(shù)據(jù)寫(xiě)入和讀出可以是以串行的方式,也可以是以并行的方式。)帶字庫(kù)12864帶字庫(kù)的12864的基本特性:56單片機(jī)與液晶顯示器課件57所以只要我們寫(xiě)入指令0x01,整個(gè)屏幕就被清空了。LCD初始化:一般用指令0x0c,開(kāi)顯示,關(guān)閉光標(biāo)既可以控制擴(kuò)展功能,又可以控制繪圖顯示的指令!用0X30,基本指令集所以只要我們寫(xiě)入指令0x01,整個(gè)屏幕就被清空了。LCD初始58指令0X06光標(biāo)右移指令0X06光標(biāo)右移591.漢字顯示坐標(biāo)顯示漢字一屏可以顯示4*8=32個(gè)16*16的漢字。實(shí)物圖對(duì)照下,把地址也表到實(shí)物圖上去了。1.漢字顯示坐標(biāo)顯示漢字一屏可以顯示4*8=32個(gè)16*160操作的具體流程:A進(jìn)入基本指令模式(指令16,指令為0x30)B寫(xiě)入xy地址(地址需要查上表,用指令8,也就是寫(xiě)入DDRAM)C寫(xiě)入欲寫(xiě)入的漢字的編碼(一般定義一個(gè)數(shù)組,直接把漢字存放在里面即可,存儲(chǔ)的時(shí)候它就是以編碼的形式。例如:ucharcodedis1[]=“南京師范大學(xué)";)例程代碼:ucharcodedis3[]={“南京師范大學(xué)"};voiddisplay_hz(){ UcharI; Write_comd(0x30);//基本指令 Write_comd(0x80);//寫(xiě)在第一個(gè)位置上 For(i=0;i<8;i++) { Write_da(dis3[i]);//把數(shù)據(jù)送到端口 Delay_ms(5);//延時(shí)一會(huì)}}操作的具體流程:612.ASCII顯示坐標(biāo):它的坐標(biāo)和漢字的坐標(biāo)是一樣的,只不過(guò)一個(gè)漢字的位置可以放兩個(gè)ASCII碼字符。因?yàn)榍罢邽?6*16后者為16*8,這樣一行可以顯示16個(gè)ASCII碼了。在顯示一串字符穿的時(shí)候,給一個(gè)起始地址,屏幕就會(huì)依次顯示出來(lái)(自動(dòng)加一功能)。操作的具體流程:A進(jìn)入基本指令模式(指令16,指令為0x30)B寫(xiě)入xy地址(地址需要查上表,用指令8,也就是寫(xiě)入DDRAM)C寫(xiě)入欲寫(xiě)入的漢字的編碼(一般定義一個(gè)數(shù)組,直接把ASACII碼存放在里面即可,存儲(chǔ)的時(shí)候它就是以編碼的形式。例如:ucharcodedis1[]="SH";)2.ASCII顯示坐標(biāo):它的坐標(biāo)和漢字的坐標(biāo)是一樣的,只不過(guò)62例程代碼:ucharcodedis2[]={"SH"};voiddisplay_ascii(){ UcharI; Write_comd(0x30);//基本指令 Write_comd(0x80);//寫(xiě)在第一個(gè)位置上 For(i=0;i<2;i++) { Write_da(dis2[i]);//把數(shù)據(jù)送到端口 Delay_ms(5);//延時(shí)一會(huì)}}例程代碼:63并行寫(xiě)資料到模塊:時(shí)序圖:并行寫(xiě)資料到模塊:時(shí)序圖:64寫(xiě)指令:voidwrite_cmd(ucharcmd){lcdrs=0;//低電平表命令lcdrw=0;//低電平表寫(xiě)P0=cmd;//把命令送給P0
lcden=0;//產(chǎn)生一個(gè)高脈沖delay_ms(5);lcden=1;delay_ms(5);//不用的時(shí)候把en拉低,12864不使能lcden=0;}(2)寫(xiě)數(shù)據(jù):voidwrite_dat(uchardat){lcdrs=1;//高電平表示數(shù)據(jù)lcdrw=0;//低電平表示寫(xiě)P0=dat;//把數(shù)據(jù)送到端口lcden=0;//產(chǎn)生一個(gè)高脈沖delay_ms(5);lcden=1;delay_ms(5);lcden=0;//不用時(shí)不使能}寫(xiě)指令:65根據(jù)這個(gè)時(shí)序圖可以從12864液晶模塊內(nèi)部RAM中讀出相應(yīng)的數(shù)據(jù),忙檢測(cè)函數(shù)就是根據(jù)這個(gè)時(shí)序圖寫(xiě)出來(lái)的。根據(jù)這個(gè)時(shí)序圖可以從12864液晶模塊內(nèi)部RAM中讀出相應(yīng)的66帶中文字庫(kù)的128X64顯示模塊時(shí)應(yīng)注意以下幾點(diǎn):
①欲在某一個(gè)位置顯示中文字符時(shí),應(yīng)先設(shè)定顯示字符位置,即先設(shè)定顯示地址,再寫(xiě)入中文字符編碼。
②顯示ASCII字符過(guò)程與顯示中文字符過(guò)程相同。不過(guò)在顯示連續(xù)字符時(shí),只須設(shè)定一次顯示地址,由模塊自動(dòng)對(duì)地址加1指向下一個(gè)字符位置,否則,顯示的字符中將會(huì)有一個(gè)空ASCII字符位置。
③當(dāng)字符編碼為2字節(jié)時(shí),應(yīng)先寫(xiě)入高位字節(jié),再寫(xiě)入低位字節(jié)。
④模塊在接收指令前,向處理器必須先確認(rèn)模塊內(nèi)部處于非忙狀態(tài),即讀取BF標(biāo)志時(shí)BF需為“0”,方可接受新的指令。如果在送出一個(gè)指令前不檢查BF標(biāo)志,則在前一個(gè)指令和這個(gè)指令中間必須延遲一段較長(zhǎng)的時(shí)間,即等待前一個(gè)指令確定執(zhí)行完成。指令執(zhí)行的時(shí)間請(qǐng)參考指令表中的指令執(zhí)行時(shí)間說(shuō)明。⑤“RE”為基本指令集與擴(kuò)充指令集的選擇控制位。當(dāng)變更“RE”后,以后的指令集將維持在最后的狀態(tài),除非再次變更“RE”位,否則使用相同指令集時(shí),無(wú)需每次均重設(shè)“RE”位。帶中文字庫(kù)的128X64顯示模塊時(shí)應(yīng)注意以下幾點(diǎn):
①欲在某67講座四講座四681.多位LED顯示2.鍵盤管理模塊3.點(diǎn)陣、字符液晶顯示器4.字模提取軟件1.多位LED顯示69LED的工作原理(a)典型的七段式LED器件(b)共陽(yáng)極LED(c)共陰極LEDLED的工作原理(a)典型的七段式LED器件(b)共陽(yáng)極70四位數(shù)七段LED數(shù)碼管模塊
(左為正面圖、右為背面圖)四位數(shù)七段LED數(shù)碼管模塊
(左為正面圖、右為背面圖)71單片機(jī)與液晶顯示器課件72LED數(shù)碼管和單片機(jī)的連接1
單片機(jī)P2.0P2.7abcdefgdp+5v+5vabcdefgdpP0.0P0.7編程:(以共陽(yáng)極為例)MOV P2,#11111001B(0F9H)MOV P0,#10100100B(0A4H)SJMP $靜態(tài)連接靜態(tài)顯示LED數(shù)碼管和單片機(jī)的連接1P2.0P2.7abcdefgd73LED數(shù)碼管和單片機(jī)的連接2
單片機(jī)P2.0P2.7abcdefgdpP0.0P0.1P0.2P0.3想一想:和靜態(tài)連接的區(qū)別在哪里?LED數(shù)碼管和單片機(jī)的連接2P2.0P2.7abcdefgd74
單片機(jī)
P2.0P2.7abcdefgdpP0.0P0.1P0.2P0.3電路的接法決定了必須采用逐位掃描顯示方式。即從段選口送出某位LED的字型碼,然后選通該位LED,并保持一段延時(shí)時(shí)間。然后選通下一位,直到所有位掃描完。怎樣實(shí)現(xiàn)顯示呢?P2.0P2.7abcdefgdpP0.0P0.1P0.2P75靜態(tài)、動(dòng)態(tài)顯示方式總結(jié)靜態(tài)顯示連接所有LED的位選均共同連接到+VCC或GND,每個(gè)LED的8根段選線分別連接一個(gè)8位并行I/O口。原理簡(jiǎn)單;顯示無(wú)閃爍;占用I/O資源較多。動(dòng)態(tài)顯示連接所有LED的段選線共同連接在一起共用一個(gè)8位I/O口而每個(gè)LED的位選分別由一根相應(yīng)的I/O口線控制。因此必須采用動(dòng)態(tài)掃描顯示方式。靜態(tài)、動(dòng)態(tài)顯示方式總結(jié)靜態(tài)顯示連接76例:74ls164+led(proteus)
例:74ls164+led(proteus)
77獨(dú)立鍵盤獨(dú)立鍵盤78case0x01: key1();//鍵盤1功能函數(shù)。break; case0x02: key2();//鍵盤2功能函數(shù)。 break; case0x04: key3();//鍵盤3功能函數(shù)。break; case0x08: key4();//鍵盤4功能函數(shù)。 break; case0x10: key5();//鍵盤5功能函數(shù)。break; case0x20: key6();//鍵盤6功能函數(shù)。 break; case0x40: key7();//鍵盤7功能函數(shù)。break; case0x80: key8();//鍵盤8功能函數(shù)。 break; default:break;}}}}說(shuō)明:采用輪詢方式查詢P1口,采用延時(shí)法消除鍵盤抖動(dòng)----------------*/#include<reg51.h>/********************************函數(shù)名稱:delay()功能:用于鍵盤消抖的延時(shí)函數(shù)說(shuō)明:無(wú)入口參數(shù):無(wú)返回值:無(wú)********************************/voiddelay(){unsignedchari;for(i=400;i>0;i--);}//主函數(shù)main()voidmain(void){unsignedcharkey;while(1){P1=0xff;//要想從P1口讀數(shù)據(jù)必須先給P1口寫(xiě)1key=P1;//讀入P1口的數(shù)據(jù),賦值給變量keyif(key!=0x00)//判斷是否有鍵按下,當(dāng)沒(méi)有鍵按下時(shí),P1口的數(shù)據(jù)為0x00 {delay();//延時(shí)去抖key=P1;//再次讀入P1口的數(shù)據(jù),賦值給變量key if(key!=0x00)//再次判斷是否有鍵按下switch(key) {case0x01:說(shuō)明:采用輪詢方式查詢P1口,采用延時(shí)79矩陣式鍵盤控制矩陣式鍵盤控制804x4鍵盤的內(nèi)部結(jié)構(gòu)4x4鍵盤的內(nèi)部結(jié)構(gòu)81市售一體成型的4x4鍵盤市售一體成型的4x4鍵盤82低電平掃描-按下“0”鍵低電平掃描-按下“0”鍵83X3 X2 X1 X0Y3 Y2 Y1 Y0動(dòng)作按鍵1 1 1 01 1 1 0Key01 1 0 1Key11 0 1 1Key20 1 1 1Key31 1 0 11 1 1 0Key41 1 0 1Key51 0 1 1Key60 1 1 1Key71 0 1 11 1 1 0Key81 1 0 1Key91 0 1 1KeyA0 1 1 1KeyB0 1 1 11 1 1 0KeyC1 1 0 1KeyD1 0 1 1KeyE0 1 1 1KeyFx x x x1 1 1 1無(wú)按鍵按下低電平動(dòng)作鍵盤動(dòng)作分析表X3 X2 X1 X0Y3 Y2 Y1 Y0動(dòng)作按鍵1 1 84高電平掃描-按下“0”鍵高電平掃描-按下“0”鍵85X3 X2 X1 X0Y3 Y2 Y1 Y0動(dòng)作按鍵0 0 0 10 0 0 1Key00 0 1 0Key10 1 0 0Key21 0 0 0Key30 0 1 00 0 0 1Key40 0 1 0Key50 1 0 0Key61 0 0 0Key70 1 0 00 0 0 1Key80 0 1 0Key90 1 0 0KeyA1 0 0 0KeyB1 0 0 00 0 0 1KeyC0 0 1 0KeyD0 1 0 0KeyE1 0 0 0KeyFx x x x0 0 0 0無(wú)按鍵按下高電平動(dòng)作鍵盤動(dòng)作分析表X3 X2 X1 X0Y3 Y2 Y1 Y0動(dòng)作按鍵0 0 864×4鍵盤掃描電路4×4鍵盤掃描電路87基本原理:分行掃描檢查是否有鍵按下若有,確定哪個(gè)鍵被按下1.行掃描法的原理基本原理:1.行掃描法的原理88判斷哪一個(gè)鍵被按下的流程判斷哪一個(gè)鍵被按下的流程89
P1=0xfe;
n=P1;
n&=0xf0;
if(n!=0xf0){
delay();
P1=0xfe;
n=P1;
n&=0xf0;
if(n!=0xf0){
switch(n){
case(0xe0):display(0);break;
case(0xd0):display(1);break;
case(0xb0):display(2);break;
case(0x70):display(3);break;
}
}
}
P1=0xfd;
n=P1;
n&=0xf0;
if(n!=0xf0){
delay();
P1=0xfd;
n=P1;
n&=0xf0;
if(n!=0xf0){
switch(n){
case(0xe0):display(4);break;
case(0xd0):display(5);break;
case(0xb0):display(6);break;
case(0x70):display(7);break;
}
}
}
P1=0xfb;
n=P1;
n&=0xf0;
if(n!=0xf0){
delay();
P1=0xfb;
n=P1;
n&=0xf0;
if(n!=0xf0){
switch(n){
case(0xe0):display(8);break;
case(0xd0):display(9);break;
case(0xb0):display(10);break;
case(0x70):display(11);break;
}
}
}
P1=0xf7;
n=P1;
n&=0xf0;
if(n!=0xf0){
delay();
P1=0xf7;
n=P1;
n&=0xf0;
if(n!=0xf0){
switch(n){
case(0xe0):display(12);break;
case(0xd0):display(13);break;
case(0xb0):display(14);break;
case(0x70):display(15);break;
}
}
}}
voiddisplay(unsignedchari){
unsignedchartable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
P2=0xfe;
P0=table[i];
}
P1=0xfe;
n=P1;
n&=0xf0;
if902.行反轉(zhuǎn)法的原理行線、列線分別接并行口行線輸出,列線輸入列線輸出讀得的值,行線輸入2.行反轉(zhuǎn)法的原理行線、列線分別接并行口91行反轉(zhuǎn)法的流程
行反轉(zhuǎn)法的流程92ucharkeyscan(void)//鍵盤掃描函數(shù),使用行列反轉(zhuǎn)掃描法{ucharcord_h,cord_l;//行列值P3=0x0f;//行線輸出全為0cord_h=P3&0x0f;//讀入列線值if(cord_h!=0x0f)//先檢測(cè)有無(wú)按鍵按下{delay(100);//去抖if(cord_h!=0x0f){cord_h=P3&0x0f;//讀入列線值P3=cord_h|0xf0;//輸出當(dāng)前列線值cord_l=P3&0xf0;//讀入行線值return(cord_h+cord_l);//鍵盤最后組合碼值}
此處仿真ucharkeyscan(void)//鍵盤掃描函數(shù),使用93測(cè)控系統(tǒng)中必不可少的組成——人機(jī)界面圖1測(cè)控系統(tǒng)的組成部分測(cè)控系統(tǒng)中必不可少的組成——人機(jī)界面圖1測(cè)控系統(tǒng)的組成部94液晶顯示器的原理字符型液晶(1602)
方法:通過(guò)向指定顯示位置對(duì)應(yīng)的DDRAM中寫(xiě)數(shù)據(jù)來(lái)顯示字符。 例如:在第2行第2列顯示字符‘a(chǎn)’,查表1可知a對(duì)應(yīng)的代碼為01100001即0x31,則可向地址0x41中寫(xiě)入數(shù)據(jù)0x31即可顯示。圖21602的顯示地址與DDRAM地址液晶顯示器的原理字符型液晶(1602)圖21602的顯示地95點(diǎn)陣型液晶(12864)在點(diǎn)陣型LCD上顯示一幅圖片或是字符,如上圖所示,只需黑色的部分點(diǎn)亮,空白的點(diǎn)置0即可??梢詫CD看成128*64個(gè)LED燈來(lái)幫助理解。點(diǎn)陣型液晶(12864)在點(diǎn)陣型LCD上顯示一幅圖片或是字符96正面圖背面圖正面圖背面圖9712864分類128×64點(diǎn)陣液晶顯示屏有三種控制器,分別是KS0107(KS0108)、T6963C和ST7920,三種控制器主要區(qū)別是:KS0107(KS0108)不帶任何字庫(kù)、T6963C帶ASCII碼,ST7920帶國(guó)標(biāo)二級(jí)字庫(kù)(8千多個(gè)漢字)。12864分類98圖312864的DDRAM地址圖312864的DDRAM地址99XY地址計(jì)數(shù)器實(shí)際上是作為DDRAM的地址指針,X地址計(jì)數(shù)器為DDRAM的頁(yè)指針,Y地址計(jì)數(shù)器為DDRAM的Y(列)地址指針。X地址計(jì)數(shù)器沒(méi)有記數(shù)功能,只能用指令設(shè)置。Y地址計(jì)數(shù)器具有循環(huán)記數(shù)功能,各顯示數(shù)據(jù)寫(xiě)入后,Y地址自動(dòng)加1,Y地址指針從0到63。從上圖可以看出數(shù)據(jù)按字節(jié)在屏幕上是豎向排列的。上方為低位,下方為高位。因此在橫向上(也就是Y)就一共是128列數(shù)據(jù)。分為CS1和CS2兩個(gè)64列來(lái)寫(xiě)入。在豎方向上(也就是X)一字節(jié)數(shù)據(jù)顯示8個(gè)點(diǎn),豎向64個(gè)點(diǎn)分為8個(gè)字節(jié),稱做8頁(yè)(X=0-7)。了解這些后我們就知道要滿屏顯示一張圖就要從y=0…127、X=0…7一共寫(xiě)128×8=1024個(gè)字節(jié)的數(shù)據(jù)。同樣在AT89S51中存一張圖就要1024個(gè)字節(jié)的空間。
XY地址計(jì)數(shù)器實(shí)際上是作為DDRAM的地址指針,X地址計(jì)數(shù)器100圖片在12864上的顯示簡(jiǎn)單來(lái)說(shuō),主要分為兩步:1)將一幅圖片轉(zhuǎn)化為一系列二進(jìn)制數(shù)據(jù)2)將數(shù)據(jù)按字節(jié)(8位)寫(xiě)入液晶對(duì)應(yīng)的DDRAM 由圖3可知,12864的DDRAM有128*8=1024個(gè) 地址,只需將圖片轉(zhuǎn)化的數(shù)據(jù)按字節(jié)寫(xiě)入這其 對(duì)應(yīng)的DDRAM地址即可。
圖片在12864上的顯示簡(jiǎn)單來(lái)說(shuō),主要分為兩步:101字符在12864上的顯示 上圖中,漢字為16*16點(diǎn)陣,ASCII碼為8*16點(diǎn)陣,同圖片一樣,一個(gè)漢字(ASCII)由16*2(8*2)個(gè)字節(jié)數(shù)據(jù)組成,字符顯示原理與圖片一致,只需將字符代碼寫(xiě)入相應(yīng)DDRAM地址。字體大小可以根據(jù)需要改變。字符在12864上的顯示 上圖中,漢字為16*16點(diǎn)陣,AS102小結(jié)簡(jiǎn)而言之,無(wú)論是字符型還是點(diǎn)陣型LCD,其基本原理都是通過(guò)將數(shù)據(jù)寫(xiě)入所對(duì)應(yīng)的DDRAM地址中來(lái)顯示所需要的圖形或是字符。12864點(diǎn)陣型液晶對(duì)應(yīng)的DDRAM有1024個(gè)地址,當(dāng)需顯示的字符或圖片已轉(zhuǎn)為二進(jìn)制數(shù)據(jù)時(shí),確定將數(shù)據(jù)寫(xiě)入對(duì)應(yīng)的DDRAM地址就是你所要做的工作!小結(jié)簡(jiǎn)而言之,無(wú)論是字符型還是點(diǎn)陣型LCD,其基本原理都是通103單片機(jī)與液晶顯示器的硬件連接液晶顯示器(12864)主要包含了以下接口(圖6):1)使能E(51的RD和WR經(jīng)或非門接LCD的使能E)2)片選CS1(左半屏)、CS2(右半屏),見(jiàn)圖33)命令/數(shù)據(jù)選擇RS(0——命令,1——數(shù)據(jù))4)讀/寫(xiě)選擇R/W(0——寫(xiě),1——讀)5)數(shù)據(jù)總線DB0~DB76)負(fù)壓產(chǎn)生和負(fù)壓輸入(對(duì)比度)調(diào)整7)復(fù)位RST8)電源與地和背景光電源單片機(jī)與液晶顯示器的硬件連接液晶顯示器(12864)主要包含104軟件編程 注意:程序的編寫(xiě)與硬件是分不開(kāi)的。以圖6為例,A11~A8對(duì)應(yīng)CS2、CS1、R/W、RS,未用的地址線為高。見(jiàn)圖5 則當(dāng)向12864的左半屏(CS1=1,CS2=0)寫(xiě)(R/W=0)數(shù)據(jù)(RS=1)時(shí),總線地址為0x1111010111111111。即0xF5FF。 C文件中定義如下:#defineWD1XBYTE[0xF5FF] 定義了總線地址后,對(duì)外部地址的操作變得非常簡(jiǎn)單。 如向左半屏寫(xiě)數(shù)據(jù)0xFF : WD1=0xFF 讀左半屏數(shù)據(jù) : data=RD1(data存儲(chǔ)讀取到的數(shù)據(jù))軟件編程 注意:程序的編寫(xiě)與硬件是分不開(kāi)的。以圖6為例,A1105舉例下面簡(jiǎn)單介紹程序編寫(xiě)的流程1)定義所有總線地址#defineWI1XBYTE[0xF4FF] //向左半屏寫(xiě)命令#defineWD1XBYTE[0xF5FF] //向左半屏寫(xiě)數(shù)據(jù)#defineRI1XBYTE[0xF6FF] //讀左半屏命令#defineRD1XBYTE[0xF7FF] //讀左半屏數(shù)據(jù)#defineWI2XBYTE[0xF8FF] //向右半屏寫(xiě)命令#defineWD2XBYTE[0xF9FF] //向右半屏寫(xiě)數(shù)據(jù)#defineRI2XBYTE[0xFAFF] //讀右半屏命令#defineRD2XBYTE[0xFBFF] //讀右半屏數(shù)據(jù)舉例下面簡(jiǎn)單介紹程序編寫(xiě)的流程1062)編寫(xiě)底層程序(查忙,寫(xiě)數(shù)據(jù),讀數(shù)據(jù))查忙(讀BF標(biāo)志即DB7總線,亦即讀命令)
BF=1表示模塊在內(nèi)部操作,此時(shí)模塊不接受外部指令和數(shù)據(jù);
BF=0時(shí)模塊為準(zhǔn)備狀態(tài),隨時(shí)可接受外部指令和數(shù)據(jù);
b=RI1或者b=RI2,觀察b中最高位是否為0,否則忙。寫(xiě)數(shù)據(jù)a WD1=a 或者 WD2=a讀數(shù)據(jù)到data data=RD1 或者 data=RD2
注意:無(wú)論是寫(xiě)數(shù)據(jù)還是讀數(shù)據(jù)一定要先查忙(對(duì)左右半屏讀命令),只有在BF=0時(shí)才能對(duì)LCD進(jìn)行操作2)編寫(xiě)底層程序(查忙,寫(xiě)數(shù)據(jù),讀數(shù)據(jù))1073)LCD初始化 包含開(kāi)顯示(0x3F),起始行(0xC0),設(shè)置起始頁(yè)地址(0xB8)和Y地址(0x40),即分別向LCD的左右半屏寫(xiě)命令??砂蠢ㄌ?hào)內(nèi)的數(shù)據(jù)進(jìn)行初始化。具體可查閱12864的PDF資料。4)清屏(向DDRAM所有地址寫(xiě)0) 顯示一幅新圖片前必須清屏,否則之前顯示的數(shù)據(jù)仍存在于液晶上。3)LCD初始化1085)指定位置顯示一個(gè)ASCII碼 首先將起始頁(yè)地址和起始Y地址設(shè)置好,寫(xiě)入ASCII碼的上半部分(8個(gè)字節(jié)數(shù)據(jù)) 重新設(shè)置起始頁(yè)地址和起始Y地址,寫(xiě)入ASCII碼的下半部分(另8個(gè)字節(jié)數(shù)據(jù)) 注意:在對(duì)DDRAM進(jìn)行讀寫(xiě)操作后,Y地址指針自動(dòng)加1,指向下一個(gè)DDRAM單元。5)指定位置顯示一個(gè)ASCII碼 注意:在對(duì)DDRAM進(jìn)行讀1096)指定位置顯示漢字
同顯示ASCII碼基本相似,只是上下部分分別有16個(gè)字節(jié)數(shù)據(jù)需要寫(xiě)入DDRAM。 7)顯示一張圖片
對(duì)于圖片,必然從第0頁(yè)第0列開(kāi)始,可以一頁(yè)一頁(yè)(不分左右屏)顯示,也可以先寫(xiě)左半屏后寫(xiě)右半屏。所謂的兩種方法差別正在設(shè)置的起始頁(yè)地址和Y地址的不同。圖3
6)指定位置顯示漢字110小結(jié)12864點(diǎn)陣型液晶對(duì)應(yīng)的DDRAM有1024個(gè)地址,無(wú)論是顯示字符還是圖片,靈活設(shè)置起始頁(yè)地址和Y地址,可以達(dá)到想要的結(jié)果。C語(yǔ)言中用到總線操作必須添加頭文件“absacc.h”,另如使用仿真器,需在debug中的setting里選擇使用xbus(數(shù)據(jù)總線)??墒褂萌∽帜\浖⒆址驁D片轉(zhuǎn)為一系列二進(jìn)制數(shù)據(jù)。小結(jié)12864點(diǎn)陣型液晶對(duì)應(yīng)的DDRAM有1024個(gè)地址,無(wú)111寫(xiě)程序:附件寫(xiě)程序:附件1123)寫(xiě)數(shù)據(jù)datvoidWriteData(uchardat,bitside){ CheckBusy(side); if(side==Left) WD1=dat; else WD2=dat;}寫(xiě)命令cmd(side——0為左,1為右)voidWriteCmd(ucharcmd,bitside){ CheckBusy(side); if(side==Left) //Left=0(宏定義) WI1=cmd; else WI2=cmd;}3)寫(xiě)數(shù)據(jù)dat寫(xiě)命令cmd(side——0為左,1為右)113讀操作時(shí)序讀操作時(shí)序1141)查忙程序voidCheckBusy(bitside) //side——0為左1為右{unsignedcharbuf=0xFF; while(buf){ if(!side) buf=RI1;//單片機(jī)命令 else buf=RI2; buf&=0x80; //取D7若為1則忙,忙則buf!=0(LCD回信號(hào)) }}1)查忙程序115初始化:初始化:116單片機(jī)與液晶顯示器課件1174)初始化程序voidLCD_Init(){ WriteCmd(0x3F,Left);//顯示開(kāi) WriteCmd(0x3F,Right); WriteCmd(0xC0,Left);//起始行 WriteCmd(0xC0,Right); WriteCmd(0xB8,Left); WriteCmd(0xB8,Right);//起始x,y坐標(biāo)(0,0) WriteCmd(0x40,Left); WriteCmd(0x40,Right);}4)初始化程序1185)清屏(一般dat=0)voidLCD_Clear(uchardat){ uchari,j; for(i=0;i<8;i++){ WriteCmd(0xB8+i,Left); WriteCmd(0xB8+i,Right); WriteCmd(0x40,Left); WriteCmd(0x40,Right); for(j=0;j<64;j++){ WriteData(dat,Left); WriteData(dat,Right); } }}5)清屏(一般dat=0)119總結(jié)理解12864是如何顯示字符和圖形的知曉單片機(jī)與12864的硬件連接根據(jù)硬件接線,確定所有的總線地址(8個(gè))明白如何通過(guò)總線操作對(duì)12864進(jìn)行數(shù)據(jù)與命令的交換參考12864的命令字進(jìn)行軟件編程學(xué)會(huì)如何使用取字模軟件總結(jié)理解12864是如何顯示字符和圖形的120圖6AT89C51與12864的硬件連接圖6AT89C51與12864的硬件連接121LCD12864模塊的20個(gè)引腳定義如下:1.Vss
邏輯電源地
2.VDD邏輯電源正5v
3.V0LCD驅(qū)動(dòng)電壓
4.RS數(shù)據(jù)/指令選擇:高電平為數(shù)據(jù),低電平為指令
5.R/W讀/寫(xiě)選擇:高電平為讀數(shù)據(jù),低電平為寫(xiě)數(shù)據(jù)6.E讀寫(xiě)使能,高電平有效,下降沿鎖定數(shù)據(jù)
7.DB0數(shù)據(jù)輸入輸出引腳
8.DB1數(shù)據(jù)輸入輸出引腳
9.DB2數(shù)據(jù)輸入輸出引腳
10.DB3數(shù)據(jù)輸入輸出引腳
11.DB4數(shù)據(jù)輸入輸出引腳
12.DB5數(shù)據(jù)輸入輸出引腳
13.DB6數(shù)據(jù)輸入輸出引腳
14.DB7數(shù)據(jù)輸入輸出引腳
15.CS1片選擇號(hào),低電平時(shí)選擇前64列
16.CS2片選擇號(hào),低電平時(shí)選擇后64列
17.RET復(fù)位信號(hào),低電平有效。
18.VEE輸出-15v電源給V0提供驅(qū)動(dòng)電源
19.A背光電源LED正極
20.K背光電源LED負(fù)極圖5.LCD引腳圖LCD12864模塊的20個(gè)引腳定義如下:圖5.LCD引腳圖122帶
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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è)大學(xué)浦江學(xué)院《思想道德與法治》2023-2024學(xué)年第一學(xué)期期末試卷
- 安金麗苑安裝工程施工組織設(shè)計(jì)
- 飛天凌空說(shuō)課稿
- 隊(duì)會(huì)課說(shuō)課稿
- 【初中化學(xué)】化學(xué)反應(yīng)的定量關(guān)系單元復(fù)習(xí)題-2024-2025學(xué)年九年級(jí)化學(xué)人教版上冊(cè)
- 簡(jiǎn)易面料加工合同范本(2篇)
- 南京工業(yè)大學(xué)《文獻(xiàn)檢索》2023-2024學(xué)年第一學(xué)期期末試卷
- 醫(yī)療質(zhì)量課件教學(xué)課件
- 青少年課件教學(xué)課件
- 建立4-5歲幼兒成長(zhǎng)檔案跟蹤教育效果
- 《用字母表示數(shù)》 單元作業(yè)設(shè)計(jì)
- HG/T 22820-2024 化工安全儀表系統(tǒng)工程設(shè)計(jì)規(guī)范(正式版)
- 數(shù)學(xué)文化 課件 2-中國(guó)古代數(shù)學(xué)與九章算術(shù)
- 2024時(shí)事政治考試題庫(kù)(典優(yōu))
- 第七章課程概述
- 2024《公共基礎(chǔ)知識(shí)必刷300題》題庫(kù)帶答案(輕巧奪冠)
- 創(chuàng)新設(shè)計(jì)前沿-知到答案、智慧樹(shù)答案
- 人力資源外包投標(biāo)方案
- MOOC 實(shí)驗(yàn)室安全學(xué)-武漢理工大學(xué) 中國(guó)大學(xué)慕課答案
- 基于人工智能的文化遺產(chǎn)保護(hù)與傳承策略
- 2024-2029年中國(guó)酒店行業(yè)發(fā)展分析及發(fā)展前景與趨勢(shì)預(yù)測(cè)研究報(bào)告
評(píng)論
0/150
提交評(píng)論