(1)LCD1602概述
先來(lái)看看LCD1602什么意思?Liquid Crystal Display(LCD)表示液晶顯示,1602 表示一行可以顯示16個(gè)字符,一共有兩行。
現(xiàn)在我們來(lái)看看如何使用簡(jiǎn)單的IO控制和延時(shí)來(lái)實(shí)現(xiàn)操作LCD1602液晶模塊。既然是用單片機(jī)控制LCD1602,那么根據(jù)前面的分析,首先要搞清楚誰(shuí)是控制對(duì)象,誰(shuí)是被控制對(duì)象。很顯然,LCD1602是被控制對(duì)象,那么我們就先從LCD1602開始分析。所謂控制也可以理解為溝通,比如你與室友溝通,希望他幫你買瓶綠茶,那么就表示至少你的室友能聽懂你的“指令”,能知道綠茶是什么,如何去買等等信息。好了,那么如何與LCD1602溝通呢?可以想一想,平時(shí)人與人是如何溝通的?溝通之前先要打個(gè)招呼吧,比如“你好”之類的,電話里面要先講個(gè)“喂?”,確定通迅正常了之后才進(jìn)入溝通正題了,很少有人打電話一上來(lái)就開始“哇哇”的說(shuō),萬(wàn)一說(shuō)了半天發(fā)現(xiàn)信號(hào)還沒(méi)連上呢,那不是白講了。其實(shí)單片機(jī)與LCD1602的溝通方式也一樣,電話中使用的“喂?”在我們這里其實(shí)就叫初始化。后面也會(huì)經(jīng)常碰到這個(gè)“初始化”的概念。其實(shí)器件也是人設(shè)計(jì)的,所以他的工作方式從某種程度上講,也是人的溝通方式。打完招呼后,就開始進(jìn)入真正主題了。什么主題呢?LCD1602是顯示模塊,主要作用當(dāng)然是顯示了。既然是顯示,我們可以想一想,無(wú)非就是兩個(gè)內(nèi)容:
(1)你想要顯示什么內(nèi)容?
(2)你打算在哪里顯示?
很明顯,這兩個(gè)內(nèi)容都是來(lái)自于單片機(jī)的控制,單片機(jī)讓它顯示什么它就顯示什么(叁議電子)。這個(gè)‘顯示什么’就是傳送的數(shù)據(jù)。那么怎么往LCD1602模塊傳送數(shù)據(jù)呢?前面講了,LCD1602表示2行16個(gè)字符,也就是有不同的顯示地點(diǎn),那么單片機(jī)如何告訴LCD1602的顯示地點(diǎn)呢?因此前面的分析可以總結(jié)為三個(gè)問(wèn)題,如何初始化;如何傳送顯示的內(nèi)容(顯示什么);在哪里顯示。這三個(gè)問(wèn)題如何解答呢?當(dāng)然要去看LCD1602說(shuō)明手冊(cè)了。
為了解決這三個(gè)問(wèn)題,我們還是先來(lái)看看人與人之間是如何溝通的,如果當(dāng)面溝通,你的信號(hào)(聲音)能夠直接傳到對(duì)方,而且能讓對(duì)方聽懂。如果相距比較遠(yuǎn),那么就使用電話等通信工具。前者信號(hào)傳遞載體是空氣,后者是電話線。那么我們來(lái)看看MCU與LCD1602的信號(hào)傳遞載體是什么樣的,這就需要去查看原理圖了。
如圖3-1所示,LCD1602一共16個(gè)引腳,其中引腳1,2,15,16是與電源相關(guān)的,我們不去理它。另外引腳3連接到了可調(diào)電阻Rv1,用于液晶模塊背光調(diào)節(jié)的,這里也暫且不管。我們現(xiàn)在關(guān)心的是與信號(hào)傳輸相關(guān)的引腳,很明顯與引腳4到引腳14有關(guān)。從圖中我們看到,單片機(jī)通過(guò)P4.1,P4.4,P4.5分別與RS,RW,EN連接,P2端口與D0到D7連接,一共10根線。那么也就是說(shuō),單片機(jī)的所有指令,數(shù)據(jù)等都是通過(guò)這10根線來(lái)完成的。怎么樣去控制LCD呢,當(dāng)然是閱讀LCD的說(shuō)明手冊(cè)。這里來(lái)個(gè)比喻,房間內(nèi)一個(gè)人規(guī)定,敲三下門,屋內(nèi)的人才把門打開。如果你要進(jìn)入屋內(nèi),就必須敲三下,如果你不知道這個(gè)規(guī)則,敲了四下,或者大喊大叫,門也開不了。這里要說(shuō)明什么意思?當(dāng)你要與某個(gè)器件溝通的時(shí)候,你必須嚴(yán)格按照這個(gè)器件的規(guī)則來(lái)操作。比如一個(gè)德國(guó)人只會(huì)講德語(yǔ),如果你想與他溝通那么你就只能和他講德語(yǔ)了。如果你講漢語(yǔ),他講德語(yǔ),這就亂套了,信息無(wú)法傳遞(www.ppptalk.com)。這個(gè)時(shí)候,你可以選擇會(huì)講漢語(yǔ)的德國(guó)人溝通,也就是換一個(gè)溝通對(duì)象。同樣的,如果你覺得某個(gè)器件操作起來(lái)太麻煩,那么你可以更換另外一個(gè)具有同樣功能能滿足你使用要求的器件來(lái)代替。但是,一旦你選定了某個(gè)器件后,你必須100%的按照“這個(gè)器件的使用規(guī)則”來(lái)操作。不同的外圍器件的規(guī)則是不一樣,也就是說(shuō)這些規(guī)則是多樣化的。回到前面講的開門的例子,也可以這樣設(shè)計(jì),比如一共敲兩下,第一下要敲重一點(diǎn),第二下要敲輕一點(diǎn)。或者重敲三下,輕敲一下,等等。但是對(duì)于我們而言,不需要問(wèn)為什么,照著做就行了。規(guī)則如何設(shè)計(jì),那是設(shè)計(jì)這個(gè)器件或者模塊的工程師應(yīng)該思考的工作,我相信這些規(guī)則的設(shè)計(jì)一定有他們的理由。但我們只是從應(yīng)用層面來(lái)思考問(wèn)題,不管你怎么規(guī)定的,我照做就行了。這些規(guī)則在哪里呢?查看芯片手冊(cè)或者官方說(shuō)明書。羅嗦這么多,其實(shí)就為了強(qiáng)調(diào)學(xué)習(xí)這門技術(shù)一定要以芯片手冊(cè)(官方說(shuō)明資料)為本,而且后面還會(huì)繼續(xù)強(qiáng)調(diào)。其實(shí)LCD1602包括后面會(huì)講到的其他模塊同樣如此,你要與它溝通,當(dāng)然必須按照它的規(guī)則來(lái)。下面我們就來(lái)解讀它的規(guī)則,來(lái)解決前面提到的三個(gè)問(wèn)題,初始化,內(nèi)容顯示,顯示地址。
(2)LCD1602初始化
關(guān)于這一點(diǎn),LCD1602說(shuō)明手冊(cè)上已經(jīng)明確告訴我們了,想都不要去想,管你這些什么意思,照做即可。
延時(shí)15ms
寫指令38H
延時(shí)5ms
寫指令38H
寫指令08H
寫指令01H
寫指令06H
寫指令0CH
以上為初始化過(guò)程,延時(shí)部分好解決,前面講過(guò)了。這里就看如何“寫指令”了。問(wèn)題來(lái)了,液晶模塊怎么知道單片機(jī)給我的是命令還是數(shù)據(jù)。(叁議電子www.ppptalk.com)LCD1602看到RS為高時(shí),就明白了,哦,你要給我傳送數(shù)據(jù)了;看到RS為低時(shí),就知道你要給我指令了。這個(gè)只是選擇“命令”還是“數(shù)據(jù)”,還有一個(gè)問(wèn)題,我們的目的是“寫指令”,那么液晶模塊怎么知道是“寫”還是“讀”呢?再來(lái)看RW信號(hào),當(dāng)RW為低的時(shí)候,液晶模塊就知道了,單片機(jī)要給我“寫”了;當(dāng)RW為高的時(shí)候,液晶模塊也知道了,單片機(jī)要“讀”了。很明顯,我們這里要把RW設(shè)置為低。“寫/讀”和“指令/數(shù)據(jù)”都知道如何告訴液晶模塊了,那么這個(gè)指令從怎么傳過(guò)去呢?通過(guò)D0-D7這8根線(也就是P2端口)來(lái)傳輸,比如我要傳送的指令為x033,那么就把這個(gè)數(shù)據(jù)0x33放到P2端口,當(dāng)LCD1602看到“寫”和“指令”的時(shí)候,就知道把P2端口上的0x33這個(gè)指令拿過(guò)來(lái)了。這樣就達(dá)到了“寫”“指令”“0x33”的目的。
但是不是這樣就能讓LCD1602正常執(zhí)行了。不是的。回到我們前面講的那個(gè)例子,這里加個(gè)條件,屋內(nèi)人聽到敲門三下后,判斷暗號(hào)正確了,但是沒(méi)有直接開門,而是通知了他的上級(jí),得到上級(jí)的授權(quán)后,才開門。也就是兩個(gè)條件,暗號(hào)正確和上級(jí)授權(quán)。LCD1602也一樣,收到指令沒(méi)有立即執(zhí)行,還要等另外一個(gè)信號(hào),就是EN使能信號(hào)。此時(shí)EN給個(gè)一定寬度的脈沖,LCD1602才開始執(zhí)行。
這樣根據(jù)前面的分析很容易的寫出寫指令的代碼:
void Lcd_Write_Cmd(unsigned char Cmd) {
delayMs(5);//注意這里需要延時(shí)5ms比較保險(xiǎn) 代替判斷忙信號(hào)
RW = 0;
P2 = Cmd; //準(zhǔn)備好指令
RS=0; //告訴LCD1602,P0中放的是指令不是數(shù)據(jù)
EN=1;
delayUs(5); //根據(jù)時(shí)序圖,脈沖要有一定寬度
EN=0; //使指令有效,開始執(zhí)行
}
同樣的道理,以上代碼中,只需改一下RS信號(hào)為1,就是寫數(shù)據(jù)的代碼了
voidLcd_Write_Data(unsignedcharmData) {
RW = 0;
delayMs(5);//注意這里需要延時(shí)5ms比較保險(xiǎn)代替判斷忙信號(hào)
P2=mData;//準(zhǔn)備好指令
RS=1;//告訴LCD1602,P0中放的是數(shù)據(jù)不是指令
EN=1;
delayUs(5);//根據(jù)時(shí)序圖,脈沖要有一定寬度
EN=0;//使指令有效,開始執(zhí)行
}
講到這里,LCD1602初始化代碼應(yīng)該能寫出了。同時(shí)我們也已經(jīng)寫出了傳遞指令的代碼,那么現(xiàn)在我們只要知道指令內(nèi)容就可以了。
指令1:清顯示,指令碼01H,光標(biāo)復(fù)位到地址00H位置。
指令2:光標(biāo)復(fù)位,光標(biāo)返回到地址00H。
指令3:光標(biāo)和顯示模式設(shè)置I/D:光標(biāo)移動(dòng)方向,高電平右移,低電平左移S:屏幕上所有文字是否左移或者右移。高電平表示有效,低電平則無(wú)效。
指令4:顯示開關(guān)控制。D:控制整體顯示的開與關(guān),高電平表示開顯示,低電平表示關(guān)顯示C:控制光標(biāo)的開與關(guān),高電平表示有光標(biāo),低電平表示無(wú)光標(biāo)B:控制光標(biāo)是否閃爍,高電平閃爍,低電平不閃爍。
指令5:光標(biāo)或顯示移位S/C:高電平時(shí)移動(dòng)顯示的文字,低電平時(shí)移動(dòng)光標(biāo)。
指令6:功能設(shè)置命令DL:高電平時(shí)為4位總線,低電平時(shí)為8位總線N:低電平時(shí)為單行顯示,高電平時(shí)雙行顯示F:低電平時(shí)顯示5x7的點(diǎn)陣字符,高電平時(shí)顯示5x10的點(diǎn)陣字符。
指令7:字符發(fā)生器RAM地址設(shè)置。
指令8:DDRAM地址設(shè)置。
指令9:讀忙信號(hào)和光標(biāo)地址BF:為忙標(biāo)志位,高電平表示忙,此時(shí)模塊不能接收命令或者數(shù)據(jù),如果為低電平表示不忙。
指令10:寫數(shù)據(jù)。
指令11:讀數(shù)據(jù)。
這樣你需要給LCD1602什么指令,只需要傳遞給void write_com(unsigned char Cmd)函數(shù)中的Cmd參數(shù)就行了。
(3)LCD1602確定顯示位置
現(xiàn)在我們就來(lái)解決前面提到的第二個(gè)問(wèn)題:“在哪里顯示?”也就是液晶模塊的這32個(gè)空格是如何確定的。
從以上這個(gè)圖可以看到,一共兩行,00到0F和40到4F剛好與LCD1602的32個(gè)空格對(duì)應(yīng)。可見,液晶模塊的顯示位置是通過(guò)這個(gè)表格對(duì)應(yīng)的碼值來(lái)確定的。例如第二行第一個(gè)字符的地址是40H,那么是不是它的地址就是40H了。注意表3-2中第8條數(shù)據(jù)存儲(chǔ)地址,D7已經(jīng)被寫死了。最終的顯示地址應(yīng)該是40H+10000000B(40H+80H),因此我們只要把這個(gè)值傳給Cmd,這樣LCD1602就知道在第二行第一個(gè)位置顯示了。
(4)LCD1602確定顯示內(nèi)容
前面講了,如果傳送數(shù)據(jù)就是要顯示的內(nèi)容。比如我要顯示字母A,怎么操作呢?
以上圖中可以知道,如果你要顯示A,那么數(shù)據(jù)的高位為0100,低位為0001,因此為01000001。把這個(gè)數(shù)據(jù)傳送給LCD1602,它就知道要顯示A了。
這樣三個(gè)問(wèn)題都解決了,“初始化”,“寫指令”,“寫數(shù)據(jù)”。
現(xiàn)在回過(guò)頭來(lái)看看,我們?cè)谑褂脝纹瑱C(jī)控制LCD1602這個(gè)過(guò)程中用到了單片機(jī)的哪些知識(shí)。回去看看圖1,10根連接線,P4.1,P4.4和P4.5,再加上P2端口,主要是通過(guò)P4.1,P4.4和P4.5高低變化來(lái)發(fā)出指令或數(shù)據(jù),P2端口的變化反映指令或數(shù)據(jù)的內(nèi)容。可見,這個(gè)過(guò)程中我們只用到了IO口控制和延時(shí)。其他很長(zhǎng)的部分我們用在理解1602的使用規(guī)則了。注意這里是使用規(guī)則,談不上原理。比如你給LCD1602發(fā)送清屏指令時(shí),你明白LCD1602收到這個(gè)指令是如何操作清屏的嗎?不知道,也沒(méi)有必要知道。液晶模塊說(shuō)明書也不告訴你。好比你使用手機(jī)時(shí),你點(diǎn)擊一下某個(gè)應(yīng)用程序就打開了,然后按照它的規(guī)則去使用就行了,比如聽歌,上網(wǎng)等等,你不用關(guān)心它們是怎么實(shí)現(xiàn)的。其實(shí)手機(jī)也是個(gè)模塊,我們只要學(xué)會(huì)操作就行了,不管它里面發(fā)生了什么事情。
(5)小結(jié)
現(xiàn)在對(duì)以上分析內(nèi)容小結(jié)一下。LCD1602液晶模塊的作用就是顯示,既然是“顯示”,無(wú)非就是顯示什么內(nèi)容,在哪里顯示。那么如何確定顯示的內(nèi)容呢?通過(guò)ASCII碼表來(lái)確定。如何確定顯示的位置呢?通過(guò)表格3-3來(lái)確定。在單片機(jī)控制LCD1602液晶模塊時(shí),也就是這兩個(gè)對(duì)象溝通時(shí),一定要先“打招呼”,也就是初始化。如何初始化呢?說(shuō)明手冊(cè)中已經(jīng)給出了具體步驟,照搬即可。理清了這個(gè)思路,剩下的就是去實(shí)現(xiàn)各個(gè)步驟了。里面涉及到如何寫指令,寫數(shù)據(jù)以及如何讀忙信號(hào)。具體查看時(shí)序圖即可。
評(píng)論
查看更多