51微控制器控制LCD1602模組

ppptalk發表於2018-01-28

51微控制器控制LCD1602模組

視訊播放:LCD1602視訊

(1)LCD1602概述

先來看看LCD1602什麼意思?Liquid Crystal Display(LCD)表示液晶顯示,1602 表示一行可以顯示16個字元,一共有兩行。

現在我們來看看如何使用簡單的IO控制和延時來實現操作LCD1602液晶模組。既然是用微控制器控制LCD1602,那麼根據前面的分析,首先要搞清楚誰是控制物件,誰是被控制物件。很顯然,LCD1602是被控制物件,那麼我們就先從LCD1602開始分析。所謂控制也可以理解為溝通,比如你與室友溝通,希望他幫你買瓶綠茶,那麼就表示至少你的室友能聽懂你的“指令”,能知道綠茶是什麼,如何去買等等資訊。好了,那麼如何與LCD1602溝通呢?可以想一想,平時人與人是如何溝通的?溝通之前先要打個招呼吧,比如“你好”之類的,電話裡面要先講個“喂?”,確定通迅正常了之後才進入溝通正題了,很少有人打電話一上來就開始“哇哇”的說,萬一說了半天發現訊號還沒連上呢,那不是白講了。其實微控制器與LCD1602的溝通方式也一樣,電話中使用的“喂?”在我們這裡其實就叫初始化。後面也會經常碰到這個“初始化”的概念。其實器件也是人設計的,所以他的工作方式從某種程度上講,也是人的溝通方式。打完招呼後,就開始進入真正主題了。什麼主題呢?LCD1602是顯示模組,主要作用當然是顯示了。既然是顯示,我們可以想一想,無非就是兩個內容:

(1)你想要顯示什麼內容?

(2)你打算在哪裡顯示?

很明顯,這兩個內容都是來自於微控制器的控制,微控制器讓它顯示什麼它就顯示什麼(叄議電子)。這個‘顯示什麼’就是傳送的資料。那麼怎麼往LCD1602模組傳送資料呢?前面講了,LCD1602表示2行16個字元,也就是有不同的顯示地點,那麼微控制器如何告訴LCD1602的顯示地點呢?因此前面的分析可以總結為三個問題,如何初始化;如何傳送顯示的內容(顯示什麼);在哪裡顯示。這三個問題如何解答呢?當然要去看LCD1602說明手冊了。

為了解決這三個問題,我們還是先來看看人與人之間是如何溝通的,如果當面溝通,你的訊號(聲音)能夠直接傳到對方,而且能讓對方聽懂。如果相距比較遠,那麼就使用電話等通訊工具。前者訊號傳遞載體是空氣,後者是電話線。那麼我們來看看MCU與LCD1602的訊號傳遞載體是什麼樣的,這就需要去檢視原理圖了。

如圖3-1所示,LCD1602一共16個引腳,其中引腳1,2,15,16是與電源相關的,我們不去理它。另外引腳3連線到了可調電阻Rv1,用於液晶模組背光調節的,這裡也暫且不管。我們現在關心的是與訊號傳輸相關的引腳,很明顯與引腳4到引腳14有關。從圖中我們看到,微控制器通過P4.1,P4.4,P4.5分別與RS,RW,EN連線,P2埠與D0到D7連線,一共10根線。那麼也就是說,微控制器的所有指令,資料等都是通過這10根線來完成的。怎麼樣去控制LCD呢,當然是閱讀LCD的說明手冊。這裡來個比喻,房間內一個人規定,敲三下門,屋內的人才把門開啟。如果你要進入屋內,就必須敲三下,如果你不知道這個規則,敲了四下,或者大喊大叫,門也開不了。這裡要說明什麼意思?當你要與某個器件溝通的時候,你必須嚴格按照這個器件的規則來操作。比如一個德國人只會講德語,如果你想與他溝通那麼你就只能和他講德語了。如果你講漢語,他講德語,這就亂套了,資訊無法傳遞(www.ppptalk.com)。這個時候,你可以選擇會講漢語的德國人溝通,也就是換一個溝通物件。同樣的,如果你覺得某個器件操作起來太麻煩,那麼你可以更換另外一個具有同樣功能能滿足你使用要求的器件來代替。但是,一旦你選定了某個器件後,你必須100%的按照“這個器件的使用規則”來操作。不同的外圍器件的規則是不一樣,也就是說這些規則是多樣化的。回到前面講的開門的例子,也可以這樣設計,比如一共敲兩下,第一下要敲重一點,第二下要敲輕一點。或者重敲三下,輕敲一下,等等。但是對於我們而言,不需要問為什麼,照著做就行了。規則如何設計,那是設計這個器件或者模組的工程師應該思考的工作,我相信這些規則的設計一定有他們的理由。但我們只是從應用層面來思考問題,不管你怎麼規定的,我照做就行了。這些規則在哪裡呢?檢視晶片手冊或者官方說明書。羅嗦這麼多,其實就為了強調學習這門技術一定要以晶片手冊(官方說明資料)為本,而且後面還會繼續強調。其實LCD1602包括後面會講到的其他模組同樣如此,你要與它溝通,當然必須按照它的規則來。下面我們就來解讀它的規則,來解決前面提到的三個問題,初始化,內容顯示,顯示地址。

