【51单片机快速入门指南】6.1:LCD1602的八线、四线控制及自定义符号,完美兼容Proteus仿真

目录

  • 硬知识
    • 显示特性
    • 接口定义
    • 操作时序
      • 写操作时序
      • 读操作时序
    • 寄存器
    • 忙标志位BF
    • 地址计数器(AC)
    • 显示数据寄存器(DDRAM)
    • CGROM
    • CGRAM
    • 指令
      • 清屏指令
      • 光标归位指令
      • 进入模式设置指令
      • 显示开关控制指令
      • 设定显示屏或光标移动方向指令
      • 功能设定指令
      • 设定CGRAM地址指令
      • 设定DDRAM地址指令
      • 读取忙信号或AC地址指令
      • 数据写入DDRAM或CGRAM指令
      • 从 CGRAM或DDRAM读出数据的指令
  • 示例程序
    • LCD1602.c
    • LCD1602.h
    • 测试程序
      • main.c
      • 实验现象
      • 仿真现象
        • 八线制
        • 四线制

普中51-单核-A2
STC89C52
Windows 10 20H2
Proteus 8 Frofessional v8.9 SP2
Keil uVision V5.29.0.0
PK51 Prof.Developers Kit Version:9.60.0.0


硬知识

       摘自《通用1602 液晶显示模块使用手册》、《液晶LCD1602(中文资料)—— ball 2010-5-13整理》

显示特性

       单5V电源电压,低功耗、长寿命、高可靠性
       内置192种字符(160个5x7点阵字符和32个5x10点阵字符)
       具有64个字节的自定义字符RAM,可自定义8个5x8点阵字符或四个5x11点阵字符
       显示方式:STN、半透、正显
       驱动方式:1/16DUTY,1/5BIAS
       视角方向:6点
       背光方式:底部LED
       通讯方式:4位或8位并口可选
       标准的接口特性,适配MCS1和M6800系列MPU的操作时序。

接口定义

在这里插入图片描述

操作时序

写操作时序

在这里插入图片描述
在这里插入图片描述

读操作时序

在这里插入图片描述
在这里插入图片描述

寄存器

       本模块内部具有两个8位寄存器:指令寄存器(IR)和地址寄存器(DR),用户可以通过RS和R/W输入信号的组合选择指定的寄存器,进行相应的操作。下表中列出了组合选择方式。

在这里插入图片描述
       指令寄存器IR,内部存储DDRAM和CGRAM中的数据显示的指令代码和地址信息,只能由MPU对其执行写操作:
       数据寄存器DR,内部暂时存储MPU与模块内部DDRAM和CGRAM之间的传送数据,内部操作使DR与DDRAM或者CGRAM之间的数据传送自动进行:
在这里插入图片描述

忙标志位BF

       忙标志BF-1时,表明模块正在进行内部操作,此时不接受任何外部指令和数据。当Rs-0,RW-1以及E为高电平时,BF输出到DB7,每次操作之前最好先进行状态字检测,只有在确认BF-0之后,MPU才能访问模块

地址计数器(AC)

       AC地址计数器是DDRAM或者CGRAM的地址指针。随着IR中指令码的写入,指令码中携带的地址信息自动送入AC中,并行做出AC作为DDRAM的地址指针还是CGRAM的地址指针的选择。
       AC具有自动加1或者减1的功能。当DR与DDRAM或者CGRAM之间完成一次数据传后,AC自动会加1或减1,在RS=0,R/W=1且E为高电平时,AC的内容送到DB6 ~ DB0;
在这里插入图片描述

显示数据寄存器(DDRAM)

       DDRAM存储显示字符的字符码,其容量的大小决定着模块最多可显示的字符数目.DDRAM地址与LCD显示屏上的显示位置的对应关系如下:
在这里插入图片描述

       执行显示移位操作时,对应的DDRAM地址也发生移位,以每行16个字符的显示为例,移位前后的地址对应关系如下:
在这里插入图片描述

