大家好,我是老耿,高職青椒一枚,一直從事單片機、嵌入式、物聯網等課程的教學。對于高職的學生層次,同行應該都懂的,老師在課堂上教學幾乎是沒什麼成就感的。正是如此,才有了借助頭條平台尋求認同感和成就感的想法。在這裡,我準備陸續把自己花了很多心思設計的教學課件分享出來,如果您正是一名單片機愛好者或是一名同行,歡迎點贊 關注,各位的支持是本人持續輸出的動力,多謝多謝!#30天學會STM32##單片機#
前邊我們講解了LED、按鍵和蜂鳴器的應用,這三類器件本身工作原理十分簡單,因此我們的重點是放在STM32的GPIO上面。這一章我們來學習一下開發闆配套的那塊厚厚的液晶屏——LCD1602,聚焦的是這個器件本身的特點和工作時序。因此,我們需要熟讀它的數據手冊,因為手冊裡告訴了編程的要點、參數、時序等。閱讀器件手冊是做單片機和嵌入式開發必備的基本能力,我們就從這一章開始鍛煉起來吧。為了不讓篇幅太長,本章打算分四個部分來講解,本文是第二部分。
【學習目标】
LCD1602内部帶了80個字節的顯示RAM,用來存儲我們發送的數據,它的結構如圖7所示。
圖7 LCD1602内部RAM結構
第一行的地址是0x00到0x27,第二行的地址從0x40到0x67,其中第一行0x00到0x0F是與液晶上第一行16個字符顯示位置相對應的,第二行0x40到 0x4F是與第二行16個字符顯示位置相對應的。而每行都多出來一部分,是為了顯示移動字幕設置的。1602字符液晶是顯示字符的,因此它跟ASCII字符表是對應的。比如我們給0x00這個地址寫一個‘a’,也就是十進制的97,液晶的最左上方的那個小塊就會顯示一個字母a。此外,液晶内部有個數據指針,它指向哪裡,我們寫的那個數據就會送到相應的那個地址裡。
2.2 狀态字節LCD1602有一個狀态字節,我們通過讀取這個狀态字的内容,就可以知道一些内部情況,這個狀态字節含義如表3所示。
表3 LCD1602狀态字節
這個狀态字節最高位表示了當前液晶是不是“忙”,如果這個位是1表示正“忙”,禁止我們讀寫數據或者命令;如果是0,則可以進行讀寫。而低7位就表示了當前數據地址指針的位置。
2.3 讀寫時序LCD1602的基本操作時序,一共有4個,這些大家都不需要記住,但是都需要理解,因為我們現在不是為了應付考試,所以不需要你把手冊背熟,但是你寫程序的時候,打開手冊要能看懂如何操作。
2.3.1 讀狀态RS = L,R/W = H,E = H,讀狀态。這是個很簡單的邏輯,我們對照手冊上的讀狀态時序(如圖8所示),編寫的程序結構如代碼清單2所示。
圖8 讀狀态時序圖
代碼清單2 讀液晶狀态程序的基本結構
這樣就讀到了當前液晶的狀态位,我們可以通過該位的值來了解當前液晶是否處于“忙”狀态。這裡面有兩個問題:第一,如果讀到的狀态是“不忙(0)”,那麼程序可以進行讀寫操作;如果當前狀态是“忙(1)”,那麼還得繼續等待重新判斷液晶的狀态;第二,讀完了液晶狀态繼續保持使能E是高電平的話,LCD1602會繼續輸出它的狀态值,輸出的這個值會占據了數據總線,所以讀完了狀态,通常需要把這個引腳拉低(第7行)來釋放總線。
為了解決以上兩個問題,我們把讀液晶狀态的函數放在while循環中,直到循環退出(即不忙),再執行後續的寫液晶操作,程序結構如代碼清單3所示。
代碼清單3 寫液晶之前反複讀取是否“忙”
2.3.2 讀數據如圖9所示,這個時序跟讀狀态很像,把第一步改成拉高RS即可。但是,讀數據不常用,大家了解一下就可以了,這裡就不詳細解釋了。
圖9 讀數據時序圖
2.3.3 寫指令RS = L,R/W = L,D7~D0 = 指令碼,E = 高脈沖,時序如圖10所示。這個在邏輯上沒什麼難的,隻是“E = 高脈沖”這個問題要解釋一下。這個指令一共有4條語句,其中前三條語句順序無所謂,但是“E = 高脈沖”這一句很關鍵。
圖10 寫指令時序
實際上流程是這樣的:因為我們現在是寫指令,所以我們首先要保證E引腳是低電平狀态,而前三句不管我們怎麼寫,LCD1602隻要沒有接收到E引腳的使能控制,它都不會來讀總線上的信号的。當通過前三句準備好數據之後,E使能引腳從低電平到高電平變化,然後E使能引腳再從高電平到低電平出現一個下降沿,LCD1602内部一旦檢測到這個下降沿後,并且檢測到“RS = L,R/W = L”就馬上來讀取D7~D0 的數據,完成寫指令過程。
綜上所述,我們寫了個“E = 高脈沖”,意思就是:使能E先從低拉高,再從高拉低,形成一個高脈沖。
2.3.4 寫數據RS = H,R/W = L,D7~D0 = 數據,E = 高脈沖,時序如圖11所示。這個時序跟寫指令很像,把第一步改成拉高RS即可。此時,寫入的就是需要顯示的字符編碼了。
圖11 寫數據時序
2.4 指令介紹與單片機寄存器的用法類似,LCD1602在使用的時候,我們首先要進行初始的功能配置,有以下幾個指令需要了解。
2.4.1 顯示模式設置如表4所示,寫指令0x38,設置16x2顯示,5x7點陣,8位數據接口。這條指令對我們這個液晶來說是固定的,必須寫0x38,大家仔細看會發現我們的液晶實際上内部點陣是5x8的,還有一些1602液晶還兼容串行通信,用2個IO口即可,但是速度慢,我們這個液晶就是固定的0x38模式。
表4 固定的顯示模式設置指令
2.4.2 顯示開/關與光标設置這裡有兩類指令,我們把數據手冊裡對它們的描述貼過來,如表5所示。
表5 顯示開/關與光标設置指令
2.4.3 清屏顯示固定的,寫入0x01表示顯示清屏,包含了數據指針清零,所有的顯示清零。寫入0x02則僅僅是數據指針清零,顯示不清零。
2.4.4 RAM地址設置該指令碼的最高位為1,低7位為RAM的地址,RAM地址與液晶上字符的關系已在圖7中呈現。通常,我們在讀寫數據之前都要先設置好地址,然後再進行數據的讀寫操作。
2.4.5 光标、畫面位移設置如表6所示,通過這個指令碼我們可以實現屏幕上内容的整體左移(或右移)顯示,就像生活中常見的那種滾動屏顯。具體控制效果為:
表6 光标和畫面移動指令
這個指令效果也解釋了圖7中屏幕之外那些地址的意義,我們再把它複制過來并添加了一些标注(如圖12所示),兩排地址就像可以寫兩行字的紙帶,寫在前16個格子裡字迹就會顯示,而寫在其他格子裡字迹就隐身了(并沒有消失)。因此,當屏幕内容移動時,紙帶是不動的,動的是字迹,也就是手冊上所說的“移動時不影響DDRAM”。
圖12 用紙帶比喻RAM地址
(第二部分完,共四部分)
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!