STM32 LCD12864 串行通信模式

发布者:Yuexiang最新更新时间:2020-08-24 来源: eefocus关键字:STM32  LCD12864  串行通信模式 手机看文章 扫描二维码
随时随地手机看文章

lcd12864简介

带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64,内置8192个16*16点汉字,和128个16*8点ASCII字符集。利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示8×4行16×16点阵的汉字。也可完成图形显示。低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。


注:

我们所用的LCD屏的命名,基本都是按照其分辨率来进行命名的  比如lcd1602  就是分辨率为16×2  lcd128128 就是分辨率为128×128

《C语言运算符与操作符的用法全面汇总(非常有用)》

 将字符“A”的低四位清零 保留高四位   可以做“A”&240( 0xf0)

    0100 0001‬——————“A”的二进制数

   1111 0000‬——————240的二进制数

    ------------------

   0001 0000                            保留了“A”的高四位

 将字符“A”的低四位变为高四位 可以用<<(左移运算符)  A<<4

    0100 0001‬——————“A”的二进制数 

    0001 0000 ‬——————保留了“A”的低四位

 

6 完成一个字节数据的发送需要24个时钟周期 因为1个字节实际是发送了3个字节 (3x8)

7.只有在时钟线SCLK拉低时,数据线SID上的数据才允许变化,在时钟线SCLK高电平时,SID上的数据必须保持稳定(不能变化)

这点与IIC是相同的

LCD内部资源/显示原理

  LCD的控制芯片为ST7920 ,ST7920有丰富的内部资源,并且内部的ROM已经固化存储了中文字库,半角英文/数字字符

也就是自带中文字库

ST7920的内部资源:

提供8 位,4 位并行接口及串行接口可选

自动电源启动复位功能

内部自建振荡源

1、ST7920 内部固化了8192 个16×16 点阵的中文字型在CGROM(2M 位中文字型ROM)里。
2、固化有126 个16*8 点阵的半角英文/数字字符(ASCII)在HCGROM里。

3、提供4个16×16点阵自造字符的存储空间CGRAM(字形产生RAM)。
4、提供128×64的点阵绘图共1024个字节的存储空间GDRAM(点阵绘图RAM)。
5、提供1个16×15点阵图标的存储空间IRAM(ICON RAM)

6、64×16 位字符显示RAM (DDRAM 最多16 字符×4 行)

 

那么在LCD上显示字符或者汉字是怎么实现的呢:

LCD显示原理:

作为字符显示,在控制器内有个供写入字符代码的缓存器DDRAM ,你只要将要显示的中文字符编码或其他字符编码写入DDRAM(显示数据),也就是串行模式下发送一个字节数据,硬件将依照编码自动从CGROM(2M 中文字型ROM)    HCGROM(16K ASCII码ROM)   CGRAM(自定义字形RAM)三种字形中自动辨别选择对应的是那种字形的哪个字符/汉字编码,再将要显示的字符/汉字编码显示在屏幕上。

也就是字符显示是通过将字符显示编码写入字符显示RAM(DDRAM )实现的

模块内部的RAM提供64×16的显示空间 ,最多可以显示4行8字(32个汉字)或64个ASCII码字符的显示       一个汉字2个字节

DDRAM一共有32个字符显示区域,当然,字符显示的RAM的地址与32个字符显示区域有着一一对应的关系

字符显示时,DDRAM地址与液晶屏的位置:

通过写入不同的地址,就可以实现字符显示的不同位置

 

LCD控制指令

LCD12864提供了两套控制命令,分别为基本指令和扩展指令    ,涉及到了LCD的清屏,开关,显示字符位置等等

其实也就是向LCD写入特殊字符而已    ,根据RS和RW可以判断指令方式

下面我们介绍几个常用的:

1清屏 

  清除屏幕字符  ,也就是对整块屏幕写入空字符 并且将游标移到开始位置   在使用清屏时,需要加上一定的延时等待液晶稳定

