日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

3.在LCD12864上显示属于你的文字

發布時間:2024/8/1 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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基令,下面是數據手冊上對應的的指令表

對應的操作為:

LCD12864_Write_Cmd_Data(CMD,0x30);//基本指令

2.顯示狀態開關


一般配置為 0X0C :顯示器開,光標關閉

LCD12864_Write_Cmd_Data(CMD,0x0C);

3.進入設定點

地址加1,數據不移動,地址移動:0X06

I/D:寫入新數據后光標移動方向,高電平右移,低電平左移,
S:寫入新數據后顯示屏字符是否整體左移或右移一個字符,高電平表示有效,低電平表示無效

LCD12864_Write_Cmd_Data(CMD,0x06);

4.清除顯示(0X01)


至此我們就完成了所有指令的編寫

LCD12864_Write_Cmd_Data(CMD,0x30);//基本指令 LCD12864_Write_Cmd_Data(CMD,0x0C);//開機顯示不顯示光標 LCD12864_Write_Cmd_Data(CMD,0x06); LCD12864_Write_Cmd_Data(CMD,0x01);//清屏

5.漢字顯示


由此,我們只需創建一個數組,并寫一個顯示函數即可,其代碼如下:

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, }; /* 顯示字符或漢字row: row(0~3)col: line(0~7) str: 要顯示的字符或漢字*/ 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++; } }

五.結語

創作不易,如果有用的話,給個點贊,什么問題評論留言,謝謝大家!
好的,一起來看看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上显示属于你的文字的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。