3.在LCD12864上显示属于你的文字
- 一. LCD12864簡介記錄
- 1.LCD12864B V2.0的實物圖
- 二.引腳定義
- 1.原理圖
- 2.串行引腳連接
- 三.串行通信時序圖
- 1. 串行模式下傳輸一個字節過程
- 2.舉例
- 四. LCD內部資源及顯示原理
- 1.基本指令
- 2.顯示狀態開關
- 3.進入設定點
- 4.清除顯示(0X01)
- 5.漢字顯示
- 五.結語
一. LCD12864簡介記錄
大家好,我是DW,剛開始學習STM32單片機,隨手記錄學習的過程,每天進步依點點吧,加油,奧利給!!
LCD12864是一種具有4位/8位并行、2線或三線串行多種接口方式,內部含有國際一級、二級簡體中文字庫的點陣圖形液晶顯示模塊;其顯示分辨率為128X64,內置8192個1616點漢字,和128個168點ASCII字符集,利用該模塊靈活的接口方式和簡單方便的操作指令,可構成全中文人機交互圖形界面可以顯示8X4行16X16點陣的漢字,也可以完成圖形顯示。
LCD12864從字面意思就是橫向可以顯示128個像素點,縱向可以顯示64個像素點。LCD12864液晶模塊分為帶字庫版本和不帶字庫版本,本實驗選用的是3.3V帶中文字庫版本。
1.LCD12864B V2.0的實物圖
二.引腳定義
1.原理圖
2.串行引腳連接
1.GND
2.3.3V
3.VO不連接
4.RS–PB6
5.R/W–PB7
6.EN–PB8
15.PSB–GND(拉低為串行,拉高為并行)
17.RST–PC13(復位按鍵)
19.BLA–3.3V
20.GND
補充:
VO引腳可以調節屏幕對比度,LCD背部自帶可調電位器VR1,本實驗直接調節VR1,不外接可調電阻。
PSB串并行調節選擇,串行方式直接將該引腳接地即可
三.串行通信時序圖
1. 串行模式下傳輸一個字節過程
(1)CS為片選信號,先將CS拉高,LCD可以接收數據或者指令;
(2)一個時鐘脈沖對應一個高位,SID前五個“1”為控制字符
寫數據: RW=0,RS=0;寫指令: RW=0,RS=1,最后一位保留0
(3)其次,當對LCD進行寫指令時 CMD=0xf8(11111 000);寫數據時 DAT=0xfa(11111 010) ;
(4)最后,數據拆開兩組來發,第一組發的是高位,第二組發的是低位;高4位先出,之后右移4位,把低4位數據寫進去;(當CS=1時,數據同步到數據總線上)
2.舉例
比如你想發送的數據為“1”,對應二進制為0011 0001,那么發送的順序就是:
(1).因為是數據,所以先發送 0xfa (11111 010);
(2).發送0011 0001 分為兩組:
第一組:高四位為數據“1”的高四位(0011),低4位補0 (0000), 發送的數據為:0011 0000;
第二組:右移四位,高四位為數據“0”的低四位(0001),低4位補0(0000), 發送的數據為:0001 0000;
到此一個字節發送完成。
寫指令之前,必須先發送 11111 000 (即0xF8);
寫數據之前,必須先發送 11111 010 (即0xFA).
所以,發送數據和命令的代碼如下:
void SendByte(u8 data) { CS_HIGH;//CS先拉高for(u8 i=0;i<8;i++) { ((data<<i)&0x80) ? DATA_HIGH:DATA_LOW;//移位+判斷高位 //一個時鐘脈沖對于一個高位CLK_LOW; CLK_HIGH;} CS_LOW;//釋放CS } void LCD12864_Write_Cmd_Data(u8 cmd,u8 data){SendByte(cmd);SendByte(data&0xf0);SendByte((data<<4)&0xf0);//分兩次輸送數據完畢delay_ms(2);//此處加上延時,其他地方可以不加延時 }(3).由時序圖可以知道,完成一個字節數據的發送需要24個時鐘周期,發送一個字節的有效數據實際上發送了3個字節
(4).在時鐘線CLK拉低時,數據線SID上的數據才允許變化,在時鐘線CLK拉高時,SID上的數據必須保持穩定
四. LCD內部資源及顯示原理
LCD的控制芯片為ST7920 ,ST7920有豐富的內部資源,里面也有許許多多的指令,讓人看得眼花繚亂,我就說幾個本實驗用到的指令,其他的指令用到了再去學習也不晚。
1.基本指令
當我們在寫指令時需要先寫入0X30基令,下面是數據手冊上對應的的指令表
對應的操作為:
2.顯示狀態開關
一般配置為 0X0C :顯示器開,光標關閉
3.進入設定點
地址加1,數據不移動,地址移動:0X06
I/D:寫入新數據后光標移動方向,高電平右移,低電平左移,
S:寫入新數據后顯示屏字符是否整體左移或右移一個字符,高電平表示有效,低電平表示無效
4.清除顯示(0X01)
至此我們就完成了所有指令的編寫
5.漢字顯示
由此,我們只需創建一個數組,并寫一個顯示函數即可,其代碼如下:
五.結語
創作不易,如果有用的話,給個點贊,什么問題評論留言,謝謝大家!
好的,一起來看看LCD的顯示吧
附件
//lcd12864.c #include "LCD12864.h" #include "delay.h" #define CMD 0XF8 #define DAT 0XFA u8 const TABLE[]= { 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f, 0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f, }; void SendByte(u8 data) { CS_HIGH;for(u8 i=0;i<8;i++) { ((data<<i)&0x80) ? DATA_HIGH:DATA_LOW;//移位+判斷高位 為真寫1 反之寫0 CLK_LOW; CLK_HIGH;} CS_LOW; } void LCD12864_Write_Cmd_Data(u8 cmd,u8 data){SendByte(cmd);SendByte(data&0xf0);SendByte((data<<4)&0xf0);//分兩次輸送數據完畢delay_ms(2);//此處加上延時,其他地方可以不加延時 } void LCD_GPIO_Config(void) {GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);//PB6 PB7 PB8GPIO_InitStructure.GPIO_Pin = CS|DATA|CLK;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(LCD_PROT, &GPIO_InitStructure);//復位鍵PC13GPIO_InitStructure.GPIO_Pin = LCD_RST;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(RST_PROT, &GPIO_InitStructure); } void LCD_Init(void) {//復位刷新LCD_GPIO_Config(); GPIO_ResetBits(RST_PROT,LCD_RST); GPIO_SetBits(RST_PROT,LCD_RST); LCD12864_Write_Cmd_Data(CMD,0x30);//基本指令LCD12864_Write_Cmd_Data(CMD,0x0C);//開機顯示不顯示光標LCD12864_Write_Cmd_Data(CMD,0x06);LCD12864_Write_Cmd_Data(CMD,0x01);//清屏 } /*! * @brief 顯示字符或漢字* @param row: row(0~3)* @param col: line(0~7) * @param str: 要顯示的字符或漢字*///改動處 2022/4/8 void LCD_Display_Words(u8 row,u8 col,u8 *str) { LCD12864_Write_Cmd_Data(CMD,TABLE[8*row+col]);//光標位置while(*str>0){ LCD12864_Write_Cmd_Data(DAT,*str); //寫數據str++; } } //lcd12864.h #ifndef __LCD12864A_H #define __LCD12864A_H#include "sys.h"//此處更改對應引腳即可,其他地方不需要更改 //片選 PB6 PB7 PB8 #define CS GPIO_Pin_6 //RS #define DATA GPIO_Pin_7 //R/W #define CLK GPIO_Pin_8 //E #define LCD_PROT GPIOB//復位 更改對應復位引腳 #define LCD_RST GPIO_Pin_13 #define RST_PROT GPIOC//片選 #define CS_HIGH GPIO_SetBits(LCD_PROT,CS) #define CS_LOW GPIO_ResetBits(LCD_PROT,CS)//數據 #define DATA_HIGH GPIO_SetBits(LCD_PROT,DATA) #define DATA_LOW GPIO_ResetBits(LCD_PROT,DATA)//時鐘 #define CLK_HIGH GPIO_SetBits(LCD_PROT,CLK) #define CLK_LOW GPIO_ResetBits(LCD_PROT,CLK)void SendByte(u8 Dbyte); void LCD_GPIO_Config(void); void LCD_Init(void); void LCD12864_Write_Cmd_Data(u8 cmd,u8 data); void LCD_Display_Words(u8 row,u8 col,u8 *str);#endif //main.c #include "sys.h" #include "delay.h" #include "LCD12864.h"int main(void){delay_init();LCD_Init(); LCD_Display_Words(0,0,(u8 *)"花間一壺酒");LCD_Display_Words(1,0,(u8 *)"獨酌無雙親"); LCD_Display_Words(2,0,(u8 *)"舉杯邀明月");LCD_Display_Words(3,0,(u8 *)"對影成三人");while(1); }總結
以上是生活随笔為你收集整理的3.在LCD12864上显示属于你的文字的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数字信号处理基础知识
- 下一篇: 软件工程 毕业论文 文献引用 中英文文献