【STC单片机学习】第十七课:LCD1602显示器

【朱老师课程总结 侵删】

第一部分、章节目录

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-DB7

sbit 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;
	else
			addr = 0x40 + x;
    
 Lcd1602_Write_Cmd(addr|0x80);
	
}

本节课程序下载链接:LCD1602

本节课结束!

猜你喜欢

转载自blog.csdn.net/qq_27148893/article/details/110581194