CGROM

       HD44780内置了192个常用字符的字模,存于字符产生器CGROM(Character Generator ROM)中。在CGROM中,模块已经以8位二进制数的形式,生成了5x8点阵的字符字模组字符字模(一个字符对应一组字模),字符字模是与显示字符点阵相对应的8x8矩阵位图数据(与点阵行相对应的矩阵行的高三位为“0"),同时每一组字符字模都有一个由其在CGROM中存放地址的高八位数据组成的字符码对应。
在这里插入图片描述

CGRAM

       另外还有8个允许用户自定义的字符产生RAM,称为CGRAM(Character Generator RAM)
       就单屏结构的模块而言,字符码地址范围为00H ~ FFH,其中00H ~ 07H字符码与用户在CGRAM中生成的自定义图形字符的字模组相对应:至于双屏或者多屏结构的模块,由于各显示屏结构部分的工作分别由独立的使能信号E控制,因而各结构部分间字符的发生互不影响,每一显示屏结构部分的字符码地址范围为00H ~ FFH,其中00H ~ 07H字符码与用户在CGRAM中生成的自定义图形字符的字模组相对应。

指令

清屏指令

在这里插入图片描述

光标归位指令

在这里插入图片描述

进入模式设置指令

在这里插入图片描述

显示开关控制指令

在这里插入图片描述

设定显示屏或光标移动方向指令

在这里插入图片描述
在这里插入图片描述

功能设定指令

在这里插入图片描述

设定CGRAM地址指令

在这里插入图片描述

设定DDRAM地址指令

在这里插入图片描述

读取忙信号或AC地址指令

在这里插入图片描述

数据写入DDRAM或CGRAM指令

在这里插入图片描述

从 CGRAM或DDRAM读出数据的指令

在这里插入图片描述

示例程序

       stdint.h见【51单片机快速入门指南】1:基础知识和工程创建

在这里插入图片描述

LCD1602.c

#include <STC89C5xRC.H>
#include "stdint.h"
#include "LCD1602.h"//******************以下内容移植时需修改******************void delay_ms(int i);#define LCD1602_Port P0sbit RS_Pin = P2 ^ 6;			//寄存器选择位,RS位
sbit WR_Pin = P2 ^ 5;			//读写选择位,RW
sbit EN_Pin = P2 ^ 7;			//使能信号位,E位void LCD1602_Delay()
{
//主频快就加延时
}void LCD1602_RS_H()
{RS_Pin = 1;
}void LCD1602_RS_L()
{RS_Pin = 0;
}void LCD1602_WR_H()
{WR_Pin = 1;
}void LCD1602_WR_L()
{WR_Pin = 0;
}void LCD1602_EN_H()
{EN_Pin = 1;
}void LCD1602_EN_L()
{EN_Pin = 0;
}void LCD1602_Write_Port(uint8_t Data)
{
#ifdef USE_4_PinLCD1602_Port &= 0x0F;LCD1602_Port |= (Data << 4);
#elseLCD1602_Port = Data;
#endif
}uint8_t LCD1602_Read_Port()
{
#ifdef USE_4_Pin	//4线下好像没有意义return 0;
#elsereturn LCD1602_Port;
#endif
}//******************以上内容移植时需修改******************unsigned char code LCD1602_DIY_Char[64]=	//8个自定义字符 地址为0x00~0x07
{0x02,0x04,0x0F,0x12,0x0F,0x0A,0x1F,0x02,//年0x0F,0x09,0x0F,0x09,0x0F,0x09,0x09,0x11,//月0x1F,0x11,0x11,0x1F,0x11,0x11,0x1F,0x00,//日0x16,0x09,0x08,0x08,0x08,0x09,0x06,0x00,//℃0x00,0x11,0x0A,0x04,0x0A,0x11,0x00,0x00,//×0x00,0x04,0x00,0x1F,0x00,0x04,0x00,0x00,//÷0x00,0x0E,0x11,0x11,0x11,0x0A,0x1B,0x00,//Ω0x00,0x11,0x11,0x11,0x19,0x16,0x10,0x00,//μ
};/*****************************************************
函数功能:判断液晶模块的忙碌状态
返回值:1: 忙碌; 0: 不忙
***************************************************/
uint8_t LCD1602_Busy_Test(void)
{
#ifdef USE_4_Pindelay_ms(2);return 0;
#elsereturn ((LCD1602_Operation(0, 1, 0) & 0x80) && 1);
#endif
}uint8_t LCD1602_Operation(uint8_t Cmd_Data_Flag, uint8_t Write_Read_Flag, uint8_t Data)
{if(Cmd_Data_Flag)LCD1602_RS_H();elseLCD1602_RS_L();if(Write_Read_Flag)LCD1602_WR_H();elseLCD1602_WR_L();LCD1602_Delay();		//给硬件反应时间if(Write_Read_Flag){LCD1602_EN_H();LCD1602_Delay();	//给硬件反应时间Data = LCD1602_Read_Port();}else{LCD1602_EN_L();LCD1602_Write_Port(Data);LCD1602_Delay();	//给硬件反应时间LCD1602_EN_H();LCD1602_Delay();	//给硬件反应时间}LCD1602_EN_L();return Data;
}/*****************************************************
函数功能:将一个字节写入液晶模块
入口参数:Byte 字节, Cmd_Data_Flag 0为命令, 1为数据
***************************************************/
void LCD1602_Write_Byte(uint8_t Byte, uint8_t Cmd_Data_Flag)
{while (LCD1602_Busy_Test());	//如果忙就等待
#ifdef USE_4_PinLCD1602_Operation(Cmd_Data_Flag, 0, Byte >> 4);while (LCD1602_Busy_Test());LCD1602_Operation(Cmd_Data_Flag, 0, Byte & 0x0F);
#elseLCD1602_Operation(Cmd_Data_Flag, 0, Byte);
#endif
}void LCD1602_DIY_Char_Init(void)
{unsigned char i;LCD1602_Write_Byte(LCD1602_Set_CGRAM_Addr, 0);	//开始写入你要显示的自定义字符、汉字代码	for(i = 0; i < 64; i++){LCD1602_Write_Byte(LCD1602_DIY_Char[i], 1);	//开始写入你要显示的自定义字符、汉字代码}
}/*****************************************************
函数功能:指定字符显示的实际地址
入口参数:row 行:0或1 col:列
***************************************************/
void LCD1602_Write_Address(uint8_t row, uint8_t col)
{if(row)LCD1602_Write_Byte(col | 0xc0, 0);	elseLCD1602_Write_Byte(col | 0x80, 0);	//显示位置的确定方法规定为"80H+地址码x"
}void LCD1602_Write_Str(char *Str)
{while (*Str)						//检测字符串结束标志{LCD1602_Write_Byte(*Str++, 1);	//发送当前字符}
}/*****************************************************
函数功能:对LCD的显示模式进行初始化设置
***************************************************/
void LCD1602_Init(void)
{
#ifdef USE_4_PinLCD1602_Write_Byte(LCD1602_Cursor_Return, 0);LCD1602_Write_Byte(LCD1602_Config | LCD1602_4PIN | LCD1602_2Row | LCD1602_5X7, 0);
#elseLCD1602_Write_Byte(LCD1602_Config | LCD1602_8PIN | LCD1602_2Row | LCD1602_5X7, 0);
#endifLCD1602_Write_Byte(LCD1602_Display_Switch | Display_Enable | Cursor_Enable | Cursor_Blink_Enable, 0);LCD1602_Write_Byte(LCD1602_Cursor_Screen_Mode | Cursor_Right_Mode | Screen_Static_Mode, 0);LCD1602_DIY_Char_Init();LCD1602_Write_Byte(LCD1602_Clr, 0);	//清屏幕指令,将以前的显示内容清除
}

LCD1602.h

#ifndef LCD1602_H_
#define LCD1602_H_#define USE_8_Pin
//#define USE_4_Pin#ifdef USE_8_Pin
#ifdef USE_4_Pin
#error
#endif
#endif#define LCD1602_Clr					0x01
#define LCD1602_Cursor_Return		0x02#define LCD1602_Cursor_Screen_Mode	0x04#define Cursor_Left_Mode		0x00	#define Cursor_Right_Mode		0x02#define Screen_Static_Mode		0x00#define Screen_Right_Mode		0x01#define LCD1602_Display_Switch		0x08#define Display_Disable			0x00#define Display_Enable			0x04#define Cursor_Disable			0x00#define Cursor_Enable			0x02#define Cursor_Blink_Disable	0x00#define Cursor_Blink_Enable		0x01#define LCD1602_Cursor_Screen_Move	0x10#define Cursor_Left				0x00#define Cursor_Right			0x04#define Screen_Left				0x08#define Screen_Right			0x0c#define LCD1602_Config				0x20#define LCD1602_4PIN			0x00#define LCD1602_8PIN			0x10#define LCD1602_1Row			0x00#define LCD1602_2Row			0x08#define LCD1602_5X7				0x00#define LCD1602_5X10			0x04#define LCD1602_Set_CGRAM_Addr		0x40
#define LCD1602_Set_DDRAM_Addr		0x80uint8_t LCD1602_Busy_Test(void);
uint8_t LCD1602_Operation(uint8_t Cmd_Data_Flag, uint8_t Write_Read_Flag, uint8_t Data);
void LCD1602_Write_Byte(uint8_t Byte, uint8_t Cmd_Data_Flag);
void LCD1602_Write_Address(uint8_t row, uint8_t col);
void LCD1602_Write_Str(char *Str);
void LCD1602_Init(void);#endif

测试程序

四线和八线在LCD1602.h中控制
在这里插入图片描述

main.c

#include <STC89C5xRC.H>
#include "intrins.h"
#include "stdint.h"
#include "LCD1602.h"void Delay1ms()		//@11.0592MHz
{unsigned char i, j;_nop_();i = 2;j = 199;do{while (--j);} while (--i);
}void delay_ms(int i)
{while(i--)Delay1ms();
}void main(void)
{char i;LCD1602_Init();LCD1602_Write_Address(0, 0);LCD1602_Write_Str("0123456789ABCDEF");LCD1602_Write_Address(1, 0);for(i = 0; i < 8; ++i)LCD1602_Write_Byte(i, 1);while(1){	}
}

实验现象

在这里插入图片描述

仿真现象

需要注意的是,Proteus仿真时存储模式需设为Small才能正确显示,很神秘。
在这里插入图片描述

八线制

在这里插入图片描述

四线制

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/400356.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在MAC OS 下配置python + Flask ,并支持pyCharm编辑器

https://www.cnblogs.com/lgphp/p/3841098.html 在MAC OS 下配置python Flask ,并支持pyCharm编辑器 flask是一个micro framework &#xff0c;伸缩性很强。可以部署到openshift 的PAAS里。这个框架上手非常快。喜欢的可以试试。 若实在MAC里&#xff0c;python已经默认安装了…

MySql简介及概念

关系型数据库系统&#xff1a;建立在关系模型上的数据库系统。 关系模型:当将日常生活中的实体&#xff08;学生&#xff09;&#xff0c;和实体的属性&#xff08;学生的学号&#xff0c;姓名&#xff09;保存数据中时&#xff0c;该如何处理该实体结构。1、数据结构可以规定&…

【51单片机快速入门指南】6.2:SPI 、八线、四线控制 LCD12864 屏幕及Proteus的仿真(支持中文汉字)

目录硬知识LCD12864简介主控芯片ST7920的功能是&#xff1a;驱动芯片ST7921的功能是&#xff1a;引脚功能时序并行通信串行通信指令存储结构操作取模软件的配置示例程序st7920.cst7920.h测试程序显示图片图片1实验现象图片2实验现象显示字符英文实验现象中文实验现象Proteus的仿…

【51单片机快速入门指南】仿真实例:幅值可调、频率可调的函数发生器(方波、三角波、正弦波)(1~10kHz)

目录效果设计思路STC89C52 Windows 10 20H2 Proteus 8 Frofessional v8.9 SP2 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 51函数发生器&#xff0c;附工程源码和Proteus仿真文件 效果 0 ~ 5V &#xff0c;50Hz的正弦波&#xff1a; 1 ~ 4V&…

VisualSvn Server介绍

1 、VisualSvn Server VisualSvn Server是免费的&#xff0c;而VisualSvn是收费的。VisualSvn是Svn的客户端&#xff0c;和Visual Studio集成在一起&#xff0c;但是不免费&#xff0c;使用AnkhSvn&#xff08;VS2008插件&#xff09;来代替VisualSvn。使用 VisualSvn Server是…

【51单片机快速入门指南】6.3:DS18B20 单总线数字温度计的多路读取

目录硬知识DS18B20介绍时序初始化时序写时序读时序命令ROM 操作命令ROM 搜索举例存贮器操作命令示例程序DS18B20.cDS18B20.h测试程序定时器中断服务函数单传感器时ID的获取 main.c单传感器读取温度和读取特定ID传感器的温度多路传感器读取普中51-单核-A2 STC89C52 Keil uVisio…

SQL多行转多列

--★转换结果如上图 1、首先创建表&#xff1a; CREATE TABLE [成绩表]( [编号] [int]IDENTITY(1,1) NOT NULL, [姓名] [varchar](50)NULL, [语文] [numeric](5, 2)NULL, [数学] [numeric](5, 2)NULL, [英语] [numeric](5, 2)NULL ) ON [PRIMARY] 2、插入测试数据 INSERT INTO …

C#通过FFmpeg获得视频文件参数

C#通过FFmpeg获得视频参数 FFmpeg简介 FFmpeg is a complete, cross-platform solution to record, convert and stream audio and video&#xff08;录制、转换 、音/视频&#xff0c;并可将其转换为音/视频流的完整的&#xff0c;跨平台的j解决方案&#xff09;.FFmpeg的开发…

【51单片机快速入门指南】6.3.1:使用1-WIRE搜索算法搜索单总线上所有DS18B20的ID(基于二叉树)

目录源码OWSearch.c测试程序实验现象Proteus仿真实机测试普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 移植自1-WIRE搜索算法 串口部分见【51单片机快速入门指南】3.3&#xff1a;USART 串口通信 DS18B20驱动程序见【5…

卡拉丁发布第四代车用空调滤清器

5月15日&#xff0c;卡拉丁“全澄行动”第四代车用空调滤清器产品发布会在京举行&#xff0c;据悉&#xff0c;该车用空调滤清器PM2.5过滤效率可高达99%。经国家权威检测机构广东省微生物分析检测中心检测&#xff0c;卡拉丁第四代车用空调滤清器对大肠杆菌、金***葡萄球菌抗菌…

【 Grey Hack 】大数四则运算

目录效果加减乘除乘方源码版本&#xff1a;Grey Hack v0.7.3619 - Alpha 在Gs中&#xff0c;位数大于15的整数将以科学计数法显示&#xff0c;故这里提供一种基于字符串加法的四则大数运算算法。由于位数大于10的字符串无法用to_int方法转化为整数&#xff0c;因此本示例中以长…

uniapp打包小程序上传测试后,使用有的插件显示空白页面,问题解决方【有效 / 最新】

目录 问题1图在微信开发者平台正常能使用 打包上传微信小程序测试问题2图在微信开发者平台正常能使用 打包上传微信小程序测试解决步骤一1.2.3. 解决步骤二打开微信小程序官网看图跨域网址 最后 问题1图 在微信开发者平台正常能使用 未上传小程序&#xff0c;开发过程中&…

django加载本地html

django加载本地html from django.shortcuts import renderfrom django.http import HttpResponse from django.shortcuts import render,render_to_response # Create your views here. def hello(request): return render_to_response("hello.html") 传递数据到htm…

Java知多少(68)面向字符的输出流

面向字符的输出流都是类 Writer 的子类&#xff0c;其类层次结构如图 10-5 所示。 图10-5 Writer的类层次结构图表 10-3 列出了 Writer 的主要子类及说明。 表 10-3 Writer 的主要子类类名功能说明CharArrayWriter写到字符数组的输出流BufferedWriter缓冲输出字符流PipedWriter…

Linux虚拟机的替代品:Docker与WSL2上手笔记

目录安装Docker可能出现的问题内核需更新Linux 内核更新包将 WSL 2 设置为默认版本An error occurred安装镜像使用Microsoft Store安装所选的 Linux 分发手动安装镜像及文件夹的共享Docker run 命令Windows Terminal的安装在Windows Terminal中直接运行已有的容器Windows 10 20…

flask需求文件requirements.txt的创建及使用

1.简介 Python项目中必须包含一个 requirements.txt 文件&#xff0c;用于记录所有依赖包及其精确的版本号用以新环境部署。 2.进入虚拟环境然后输入pip freeze > requirements.txt 每次安装或者升级了包之后最好也一并使用这个命令更新这个文件。 需求文件的内容示例…

【联盛德W806上手笔记】一、开发环境和烧录程序

目录简介芯片外观MCU 特性安全特性低功耗模式芯片结构管脚定义极限参数开发环境SDK的获取从官网获取从Q群获取iosetting大佬 维护的wm-sdk-w806打开工程编译固件烧录现象Windows 10 20H2 HLK-W806-V1.0-KIT WM_SDK_W806_v0.6.0 引自《W80X_MCU_快速入门V0.2》、《W806 MCU 芯片…

Mac os + Flask + PyCharm python开发环境集成

1. 打开mac自带终端安装virtualenv 执行 sudo easy_install virtualenv / sudo pip install virtualenv 2.安装完 virtualenv &#xff0c;打开一个 shell &#xff0c;创建自己的环境。 $ mkdir myapp $ cd myapp $ virtualenv venv New python executable in env/bin/py…

zookeeper注意几点

为什么80%的码农都做不了架构师&#xff1f;>>> Zookeeper 作为一个分布式的服务框架&#xff0c;主要用来解决分布式集群中应用系统的一致性问题&#xff0c;它能提供基于类似于文件系统的目录节点树方式的数据存储&#xff0c;但是 Zookeeper 并不是用来专门存储…

【51单片机快速入门指南】7:片上EEPROM

目录硬知识IAP及EEPROM新增特殊功能寄存器介绍EEPROM空间大小及地址小常识大建议常见问题示例程序EEPROM.cEEPROM.h测试程序main.c普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 硬知识 摘自《STC89C52系列单片机器件手册》 ST…