RS  RWD7 D6 D5 D4 D3 D2 D1 D0
0  00000 0001

2显示状态开关

其中第6位置1打开显示,第7位与第8位对应游标相关设置  一般配置为 0X0C //显示器开,光标关闭,不反白

RS  RWD7 D6 D5 D4 D3 D2 D1 D0
0  00 0 0 0 1 1/0 1/0 1/0

3功能设定

DL = 0/1 : 4/8位数据    我们是使用8位 所以为1     RE=1时,使用扩充指令集,RE=0时,使用基本指令集,我们正常使用基本指令集  所以RE需要为0         一般配置为 0X30 //  基本指令集 8bit数据流

RS  RWD7 D6 D5 D4 D3 D2 D1 D0
0  00 0 1 1/0 任意 1/0 任意 任意

4游标功能设置

进入点设定   :   是表示在写入或者读取的时候,游标相对于上一个位置的移位  不设置即默认对地址加1(移1位)  如果你想要字符之间有空隙  可以修改移位

游标的位置移动设置,写入相对应的数据即可改变游标位置,实现LCD界面的书写, 32个字符显示区域对应32个地址

5读取BF忙标志和地址

忙标志BF:

BF标志提供内部工作状况,BF=1表示模块内部正在进行操作,此时模块不接受指令和数据. BF=0 模块为准备接受状态,可以接受指令和数据

6读/写数据

就是进行数据的读写,

写数据:

RS  RWD7 D6 D5 D4 D3 D2 D1 D0
1  08bit数据

 

读数据:

RS  RWD7 D6 D5 D4 D3 D2 D1 D0
1  18bit数据

7 CGRAM(自定义字形RAM)设置

设定该地址即可自定义字形编码,在显示图片时会先将图片编码写入这里,然后再读它进行显示

 

LCD初始化

我们把它分为6步分别讲解

  • 1.在开电之后,首先要等待40ms以上,等待液晶自检,使LCD系统复位完成

  • 2. 之后便是功能的设定  选择基本指令集或者扩充指令集  随后延时等待100us以上

  • 3. 功能设定2   选择8bit数据流 或者 4bit数据流  随后延时37us以上

  • 4. 开关显示  是否打开显示开关          随后延时100us以上

  • 5.清屏  清空RAM并初始化光标位置    随后延时10us以上

  • 6. 进入模式选择  也就是设定游标相对于上一个位置的移位 默认为地址自动+1  

之后初始化完成,可以对LCD进行数据的写入或读取

当然第二步与第三布写入数据是相同的,可以只写一次然后延时137us以上也可

LCD图片显示

 

LCD12864在地址的排列上是分为上、下半屏来显示的,上半屏横向的列地址(X)是0-7(00h-07h),下半屏的列地址是8-15(08h-0fh)。而每个一地址都可写入两个字节的内容,它们是按高位在前低位在后排列的。垂直方向上的地址(Y)上半屏是0-31(00h-1fh),下半屏的Y地址仍是0-31(00h-1fh)   

   也就是一幅图片写入时垂直坐标Y要写64次 (上下屏)   水平横向坐标X要写8次

在每两个字节写入后时候就要重新设置垂直地址,再设置水平地址(连续写入两个字节确定X,Y地址)  然后再写图片的正常编码  这样便可以实现一幅图像的写入     简单说就是对每个位置写入图片的相对于位置的编码

图片显示的步骤

1切换到扩充指令
2 关闭绘图显示功能


3 先将垂直的坐标(Y)写入CGRAM地址
4 再将水平的位元组坐标(X)写入CGRAM地址
5 将高位字节D15-D8写入RAM中
6 将低位字节D7-D0写入到RAM中

重复3-6步,完成图片各个部分的写入  先写上半屏,再写下半屏

7 打开绘图显示功能                                                                                                                                                                          8切换回基本指令

