大家好,我是老耿,高職青椒一枚,一直從事單片機、嵌入式、物聯網等課程的教學。對于高職的學生層次,同行應該都懂的,老師在課堂上教學幾乎是沒什麼成就感的。正是如此,才有了借助頭條平台尋求認同感和成就感的想法。在這裡,我準備陸續把自己花了很多心思設計的教學課件分享出來,如果您正是一名單片機愛好者或是一名同行,歡迎點贊 關注,各位的支持是本人持續輸出的動力,多謝多謝!#30天學會STM32##單片機#
前邊我們講解了LED、按鍵和蜂鳴器的應用,這三類器件本身工作原理十分簡單,因此我們的重點是放在STM32的GPIO上面。這一章我們來學習一下開發闆配套的那塊厚厚的液晶屏——LCD1602,聚焦的是這個器件本身的特點和工作時序。因此,我們需要熟讀它的數據手冊,因為手冊裡告訴了編程的要點、參數、時序等。閱讀器件手冊是做單片機和嵌入式開發必備的基本能力,我們就從這一章開始鍛煉起來吧。為了不讓篇幅太長,本章打算分四個部分來講解,本文是第三部分。
【學習目标】
本章的前兩個部分花了不少篇幅,全方面的介紹了LCD1602以及與開發闆之間的聯系,傳遞出來的無非就是一個意思——吃透數據手冊。這别無他法,結合參考程序反複閱讀手冊,慢慢感悟,開發經驗就是這麼積累起來的。學完這個入門的液晶屏,後面還有更複雜的彩屏和觸摸屏等着我們去學習,依然是“啃”數據手冊。好了,下面我們就動手來寫一個程序,把手冊裡的内容轉換成代碼,驅動LCD1602去顯示我們想要的效果。
3.1 任務描述編寫LCD1602驅動代碼,上電之後可以在指定位置顯示字符串信息,實驗效果如圖13所示。
圖13 LCD1602靜态顯示實驗效果
3.2 工程文件清單與之前的工程一樣,控制一類新的硬件就增加一對與之匹配的驅動文件,即圖14中的lcd1602.c和lcd1602.h。
圖14 LCD1602工程文件
3.3 工程源碼剖析這裡為了突出源碼的功能細節和排版之需,對源碼進行了必要的分割處理。
3.3.1 lcd1602.h源碼剖析該文件源碼見代碼清單4,主要是LCD1602端口操作的宏定義和驅動函數的聲明,每個函數的功能和參數将在下面剖析lcd1602.c源碼時解讀。
代碼清單4 lcd1602.h文件源碼
3.3.2 lcd1602.c源碼剖析該文件就是所有LCD1602驅動函數的定義,下面就逐個進行剖析。
1) Lcd1602_WaitReady()函數源碼
該函數就是用來檢測液晶是否準備好,返回1表示“忙”,返回“0”表示“不忙”。詳細源碼見如下代碼清單5。
代碼清單5 Lcd1602_WaitReady()函數源碼
2) Lcd1602_Sendbyte()函數源碼
該函數把一個字節(參數byte)送上液晶的8位數據端口,高3位送到PC2 ~ PC0,低5位送上PB9 ~ PB5。送數的過程如代碼清單6所示,有一點曲折,但各位可以從中好好體會一下C語言位操作的嚴謹和奇妙。
代碼清單6 Lcd1602_SendByte()函數源碼
首先,我們得清楚,要改變的隻有PC2 ~ PC0、PB9 ~ PB5這8位,而這兩組I/O的其他位是不能變的,因為其它I/O還連着别的硬件呢。所以,才有了第55行先保存這組I/O的值。接下來,第56~58行的操作過程可以用圖15來表示,這幾句很好的诠釋了C語言常見的位操作在嵌入式層面是如何應用的,希望各位能好好領悟。同理,第60~63行是把byte的高3位送到PC2~PC0,各位可以自己琢磨和推導一下。
圖15 PB9~PB5的送數過程
3) Lcd1602_WriteCmd()函數源碼
該函數實現寫一個命令(參數byte)到LCD1602,就是按照數據手冊上寫命令的時序編寫的,大家可以對照手冊來閱讀,源碼見如下代碼清單7。
代碼清單7 Lcd1602_WriteCmd()函數源碼
4) Lcd1602_WriteData()函數源碼
該函數與寫命令函數是一個套路,就是第103行改成了數據模式,源碼見代碼清單8。
代碼清單8 Lcd1602_WriteData()函數源碼
5) Lcd1602_SetCursor()函數源碼
該函數用來設置光标的位置,參數x和y是位置坐标,x是行坐标(0表示第一行,1表示第二行),y是列坐标(0~15),源碼見如下代碼清單9。
代碼清單9 Lcd1602_SetCursor()函數源碼
6) Lcd1602_ShowChar()函數源碼
該函數用來顯示單個字符,參數x和y與上面一樣,确定在哪個位置顯示,ch為字符内容,源碼見如下代碼清單10。
代碼清單10 Lcd1602_ShowChar()函數源碼
7) Lcd1602_ShowStr()函數源碼
該函數用來顯示字符串信息,參數x和y與上面一樣,确定從哪個位置開始顯示,*str指向待顯示的字符串空間,源碼見如下代碼清單11。
代碼清單11 Lcd1602_ShowStr()函數源碼
8) Lcd1602_Clear()函數源碼
該函數用來清屏,參數pos可取值為0、1、2,分别表示清除第一行、第二行和整屏,源碼見如下代碼清單12。
代碼清單12 Lcd1602_Clear()函數源碼
9) Lcd1602_Init()函數源碼
該函數完成LCD1602上電之後的初始化,一方面将所連接的I/O口全部初始化,另一方面按照數據手冊交待的複位步驟對液晶進行初始化,源碼見如下代碼清單13。
代碼清單13 Lcd1602_Init()函數源碼
1602液晶手冊提供了一個初始化過程,由于不檢測“忙”位,所以程序比較複雜,如圖16所示。而我們編寫的程序已經将檢測“忙”位的功能嵌入到寫操作裡面了,所以隻用了第244~247行4條語句就完成了同樣效果,更加簡易方便。手冊上描述的那個,大家僅作了解即可。以後在别的資料裡看到了與我們這類不一樣的初始化也不要困惑,注意跟我們這裡聯系和對比。
圖16 數據手冊上的初始化過程
3.3.3 main.c源碼剖析主程序比較簡單,完成初始化之後就調用顯示函數在屏上指定的位置顯示指定的字符串,源碼見如下代碼清單14。
代碼清單14 main.c文件源碼
3.3.4 驗證與測試程序下載前,接好液晶屏和電源适配器,并将電源撥動開關置于OFF處(如圖17所示)。程序下載後,電源開關撥至ON,即可實現實驗效果。
圖17 實驗效果與電源撥動開關
(第三部分完,共四部分)
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!