跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

4、LED1602液晶模组介绍及其编程使用

参考资料: 1602的相关参数:http://www.elecfans.com/xianshi/20180205630037.html 文章目录 一、1602的基本介绍 1、引脚分布及含义 2、1602液晶拨快的驱动电路 二、1602的编程使用 1、时序图 2、读时序操作--向1602读出数据命令(少用) 3、写时序操作--向1602写入数据命令(常用) 三、1602三大寄存器介绍 1、CGROM:字符产生器单元 2、CGRAM:用户自定义字符产生器RAM单元 3、DDRAM:显示数据存放RAM单元 4、指令集 四、1602的具体编程实现 一、1602的基本介绍 1602是基本的液晶模块,其中16表示一行显示16个字符,02表示显示2行。

1602也就是表示2行,每行16个字符的液晶模块。

而1602前面的字母是表示厂家名称。

黑屏白字的显示效果较好,有背光的液晶模块表示背光板电源后屏幕有底光,显示效果较好,但是功耗比较大,没有背光板的模块教薄,不适合在光线较暗的环境中使用。

常用的芯片封装技术: SMT/TAB/COG/COF/COB 外观上通常是一个黑色的水滴状凸起

1、引脚分布及含义 (一般来说都是做成16个引脚)

VEE是调节对比度的问题,需要接一个可调的电阻来进行调节 DB0-DB7是数据总线,DB0是数据总线的最低位 并行方法:DB0-DB7 (消耗资源,但是速度快) 串行方法:DB4-DB7 (节约资源,但是速度慢) 2、1602液晶拨快的驱动电路

(由于基本是写数据进去1602,所以RW控制读写的位直接接地) www.Alldatasheet.com 可以查到1602的主控芯片HD44780U,也就是用stm8与44780U两个芯片的交互。

二、1602的编程使用 1602液晶模组的引脚含义 RS/RW/EN 这几个控制线是必用的,DB0-DB7是数据总线 1、时序图 弄清楚读时序图: (少用)

2、读时序操作–向1602读出数据命令(少用) 可见: 读取状态:RS = 0, RW = 1, EN = 1,tDDR时间之后,就可以读出状态。

读取数据:RS = 1, RW = 1, EN = 1,tDDR时间之后,就可以读出数据。

操作过程:

3、写时序操作–向1602写入数据命令(常用) 写入状态:RS = 0; RW = 0; 准备好data; EN = 1 ----> 0 写入数据:RS = 1; RW = 0; 准备好data; EN = 1 ----> 0

(上诉的上升沿全部改为下降沿,产生一个下降沿才可以实现数据的写入) 三、1602三大寄存器介绍 问题1:那就是我们所写入的数据或者的读出的数据是来自哪里,或者是写入了哪里?

问题2:思考如何在DDRAM地址显示出字符?

CGROM:字符产生器单元CGRAM:用户自定义字符产生器RAM单元DDRAM:显示数据存放RAM单元

常见的ROM有:EEPROM,EPRROM,Flash闪存(掉电不会丢失,但是数据比较慢) 常见的RAM:SRAM,SROM(掉电之后会丢失,但是速度比较快) 1、CGROM:字符产生器单元 HD44780控制器芯片中已经内置了192个常用字符的字摸,存放在掉电不丢失的字符产生器CGROM中,也就是为了简便用户进行取模。

2、CGRAM:用户自定义字符产生器RAM单元 在上诉中,除此之外,另外还有8个允许用户自定义的字符产生RAM存在与CGRAM中。

也就是其了造字的作用。

自己造字的一个空间

3、DDRAM:显示数据存放RAM单元 这个是一个显示数据的RAM单元,用来存放需要被显示的字符代码,其共有80个字节的大小,一行最多可以支持40个字节。

但是1602只需要前面的16个字节大小,后面的暂时不需要的。

总结:

4、指令集 问题3:以上知道了读写数据的指的是字模,而读写的命令又是指什么呢?

命令是是让液晶表示一定的功能。

指令集如下所示:

四、1602的具体编程实现 数据用来显示不同的功能,命令用来挑选1602的功能 写入状态:RS = 0; RW = 0; 准备好data; EN = 1 ----> 0 写入数据:RS = 1; RW = 0; 准备好data; EN = 1 ----> 0 问题:为什么第一行的显示地址是0x80?

原因:地址需要偏移,需要加一个80的地址

确定所需要的命令

确定好电路连接

代码如下:显示两行字符串

#include "iostm8s208mb.h"

#define u8 uint8_t #define u16 uint16_t #define u32 uint32_t typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned long uint32_t;

#define LED1602EN PF_ODR_ODR4 #define LED1602RW PF_ODR_ODR3 #define LED1602RS PF_ODR_ODR0 #define LED1602Data PB_ODR

void GPIO_Init(void); void LED1602_Init(void); void LED1602_WriteData(u8 Data); //写数据 void LED1602_WriteComm(u8 Data); //写命令 void LED1602_Play(void); //字符串显示 void LED1602_DataPrev(u8 Data); //数据准备 void Delay(u16 time);

//显示的两个字符串 u8 StringBuff1[16] = " Hello World! "; u8 StringBuff2[16] = " My Clichong! ";

int main( void ) { GPIO_Init(); LED1602_Init(); LED1602_Play();

return 0; }

void GPIO_Init(void) { PF_DDR |= 0x19; PF_CR1 |= 0x19; PF_CR2 &= 0xE6;

PB_DDR |= 0xFF; PB_CR1 |= 0xFF; PB_CR2 &= 0x00;

}

void LED1602_Init(void) { LED1602_WriteComm(0x01); //清屏功能 LED1602_WriteComm(0x3C); //8位2行点阵 LED1602_WriteComm(0x0D); //显示功能开启,无光标,光标不闪烁 LED1602_WriteComm(0x06); //写入新数据后显示屏不移动仅光标右移 }

void LED1602_DataPrev(u8 Data) { LED1602Data = Data; }

void LED1602_WriteData(u8 Data) { LED1602RS = 1; LED1602RW = 0; LED1602_DataPrev(Data); Delay(2); LED1602EN = 1; //产生一个下降沿触发,发送命令 Delay(2); LED1602EN = 0; }

void LED1602_WriteComm(u8 Data) { LED1602RS = 0; LED1602RW = 0; LED1602_DataPrev(Data); Delay(2); LED1602EN = 1; //产生一个下降沿触发,发送数据 Delay(2); LED1602EN = 0; }

void LED1602_Play(void) { u8 i; for(i = 0; i < 16; i++){ LED1602_WriteData(StringBuff1[i]); } LED1602_WriteComm(0xC0); //注意偏移量为0x80,所以0x40的基础上加上0x80为0xc0才是第二行的第一个,否则会无法显示第二行 for(i = 0; i < 16; i++){ LED1602_WriteData(StringBuff2[i]); } }

void Delay(u16 time) { u8 i,j; while(time--){ for(i = 0; i < 20; i++) for(j = 0; j < 50; j++); } }

相关文章