其实也就是先打开CGRAM(自定义字形RAM) 然后把定义好的图片编码写入CGRAM  然后再对DDRAM正常写入该图片编码, 这时硬件将依照编码从CGRAM(自定义字形RAM)读取之前写入的图片编码,然后显示该图片

具体看代码即可

注意事项:

用带中文字库的128X64显示模块时应注意以下几点:

 PS: 图片显示之后需要加上延时,否则会持续写入,不会有图片显示

     图片写入CGRAM(自定义字形RAM)时必须要先写垂直地址坐标,再写水平地址坐标

①欲在某一个位置显示中文字符时,应先设定显示字符位置,即先设定显示地址,再写入中文字符编码。

②显示ASCII字符过程与显示中文字符过程相同。不过在显示连续字符时,只须设定一次显示地址,由模块自动对地址加1指向下一个字符位置,否则,显示的字符中将会有一个空ASCII字符位置。

③当字符编码为2字节时,应先写入高位字节,再写入低位字节。

④模块在接收指令前,向处理器必须先确认模块内部处于非忙状态,即读取BF标志时BF需为“0”,方可接受新的指令。如果在送出一个指令前不检查BF标志,则在前一个指令和这个指令中间必须延迟一段较长的时间,即等待前一个指令确定执行完成。指令执行的时间请参考指令表中的指令执行时间说明。

⑤“RE”为基本指令集与扩充指令集的选择控制位。当变更“RE”后,以后的指令集将维持在最后的状态,除非再次变更“RE”位,否则使用相同指令集时,无需每次均重设“RE”位。

关键字:STM32  LCD12864  串行通信模式 引用地址:STM32 LCD12864 串行通信模式

上一篇:【STM32】STM32驱动 LCD12864程序代码(串行方式)
下一篇:STM32系统学习——RCC(使用HSE/HSI配置时钟)

推荐阅读最新更新时间:2024-11-11 22:40