(2)LCD1602初始化

關於這一點,LCD1602說明手冊上已經明確告訴我們了,想都不要去想,管你這些什麼意思,照做即可。

延時15ms

寫指令38H

延時5ms

寫指令38H

寫指令08H

寫指令01H

寫指令06H

寫指令0CH

以上為初始化過程,延時部分好解決,前面講過了。這裡就看如何“寫指令”了。問題來了,液晶模組怎麼知道微控制器給我的是命令還是資料。(叄議電子www.ppptalk.com)LCD1602看到RS為高時,就明白了,哦,你要給我傳送資料了;看到RS為低時,就知道你要給我指令了。這個只是選擇“命令”還是“資料”,還有一個問題,我們的目的是“寫指令”,那麼液晶模組怎麼知道是“寫”還是“讀”呢?再來看RW訊號,當RW為低的時候,液晶模組就知道了,微控制器要給我“寫”了;當RW為高的時候,液晶模組也知道了,微控制器要“讀”了。很明顯,我們這裡要把RW設定為低。“寫/讀”和“指令/資料”都知道如何告訴液晶模組了,那麼這個指令從怎麼傳過去呢?通過D0-D7這8根線(也就是P2埠)來傳輸,比如我要傳送的指令為x033,那麼就把這個資料0x33放到P2埠,當LCD1602看到“寫”和“指令”的時候,就知道把P2埠上的0x33這個指令拿過來了。這樣就達到了“寫”“指令”“0x33”的目的。

但是不是這樣就能讓LCD1602正常執行了。不是的。回到我們前面講的那個例子,這裡加個條件,屋內人聽到敲門三下後,判斷暗號正確了,但是沒有直接開門,而是通知了他的上級,得到上級的授權後,才開門。也就是兩個條件,暗號正確和上級授權。LCD1602也一樣,收到指令沒有立即執行,還要等另外一個訊號,就是EN使能訊號。此時EN給個一定寬度的脈衝,LCD1602才開始執行。

這樣根據前面的分析很容易的寫出寫指令的程式碼:

