【朱老师课程总结 侵删】
第一部分、章节目录
1.17.1_2.LCD显示器相关背景1_2
1.17.3.开始学习LCD1602
1.17.4.LCD1602控制器的低层时序1
1.17.5.LCD1602控制器的低层时序2
1.17.6.代码实践
第二部分、随堂记录
1.17.1_2.LCD显示器相关背景1_2
1.17.1.1、LCD简介
(1)显示器
CRT显示器(大头电视)
LCD液晶显示器
LED液晶显示器等等
(2)LCD(Liquid Crystal Display),液晶显示器,原理介绍
液晶显示器的工作原理是利用液晶的物理特性,在通电时导通,使液晶排列变得有秩序,使光线容易通过;不通电时,排列则变得混乱,阻止光线通过。
透光率!
(3)LCD应用领域
平板电脑、笔记本电脑、手机屏幕、智能电视屏幕...
(4)LED OLED(被认为下一代显示器)
OLED:曲面屏,尤其三星
1.17.1.2、电子显示器的原理
(1)像素(分辨率):
- 像素(px):组成图像的最小单位
- 分辨率:屏幕分辨率是指纵横向上的最大像素点数
- PPI:单位英寸下像素点数
拿画图做演示!
(2)显存(显卡内存):用来做显示的内存
- 显存是用来存储要处理的图形信息的部件,用来存储像素数据
- 显卡 = 显存+GPU+电路板+BIOS固件
- 编程时,把要操纵的像素点存在显存里就不用管了!
(3)字模:字模就是字在点阵上显示时对应的编码
- 要显示汉字或字符的时候会用到字模
- 之前在LED点阵显示汉字的时候接触过
- 字模不是唯一的:宋体、楷体、黑体、Time New Rome等等,同一个字不同字体对应的编码不同
(4)字库:包含字模的库
类似于活字印刷术
(5)控制器和驱动器
- 显示器的控制器:控制芯片负责和CPU通信,更靠近软件。
- 显示器的驱动器:以液晶显示器的驱动器为例,用来调制施加在液晶显示器件电极上的电位信号的相位、峰值、频率等,以建立驱动电场,以实现液晶显示期间的显示效果,更靠近硬件。
- 编程时考虑控制器,驱动器不敏感。
(6)软件+硬件实现功能
- 硬件只需了解,通过控制器来控制显存进而控制硬件来实现功能。
1.17.3.开始学习LCD1602
1.17.3.1、简介
(1)LCD1602简介
- 16列x2行,显示器显示2行,每行16个字符。
- 专门用来显示字母、数字、符号的点阵型液晶模块
- 能显示32个字符,但是像素数不是32,因为一个字符是由多个像素组成的。有可能一个字符是由5*7=35个像素组成的,也有可能是由5*10=50个像素组成的。
- LCD1602内置了字库。可以直接获取字模!
(2)不能显示中文
- LCD1602带ASCII码字库,当我们想让LCD1602显示某个ASCII码字符时,只需要将这个字符对应的ASCII码发给LCD1602内部的控制器,控制器就会去查字库得到字模,然后将字模发给内部的驱动器去驱动LCD做显示。
(3)用途:用的很少,计算器中可以用到
1.17.3.2、原理图和接线引脚
(1)引脚:
- 数据接口8个—DB0-DB7:并行传输数据
- 控制接口3个—RS:数据/命令选择位(H/L)、RW:读/写选择位(H/L)、E:使能信号
- 调节对比度1个:VO
- VCC/GND4个:GND、VCC、BG VCC、BG GND:电源正负极和背光源正负极
(2)并行接口(DB0-DB7)
并行就是数据线有多根,每一根可以传输1个bit位,所以同时可以传输多个bit位。LCD1602有8根数据线,所以一次同时传输8个bit位。
(3)接线确认
- LCD1602怎么接到开发板(演示)
- MCU如何接LCD1602插排:已经接好了,只要sbit声明好就行
1.17.3.3、数据手册
点击SMC1602数据手册下载
(1)概念:LCM:LCD Module(LCD模组)
(2)主要技术参数解析
(3)引脚定义(结合原理图来对照分析)
(4)控制器接口说明(注意控制器型号)
RS=H时,D0-D7上传输的是数据
RS=L时,D0-D7上传输的是命令
RW=H时,表示我们要读
RW=L时,表示我们要写
E=H时,表示使能
E=L时,表示禁止(禁能)
1.17.4.LCD1602控制器的低层时序1
1.17.4.1、关键点
(1)时序控制接口引脚
(2)状态字、指令码、数据,都是通过DB0-DB7数据接口
>>状态字:
- 官方例程读写检测函数
STA0-6是当前地址的值,也就是光标!
控制器内部自带80*8位(80字节)的RAM缓冲区,如下所示:
RAM地址范围:
- 官方例程坐标显示函数
- 通过写指令来实现坐标配置
>>指令码:
- 初始化:
0x38(打开,5*7,8位数据) - 显示开/关设置:
0x0C 打开显示,不显示光标
0x08 关闭显示
0x0F 打开显示并且显示光标并且光标闪烁 - 光标设置:
0x06(读写一个字符,地址指针和光标加一) - 清屏:
0x01 - 回车:
0x02 - 设置开始显示的坐标
0x80+(0x00-0x0F) 第一行设置地址指针指令
0x80+(0x40-0x4F) 第二行设置地址指针指令
addr | 0x80,就可以实现addr加0x80,想一下为什么?
>>数据:
写数据直接只要设置好RS/RW/E,然后把数据放在DB0-DB7即可!因为数据是并行传输,可以同时传过去!
1.17.4.2、底层时序函数分析
- Read_Busy()
- Lcd1602_Write_Cmd()
- Lcd1602_Write_Data()
1.17.5.1、读数据
- 示例代码没有读数据这个函数。
- 可以从LCD1602读出来数据,然后打印在串口内!
1.17.5.LCD1602控制器的低层时序2
1.17.5.1、RAM空间
(1)RAM地址范围(地址范围每行是00-39,但是我们每行只用00-16)
(2)数据是什么:
数据:要显示的字符的ASCII码编码值
写数据方式:
- 字符串" " 或者 字符 ' '
- 直接发ascii码表中的编码值
1.17.6.代码实践
//main.c
#include "lcd1602.h"void LCD_init(void);
void LCD_show(u8 *str);
void main(void)
{u8 str[] = "hello,everyone!";LCD_init();LCD_show(str);while(1);
}void LCD_init(void)
{Lcd1602_Write_Cmd(0x38); //初始化Lcd1602_Write_Cmd(0x0C); //显示开/关设置Lcd1602_Write_Cmd(0x06); //光标设置Lcd1602_Write_Cmd(0x01); //清屏LCD_setcursor(0,0);
}
void LCD_show(u8 *str)
{while(*str != '\0'){Lcd1602_Write_Data(*str);str++;}
}
//lcd1602.h
#ifndef __LCD1602_H_
#define __LCD1602_H_#include <reg51.h>#define u8 unsigned char
#define u16 unsigned int
#define LCD_DB P0 //DB0-DB7sbit LCD_EN = P2^7;
sbit LCD_RS = P2^6;
sbit LCD_WR = P2^5;void RW_Busy(); //忙检测函数
void Lcd1602_Write_Cmd(unsigned char cmd); //写命令
void Lcd1602_Write_Data(unsigned char dat); //写数据
void LCD_setcursor(u8 x,u8 y); //设置坐标#endif
//lcd1602.c
#include "lcd1602.h"void RW_Busy() //忙检测函数,读状态
{unsigned char sta; LCD_DB = 0xff; //LCD_RS = 0;LCD_WR = 1;do{LCD_EN = 1;sta = LCD_DB;LCD_EN = 0; //使能,用完就拉低,释放总线}while(sta & 0x80);//判断第7位是否为0
}
void Lcd1602_Write_Cmd(unsigned char cmd) //写命令
{RW_Busy();LCD_RS = 0;LCD_WR = 0;LCD_DB = cmd;LCD_EN = 1;LCD_EN = 0;
}
void Lcd1602_Write_Data(unsigned char dat) //写数据
{RW_Busy();LCD_RS = 1;LCD_WR = 0;LCD_DB = dat;LCD_EN = 1;LCD_EN = 0;
}
void LCD_setcursor(u8 x,u8 y) //设置坐标
{unsigned char addr;if(y == 0)addr = 0x00 + x;elseaddr = 0x40 + x;Lcd1602_Write_Cmd(addr|0x80);}
本节课程序下载链接:LCD1602
本节课结束!