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