void Lcd_Write_Cmd(unsigned char Cmd) {  

    delayMs(5);//注意這裡需要延時5ms比較保險 代替判斷忙訊號  

    RW = 0; 

    P2 = Cmd;        //準備好指令  

    RS=0;         //告訴LCD1602,P0中放的是指令不是資料  

    EN=1;  

    delayUs(5); //根據時序圖,脈衝要有一定寬度  

    EN=0;           //使指令有效,開始執行

同樣的道理,以上程式碼中,只需改一下RS訊號為1,就是寫資料的程式碼了

voidLcd_Write_Data(unsignedcharmData{

    RW = 0;

    delayMs(5);//注意這裡需要延時5ms比較保險代替判斷忙訊號

    P2=mData;//準備好指令

    RS=1;//告訴LCD1602,P0中放的是資料不是指令

    EN=1;

    delayUs(5);//根據時序圖,脈衝要有一定寬度

    EN=0;//使指令有效,開始執行

}

講到這裡,LCD1602初始化程式碼應該能寫出了。同時我們也已經寫出了傳遞指令的程式碼,那麼現在我們只要知道指令內容就可以了。

指令1:清顯示,指令碼01H,游標復位到地址00H位置。

指令2:游標復位,游標返回到地址00H。

指令3:游標和顯示模式設定I/D:游標移動方向,高電平右移,低電平左移S:螢幕上所有文字是否左移或者右移。高電平表示有效,低電平則無效。

指令4:顯示開關控制。D:控制整體顯示的開與關,高電平表示開顯示,低電平表示關顯示C:控制游標的開與關,高電平表示有游標,低電平表示無游標B:控制游標是否閃爍,高電平閃爍,低電平不閃爍。

指令5:游標或顯示移位S/C:高電平時移動顯示的文字,低電平時移動游標。

指令6:功能設定命令DL:高電平時為4位匯流排,低電平時為8位匯流排N:低電平時為單行顯示,高電平時雙行顯示F:低電平時顯示5x7的點陣字元,高電平時顯示5x10的點陣字元。

指令7:字元發生器RAM地址設定。

指令8:DDRAM地址設定。

指令9:讀忙訊號和游標地址BF:為忙標誌位,高電平表示忙,此時模組不能接收命令或者資料,如果為低電平表示不忙。

指令10:寫資料。

指令11:讀資料。

這樣你需要給LCD1602什麼指令,只需要傳遞給void write_com(unsigned char Cmd)函式中的Cmd引數就行了。


(3)LCD1602確定顯示位置


現在我們就來解決前面提到的第二個問題:“在哪裡顯示?”也就是液晶模組的這32個空格是如何確定的。

從以上這個圖可以看到,一共兩行,00到0F和40到4F剛好與LCD1602的32個空格對應。可見,液晶模組的顯示位置是通過這個表格對應的碼值來確定的。例如第二行第一個字元的地址是40H,那麼是不是它的地址就是40H了。注意表3-2中第8條資料儲存地址,D7已經被寫死了。最終的顯示地址應該是40H+10000000B(40H+80H),因此我們只要把這個值傳給Cmd,這樣LCD1602就知道在第二行第一個位置顯示了。

(4)LCD1602確定顯示內容

前面講了,如果傳送資料就是要顯示的內容。比如我要顯示字母A,怎麼操作呢?

以上圖中可以知道,如果你要顯示A,那麼資料的高位為0100,低位為0001,因此為01000001。把這個資料傳送給LCD1602,它就知道要顯示A了。

這樣三個問題都解決了,“初始化”,“寫指令”,“寫資料”。

現在回過頭來看看,我們在使用微控制器控制LCD1602這個過程中用到了微控制器的哪些知識。回去看看圖1,10根連線線,P4.1,P4.4和P4.5,再加上P2埠,主要是通過P4.1,P4.4和P4.5高低變化來發出指令或資料,P2埠的變化反映指令或資料的內容。可見,這個過程中我們只用到了IO口控制和延時。其他很長的部分我們用在理解1602的使用規則了。注意這裡是使用規則,談不上原理。比如你給LCD1602傳送清屏指令時,你明白LCD1602收到這個指令是如何操作清屏的嗎?不知道,也沒有必要知道。液晶模組說明書也不告訴你。好比你使用手機時,你點選一下某個應用程式就開啟了,然後按照它的規則去使用就行了,比如聽歌,上網等等,你不用關心它們是怎麼實現的。其實手機也是個模組,我們只要學會操作就行了,不管它裡面發生了什麼事情。

(5)小結

現在對以上分析內容小結一下。LCD1602液晶模組的作用就是顯示,既然是“顯示”,無非就是顯示什麼內容,在哪裡顯示。那麼如何確定顯示的內容呢?通過ASCII碼錶來確定。如何確定顯示的位置呢?通過表格3-3來確定。在微控制器控制LCD1602液晶模組時,也就是這兩個物件溝通時,一定要先“打招呼”,也就是初始化。如何初始化呢?說明手冊中已經給出了具體步驟,照搬即可。理清了這個思路,剩下的就是去實現各個步驟了。裡面涉及到如何寫指令,寫資料以及如何讀忙訊號。具體檢視時序圖即可。



相關文章