STM32驱动LCD1602,哪位同学需要的,来了
問題由來
我們之前分享過了數碼管、OLED、LCD12864,最近群里小伙伴有需要STM32驅動LCD1602的源碼,咱們今天就分享一下,如何使用STM32驅動LCD1602液晶屏,授人以魚不如授人以漁,一起來看看怎么驅動LCD1602。
淘寶下單買一個:
LCD1602的意思就是每行可以顯示16個字符,一共可以顯示2行內容。
開發環境與工具
- Keil 5
- 公眾號開源的最小系統核心板
- PC為Win10
- 3.3V LCD1206的型號為:1602A
引腳定義
LCD1602一共有16個引腳,具體定義如下:
| 1 | Vss | 電源地(GND) |
| 2 | Vdd | 電源電壓(+3.3V) |
| 3 | VO | 對比度(清晰度)調整 |
| 4 | RS | 寄存器選擇輸入端,當RS=0,當進行寫模塊操作,指向指令寄存器;當RS=1,無論讀操作還是寫操作,均指向數據寄存器 |
| 5 | R/W | 讀寫控制輸入端。當R/W=1時為讀操作;當R/W=0時為寫操作。 |
| 6 | E | 使能信號輸入端。讀操作時,高電平有效;寫操作時,下降沿有效。 |
| 7~14 | DB0~DB7 | 8位雙向數據總線 |
| 15 | A | 背光板電源正+3.3V |
| 16 | K | 背光板電源負0V |
因為STM32為3.3V單片機,所以為了方便,本次測試選用了一個3.3V的LCD1602。
本次實例選用的LCD1602背部如下所示,顯示的型號為:1602A
原理圖
具體連接情況:
| 1 | Vss | 電源負極,接地 |
| 2 | Vdd | 電源正極,接3.3V(注意自己所選的LCD1602是否支持3.3V),原理圖中J30的1、2腳短接 |
| 3 | VO | 調節屏幕對比度,R30為10K的電位器 |
| 4 | RS | 與STM32任意一個GPIO相連即可,本實例選擇PB6 |
| 5 | R/W | 與STM32任意一個GPIO相連即可,本實例選擇PB7 |
| 6 | E | 與STM32任意一個GPIO相連即可,本實例選擇PB8 |
| 7~14 | DB0~DB7 | 與STM32任意8個GPIO相連即可,如果方便選擇一組中相鄰的8個GPIO的話更好 |
| 15 | A | 背光板電源正+3.3V,中間加了一個10Ω的限流電阻,即R31=10Ω |
| 16 | K | 背光板電源負,接地 |
注意:程序下載之后,如果屏幕沒有任何內容顯示,先別急著否定,可以嘗試調節一下與VO引腳相連的電位器,有時是因為對比度的原因導致沒有任何內容顯示。
寫操作時序
寫操作過程時序分析
根據向LCD1602液晶寫入的內容是指令還是數據,將RS引腳置低或置高。寫指令,將RS置低;寫數據,將RS置高;
因為是寫操作,所以我們需要將R/W引腳置低;
做好寫數據之前的準備工作:先將E引腳置低,然后將要寫的內容(一個字節數據),發送至DB0~DB7上;
封裝的改變DB0~DB7的函數如下:
void WriteData(u8 data) {GPIO_WriteBit(GPIOA, GPIO_Pin_6,(BitAction)((data & 0x80) >> 7 )); //D7GPIO_WriteBit(GPIOA, GPIO_Pin_0,(BitAction)((data & 0x40) >> 6 )); GPIO_WriteBit(GPIOC, GPIO_Pin_3,(BitAction)((data & 0x20) >> 5 )); GPIO_WriteBit(GPIOC, GPIO_Pin_2,(BitAction)((data & 0x10) >> 4 )); GPIO_WriteBit(GPIOC, GPIO_Pin_1,(BitAction)((data & 0x08) >> 3 )); GPIO_WriteBit(GPIOC, GPIO_Pin_0,(BitAction)((data & 0x04) >> 2 )); GPIO_WriteBit(GPIOC, GPIO_Pin_13,(BitAction)((data & 0x02) >> 1 )); GPIO_WriteBit(GPIOB, GPIO_Pin_9,(BitAction)(data & 0x01)); //DB0 }綜上所述,發送命令和數據的函數封裝如下:
/* 向LCD1602液晶寫入一字節命令,cmd-待寫入命令值 */ void LCD1602_Write_Cmd(u8 cmd) {LCD_RS_Clr();LCD_RW_Clr();LCD_EN_Clr();WriteData(cmd);LCD_EN_Set();delay_ms(5);LCD_EN_Clr(); }/* 向LCD1602液晶寫入一字節數據,dat-待寫入數據值 */ void LCD1602_Write_Dat(u8 dat) {LCD_RS_Set();LCD_RW_Clr();LCD_EN_Clr();WriteData(dat);LCD_EN_Set();delay_ms(5);LCD_EN_Clr(); }因為要讓LCD1602顯示內容,只需要往LCD1602發送數據即可,即只需要完成寫操作,不需要讀操作,所以我們只需要封裝上面寫指令和寫數據兩個函數即可,未封裝讀操作的函數。
LCD內部資源及顯示原理
LCD1602內部提供了較為豐富的指令設置,比如:清顯示(清屏)、光標回原點、顯示開/關、光標開/關、顯示字符閃爍、光標移位、顯示移位等指令。
通過選擇相應的指令設置,用戶可以實現多種字符顯示樣式。
部分指令列表
清屏指令
查看上面指令表,我們可以知道清屏操作,只需要發送指令0x01即可。
利用上面封裝的寫指令void LCD1602_Write_Cmd(u8 cmd) 函數,我們封裝清屏操作函數如下:
/* 清屏 */ void LCD1602_ClearScreen(void) {LCD1602_Write_Cmd(0x01); }發送此指令,DDRAM(display data RAM)中的內容全部清除,顯示消失;地址計數器AC=0,自動增1模式;顯示歸位,光標或者閃爍回到原點(顯示屏左上角),但并不改變移位設置模式。
設置顯示RAM起始地址
要顯示字符,首先要設定顯示的地址,即告訴LCD1602在哪里顯示字符,查找LCD1602數據手冊,我們知道內部顯示地址(DDRAM)如下:
如果要顯示在第一行,第一個字符的位置,那么其地址就是0x00,
要顯示在第二行,第一個字符位置,那么其地址就是0x40。
具體對應關系如下:
顯示RAM起始地址,即光標位置,封裝函數如下:
/* 設置顯示RAM起始地址,亦即光標位置,(x,y)-對應屏幕上的字符坐標 */ void LCD1602_Set_Cursor(u8 x, u8 y) {u8 addr;if (y == 0)addr = 0x00 + x;elseaddr = 0x40 + x;LCD1602_Write_Cmd(addr | 0x80); }液晶顯示字符串函數
要想顯示具體的內容,就要先設置在液晶上顯示的位置,即調用上面的函數void LCD1602_Set_Cursor(u8 x, u8 y) ,利用其設定顯示的坐標位置,然后調用寫數據函數void LCD1602_Write_Dat(u8 dat) ,這樣就完成了待顯示字符的寫入。
/* 在液晶上顯示字符串,(x,y)-對應屏幕上的起始坐標,str-字符串指針 */ void LCD1602_Show_Str(u8 x, u8 y, u8 *str) {LCD1602_Set_Cursor(x, y);while(*str != '\0'){LCD1602_Write_Dat(*str++);} }比如我們想要在液晶屏第二行顯示小哈哥的個人網站的網址:www.xiaohage.com,需要的代碼如下:
LCD1602_Show_Str(0, 1, "www.xiaohage.com");這里為什么寫入字符’1’,LCD1602正好可以顯示1呢?因為在LCD1602內部有這樣一個CGROM和CGRAM中字符代碼與字符圖形對應關系表:
上圖即為CGROM表,表的最左邊一列為允許用戶自定義字模的CGRAM空間。
表的橫行是其高4位地址,表的列是其低4位地址。
如果要顯示字符’1’,對應的十六進制為0x31,即高四位為0011,低四位為xxxx0001,組合一起即為要顯示內容的位置,具體如上表中框選位置。
再對照ASCII碼表,發現二者是一一對應的,所以我們直接發送ASCII碼,即可對應其實際的字符。
初始化LCD1602
/* 初始化1602液晶 */ void LCD1602_Init(void) {LCD1602_Write_Cmd(0x38); //16*2顯示,5*7點陣,8位數據口delay_ms(5);LCD1602_Write_Cmd(0x0c); //開顯示,光標關閉delay_ms(5);LCD1602_Write_Cmd(0x06); //文字不動,地址自動+1delay_ms(5);LCD1602_Write_Cmd(0x01); //清屏delay_ms(5); }結果展示
總的來說,LCD1602的驅動還是挺簡單的,液晶屏的單價也不貴,唯一的缺點就是不能顯示中文,至于選取哪種液晶屏,各位可以根據需要自由選取哈。
資料獲取
微信公眾號【嵌入式從0到1】后臺回復“LCD1602”,可以下載本文對應的工程源碼。
推薦閱讀
STM32驅動0.96寸OLED液晶屏
OLED液晶屏如何顯示中文呢?
4位數碼管顯示模塊驅動
8X8點陣實現電梯運行效果
STM32串行通信模式驅動LCD12864,結合手冊從原理讓你理解顯示過程
基于鴻蒙OS移植OLED驅動程序
歡迎關注
一個專注于嵌入式知識分享,學習路上不迷路的公眾號,歡迎關注。
想加技術交流群的,可以加我微信【chengxuyuanxiaoha】,讓我拉你進群。
我有一個想法
最近臨近畢業,很多兄弟都在準備畢業答辯,有各種各樣的問題要咨詢,我在想能不能搞個直播,現場回答各位問題給大家呢?這樣也能提高一下效率。
如果大家支持小哈哥來個直播,文末點個贊,讓我看看有多人能捧場。
人多的話,周末就搞起!~
總結
以上是生活随笔為你收集整理的STM32驱动LCD1602,哪位同学需要的,来了的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《Adobe Fireworks CS5
- 下一篇: 从零开始的单片机学习(一)