STM32蜂鸣器-库函数
需要注意的是,使用了库函数的模板就不能胡乱套用寄存器的操作,之前还想放个大招结果出丑了,这里的实验要求是绿灯亮,蜂鸣器响,红灯亮,蜂鸣器停止,蜂鸣器响起间隔半秒,led的文件我这里就不给出了,主要放出beep的文件吧,这里操作的是PF8口。 1.beep.h #ifndef __BEEP_H #define __BEEP_H #include sys.h #define BEEP PFout(8) void beep_init(void); #endif 2.beep.c #include beep.h void beep_init() { GPIO_InitTypeDef GPIO_InitS
[单片机]
STM32八路ADC采用DMA方式
STM32八路ADC采用DMA方式 采集的数据如下 程序打包地址 有DMA方式和非DMA 方式 https://download.csdn.net/download/qq_36958104/11352188 #include adc.h #include sys.h #define ADC1_DR_Address ((u32)0x4001244C) __IO u16 ADC_ConvertedValue; /*配置采样通道端口 使能GPIO时钟 设置ADC采样PA0端口信号*/ void ADC1_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitS
[单片机]
STM32应用与存储位置无关
1、前言 最近有客户询问,能否使用 STM32CubeIDE 在编译时通过设置某个编译选项,让STM32 应用与存储位置无关。这样的优势是能使同一个固件被烧在 STM32 Flash 里的不同位置, 而在系统 Bootloader 里只需要跳到相应的位置就可以正常执行固件代码。客户希望STM32 代码从 Flash 里执行,不复制到 RAM 里;客户希望是一个完整的映像,而不仅仅是其中某个函数做到了位置无关。 2、分析 在嵌入式场景下,不一定有操作系统。即使有操作系统,一般也是 RTOS。一般 RTOS没有一个通用的程序加载器。因此,存储位置无关的需求,在这时可以说无关紧要。但是,如果客户需要进行在线固件更新,例如 IoT 应
[单片机]
让<font color='red'>STM32</font>应用与存储位置无关
基于FPGA和STM32的FSMC通信
1、FSMC简介:FSMC即灵活的静态存储控制器,FSMC管理1GB空间,拥有4个Bank连接外部存储器,每个Bank有独立的片选信号和独立的时序配置;支持的存储器类型有SRAM、PSRAM、NOR/ONENAND、ROM、LCD接口(支持8080和6800模式)、NANDFlash和16位的PCCard。 2、在设计中将FPGA当做SRAM来驱动,使用库函数来实现FSMC的初始化配置代码如下: //初始化外部SRAM void FSMC_SRAM_Init(void) { FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure; //定义FSMC初始化的结构体变量 FS
[单片机]
STM32 24C02函数 I2C例程 非STM32库方式
#define ADDR_24CXX 0xA0 void I2C_24CXX_Write(u16 nAddr, u8* pDat, u16 nLen) { u16 i = 0; /* Enable I2C1 acknowledgement if it is already disabled by other function */ //I2C_AcknowledgeConfig(I2C1, ENABLE); STM32_I2c1_Regs- cr1.bit.ACK=1; // ACK:应答使能 1:在接收到一个字节后返回一个应答(匹配的地址或数据) /* Send I2C1 START condition */ //
[单片机]
ST全新多合一软件工具 让STM32用户烧写代码更方便
中国,2017年12月22日 -- 意法半导体 STM32CubeProgrammer (STM32CUBEPROG) 软件工具,在一个统一的多平台的用户可配置的环境内,为用户提供 STM32 微控制器代码烧写和固件升级功能。 STM32CubeProgrammer支持Windows®、Linux、MacOS® 三大操作系统,可以使用各种文件格式向STM32微控制器内部闪存/RAM或外部存储器烧写代码。具体功能包括存储器整体或扇区擦写选项字节。用户还可以生成程序安全烧写(固件安全安装更新)功能所需的加密文件,验证生产线上安装的软件的真伪,保护知识产权。 有了这个通用工具后,用户烧写 STM32微控制器 既可使用片上SWD
[嵌入式]
ST全新多合一软件工具 让<font color='red'>STM32</font>用户烧写代码更方便
STM32中0x1u 0u的含义
今天见到这种函数,查了一些他们的含义 后缀就是告诉编译器该常数的属性。 默认为有符号INT型,加了u就是无符号的,加了l就是long型。 做下移位就知道结果了。以0x80为例,左移次数过多编译器会提示你符号位被改变,即负数被移位成正数。加个u的话就被编译器识别为无符号数,可以随意移位。不会影响符号位。 例如: C语言里面0x8000000000000000u这样的常数一律默认为int型,不是什么字节。至于int型是4字节还是2字节那就是编译器的问题了。加u尾缀并不会扩展常数占用的字节数,加ul才会从int型长度扩展成long型长度。 个人理解: 也就是说0x00是int型,0x00u是无符号int型,0x00ul长
[单片机]
<font color='red'>STM32</font>中0x1u 0u的含义
GD32单片机STM32远程下载手机程序升级固件下载局域网网页升级工具
GD32、STM32单片机,是我们最常见的一种MCU。通常我们在使用STM32单片机都会遇到程序在线升级下载的问题。 GD32/STM32单片机的在线下载通常需要以下几种方式完成: 1、使用ST/GD提供的串口下载工具,本地完成固件的升级下载。 2、自行完成系统BootLoader的编写,将系统程序分为BootLoader和APP两个部分,BootLoader完成固件升级。 3、使用STM32/GD固件服务器,完成固件的升级,固件服务器https://simplewifi.taobao.com/ 几种方式各有优缺点: 使用ST提供的方法进行固件升级,方法简单,不需要额外的开发。但是,只能本地完成STM32单片机的升级。
[单片机]
GD32单片机<font color='red'>STM32</font>远程下载手机程序升级固件下载局域网网页升级工具
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved