| 
 | 
 
路线栈欢迎您!
您需要 登录 才可以下载或查看,没有帐号?立即注册 
 
 
 
x
 
 本帖最后由 一路上 于 2023-8-9 17:18 编辑  
 
前言 
 
LCD1602(Liquid Crystal Display)是一种工业字符型液晶液晶模块,是专门用于显示字幕、数字以及符号,能够同时显示 16×02 即 32 字符(十六列 两行)。前面我们介绍过LCD液晶屏的控制原理。 
 
1602的接口说明 
 
 
第 1 脚: VSS 为电源地  
第 2 脚: VDD 接 5V 正电源  
第 3 脚: VL 为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度 过高时会产生“鬼影”,使用时可以通过一个 10K 的电位器调整对比度。 
第 4 脚:RS 为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。  
第 5 脚:R/W 为读写信号线,高电平时进行读操作,低电平时进行写操作。当 RS 和 R/W 共 同为低电平时可以写入指令或者显示地址,当 RS 为低电平 R/W 为高电平时可以读忙信号, 当 RS 为高电平 R/W 为低电平时可以写入数据。 
第 6 脚:E 端为使能端,当 E 端由高电平跳变成低电平时,液晶模块执行命令。 
第 7-14 脚:D0~D7 为 8 位双向数据线。  
第 15 脚:背光源正极。  
第 16 脚:背光源负极。 
 
接线: 
 
VSS -- GND// 
VDD -- 5V // 
对比度 VO -- GND // 
控制线 RS -- P1.0  RW -- P1.1   E -- P1.4 // 
背光灯 A -- 5V K -- GDN // 
数据 D0到D7 -- P0.到P0.7// 
 
1602的命令指令码 
 
 
 
 
例如第二行第一个字符的地址是 40H,那么是否直接写入 40H 就可以将光标定位在第二行第 一个字符的位置呢? 
 
这样不行,因为写入显示地址时要求最高位 D7 恒定为高电平 1 所以实 际写入的数据应该是 01000000B(40H) +10000000B(80H)=11000000B(C0H) 
 
读操作时序: 
 
 
写操作时序: 
 
 
时序参数: 
 
 
了解以上的读写操作时序以后我们开始创建工程按照要求编写代码工程,首先配置cubemx: 
 
 
RS/RW/EN端口定义: 
 
- #define RS_GPIO_Port GPIOB
 
 - #define RW_GPIO_Port GPIOB
 
 - #define EN_GPIO_Port GPIOB
 
  
- #define RS_GPIO_PIN  GPIO_PIN_1
 
 - #define RW_GPIO_PIN  GPIO_PIN_2
 
 - #define EN_GPIO_PIN  GPIO_PIN_10
 
  
 
- #define RS_HIGH HAL_GPIO_WritePin(RS_GPIO_Port,RS_GPIO_PIN,GPIO_PIN_SET)
 
 - #define RS_LOW HAL_GPIO_WritePin(RS_GPIO_Port,RS_GPIO_PIN,GPIO_PIN_RESET)
 
 - #define RW_HIGH HAL_GPIO_WritePin(RW_GPIO_Port,RW_GPIO_PIN,GPIO_PIN_SET)
 
 - #define RW_LOW HAL_GPIO_WritePin(RW_GPIO_Port,RW_GPIO_PIN,GPIO_PIN_RESET)
 
 - #define EN_HIGH HAL_GPIO_WritePin(EN_GPIO_Port,EN_GPIO_PIN,GPIO_PIN_SET)
 
 - #define EN_LOW HAL_GPIO_WritePin(EN_GPIO_Port,EN_GPIO_PIN,GPIO_PIN_RESET)
 
 
  复制代码 
LCD1602初始化函数: 
 
- void LCD1602_INIT()
 
 - {
 
 -   //(1)延时 15ms
 
 -     HAL_Delay(15);
 
 - //(2)写指令 38H(不检测忙信号) 
 
 -   Write_Cmd_Func(0x38);
 
 - //(3)延时 5ms
 
 -     HAL_Delay(15);
 
 - //(4)以后每次写指令,读/写数据操作均需要检测忙信号
 
 - //(5)写指令 38H:显示模式设置
 
 -   Write_Cmd_Func(0x38);
 
 - //(6)写指令 08H:显示关闭
 
 -   Write_Cmd_Func(0x08);
 
 - //(7)写指令 01H:显示清屏
 
 -   Write_Cmd_Func(0x01);
 
 - //(8)写指令 06H:显示光标移动设置
 
 -   Write_Cmd_Func(0x06);
 
 - //(9)写指令 0CH:显示开及光标设置}
 
 -   Write_Cmd_Func(0x0c);
 
 - }
 
  复制代码 
写命令函数: 
 
 
- void Write_Cmd_Func(char cmd)
 
 - {
 
 -     RS_LOW;
 
 -     RW_LOW;
 
 -     EN_LOW;
 
 -     GPIOA->ODR=cmd;
 
 -     HAL_Delay(5);
 
 -     EN_HIGH;
 
 -     HAL_Delay(5);
 
 -     EN_LOW;
 
 - }
 
  复制代码 
写数据函数: 
 
- void Write_Data_Func(char dataShow)
 
 - {
 
 -     RS_HIGH;
 
 -     RW_LOW;
 
 -     EN_LOW;
 
 -     GPIOA->ODR=dataShow;
 
 -     HAL_Delay(5);
 
 -     EN_HIGH;
 
 -     HAL_Delay(5);
 
 -     EN_LOW;
 
 - }
 
  复制代码 
显示行列函数: 
 
- void LCD1602_showLine(char row, char col, char *string)
 
 - {
 
 -   
 
 -   switch(row){
 
  
-     case 1:
 
 -         Write_Cmd_Func(0x80+col);
 
 -         while(*string){
 
 -           Write_Data_Func(*string);
 
 -           string++;
 
 -         }
 
 -         break;
 
 -     
 
 -     case 2:
 
 -         Write_Cmd_Func(0x80+0x40+col);
 
 -         while(*string){
 
 -           Write_Data_Func(*string);
 
 -           string++;
 
 -         }
 
 -         break;
 
 -   
 
 -   }
 
 - }
 
  复制代码 
main函数里面打印字符: 
 
- LCD1602_INIT();
 
 - LCD1602_showLine(1,4,"HELLO");
 
 - LCD1602_showLine(2,4,"WORLD!");
 
 
  复制代码 
显示效果: 
 
 |   
 
 
 
 |