电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
STM32串行通信模式驱动LCD12864,结合手册从原理让你理解显示过程
分 享
扫描二维码分享
STM32串行通信模式驱动LCD12864,结合手册从原理让你理解显示过程
LCD12864
液晶显示
嵌入式从0到1
关注
发布时间: 2020-07-24
丨
阅读: 3831
常见的人机交互界面,除了数码管、LED、LCD1206,OLED,Nokia5110以外,比较常用的还有LCD12864。 LCD12864从字面意思就是横向可以显示128个像素点,纵向可以显示64个像素点。常见的LCD12864液晶模块分为带字库版本和不带字库版本,一般为了使用方便,直接选用带中文字库版本即可。 ### 引脚定义 本文使用的是串行通信模式,下面仅介绍跟串行通信相关的引脚: | 管脚号 |管脚名称 | 管脚功能描述 | | :---: | :---: | :--- | | 1 | VSS | 电源地 | | 2 | VDD | 电源电压 | | 3 | VO | 对比度(清晰度)调整 | | 4 | RS(CS) | 串行通信模式时为片选,高电平有效 | | 5 | R/W(SID) | 串行通信模式时数据输入引脚| | 6 | E(CLK) | 串行同步时钟,上升沿时读取SID数据 | | 15 |PSB | 选择芯片与MCU通讯的接口形式:PSB=0,3线SPI串口通信模式 | | 17 | /RESET | 复位信号,低电平复位 | | 18 | VOUT | 当模块电压是3.3V时,此脚输出一个大约+4.6V的电压 | | 19 | BLA | 背光板电源正 | | 20 | BLK | 背光板电源负 | 本次实例选用的LCD12864背部如下所示,显示的型号为:**12864J-3 V1** ![](https://cf05.ickimg.com/bbsimages/202008/e7253c54cf9868b304b6e42335f0a396.png) ### 原理图 ![](https://cf05.ickimg.com/bbsimages/202008/7d91d7aa2a846caa8ca76ff63fff67b2.png) **具体连接情况:** **引脚1** VSS 电源负极,接地 **引脚2** VDD 电源正极,接3.3V(注意自己所选的LCD12864是否支持3.3V) **引脚3** VO 调节屏幕对比度(模组背部自带可调电位器VR1),JP40与18脚VOUT相连 **引脚4[PA8]** CS 片选引脚,高电平时可接受数据,低电平锁存数据 **引脚5[PC9]** SID 串行数据输入端 **引脚6[PC8]** CLK 串行同步时钟 **引脚15** PSB 低电平时为串行模式(在有的液晶屏背部,可以通过焊锡短接设置为默认模式为串行模式),跳线与GND相连 **引脚17** RESET 复位引脚,低电平可使LCD复位 **引脚19** A LCD背光源的电源 **引脚20** K LCD背光源的地 ### 串行模式时序图分析 ![](https://cf05.ickimg.com/bbsimages/202008/19764a7fb874c56bedc159eaaf67e2d7.png) **串行模式下传输一个字节数据过程** 1. 数据传输过程中,片选CS引脚置高,此期间LCD可接受数据或指令; 2. 随后,单片机端(STM32)要给出同步位串:'11111',5个连续的“1”作数据起始位; 3. 接下来一位为:RW,用于选择数据的传输方向,1是读数据,0是写数据,H 表示数据从 LCD 到 MCU,L 表示数据从 MCU 到 LCD; 4. 接下来一位为:RS,用于选择内部数据寄存器或指令寄存器,0是命令寄存器,1是数据寄存器; 5. 第一字节的最后位(第8位)固定为“0”; 6. 第一个字节传输完成之后,开始正式传输指令或者数据,在传输过程中会进行拆分处理,该字节指令或者数据将被分为2个字节来传输; 7. 第二个字节的高4位为待传输数据的高4位(D7-D4),低4位用0填充; 8. 第三个字节的高4位为待传输数据的低4位(D3-D0),低4位用0填充; 9. 经过上面几步,完成一个字节指令或数据的传送。 (D7-D0) > 比如说你想发送的**数据**为“0”,对应16进制0x30,对应二进制 0011 0000 那么发送的顺序就是: > 1) 先发送0xFA (11111 010) ==> 五个1,RW=0,RS=1 > 2) 发送**0011** 0000 ==> 高四位为数据“0”的高四位,低4位补0 > 3) 发送**0000** 0000 ==> 高四位为数据“0”的低四位,低4位补0 > 到此一个字节发送完成。 > 所以写指令之前,必须先发送 11111 000 (即0xF8); > 写数据之前,必须先发送 11111 010 (即0xFA) 综上所述,发送命令和数据的函数封装如下: ```C void WriteCommand(uchar Cbyte ) { GPIO_SetBits(LCD_CS); delay_ms(1); SendByte(0xF8); //11111,RW(0),RS(0),0 SendByte(0xF0&Cbyte); //高四位 SendByte(0xF0&Cbyte<<4); //低四位(先执行<<) GPIO_ResetBits(LCD_CS); delay_ms(2); } void WriteData(uchar Dbyte ) { GPIO_SetBits(LCD_CS); delay_ms(1); SendByte(0xFA); //11111,RW(0),RS(1),0 SendByte(0xF0&Dbyte); SendByte(0xF0&Dbyte<<4); GPIO_ResetBits(LCD_CS); delay_ms(2); } ``` ![](https://cf05.ickimg.com/bbsimages/202008/c4ee3f070730facf5143debef6e6bc67.png) 10. 完成一个字节数据的发送需要24个时钟周期(CLK引脚发送24个同步时钟信号),发送一个字节的有效数据实际上发送了3个字节; 11. 只有在时钟线SCLK拉低时,数据线SID上的数据才允许变化,在时钟线SCLK高电平时,SID上的数据必须保持稳定(不能变化)。即在低电平的时候改变数据,上升沿的时候模块读取SID数据。 ### LCD内部资源及显示原理 * 设置命令为基本指令集 LCD的控制芯片为ST7920,每次执行新的命令之前,一般需要先发送一个0x30。 ```C WriteCommand(0x30); ``` 对应手册中下面位置: ![](https://cf05.ickimg.com/bbsimages/202008/a10ac405b922b7f01b12f73f382fbde2.png) 由上我们知道0x30对应着基本指令集。 * 设定显示地址 ```C WriteCommand(TABLE[8*row+col]); ``` 其中TABLE内容如下: ```C uchar 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, //第四行 }; ``` 此表格中的数值来自于手册中如下位置: ![](https://cf05.ickimg.com/bbsimages/202008/352bdd88ba40c0076037e9ef24e7371a.png) 由上面的分析之后,封装显示字符或者汉字的函数如下: ```C /@@*! * @brief 显示字符或汉字 * @param row: row(0~3) * @param col: line(0~7) * @param str: 要显示的字符或汉字 */ void LCD_Display_Words(uchar row,uchar col,uchar *str) { WriteCommand(0x30); WriteCommand(TABLE[8*row+col]); while(*str != '\0') { if(col==8) { col=0; row++; } if(row==4) row=0; WriteCommand(TABLE[8*row+col]); WriteData(*str); str++; WriteData(*str); str++; col++; } } ``` 我们使用上面的函数打印输出一个汉字进行测试: ```C LCD_Display_Words(0,0,(u8 *)"哈"); ``` 将WriteData的数据通过串口打印输出: ![](https://cf05.ickimg.com/bbsimages/202008/b1a75b5847fda9729adf90547fe83462.png) 我们可以在串口助手中看到打印的数据为:“B9 FE”,具体的结果如下: ![](https://cf05.ickimg.com/bbsimages/202008/4874c8b6c0e8d91ed76ff430221f14df.png) ![](https://cf05.ickimg.com/bbsimages/202008/2c28c2726e2f1972c2e6191be4dee091.png) 对应手册中字库,可以发现“哈”的编码即是“B9 FE”,由上我们知道了,为什么直接使用LCD_Display_Words函数输出汉字,就能够在LCD12864上显示出对应的汉字。 ### 结果展示 ![](https://cf05.ickimg.com/bbsimages/202008/2657563af616e480c988532d91e631aa.png) ### 资料获取 微信公众号后台回复“**LCD12864**”,可以下载本文对应的工程源码。 ![](https://cf05.ickimg.com/bbsimages/202008/adbe6d234303d4c6467df37b3d1063d9.png)
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
嵌入式从0到1
关注
评论
(1)
登录后可评论,请
登录
或
注册
江湖老李
282
天前...
看到就是学到,学到就是赚到
0
回复
发布
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交