ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

单片机C51 之(11)GPIO 显示 -- LCD12864

2021-10-03 17:00:31  阅读:377  来源: 互联网

标签:11 字符 显示 数据线 C51 -- 设定 地址 指令


在之前的文章中讲到了显示器件–LCD1602,但是1602的缺点比较严重:
1、仅有两行显示。
2、仅能显示字符,不能显示汉字。

12864是12864点阵液晶模块,其本质跟1602类似,只不过点阵数更多而已,可显示四行信息,单字符16,汉字8个。带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64,内置8192个1616点汉字,和128个16*8点ASCII字符集。利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示8×4行16×16点阵的汉字。也可完成图形显示。低电压低功耗是其又一显著特点。
在这里插入图片描述

引脚定义如下:

管脚号管脚名称电平管脚功能描述
1VSS0V电源地
2VCC3.0~+5V电源正
3V0-对比度(亮度)调整
4RS(CS)H/LRS=“H”,表示DB7——DB0为显示数据;RS=“L”,表示DB7——DB0为显示指令数据
5R/W(SID)H/LR/W=“H”,E=“H”,数据被读到DB7——DB0;R/W=“L”,E=“H→L”, DB7——DB0的数据被写到IR或DR
6E(SCLK)H/L使能信号
7DB0H/L三态数据线
8DB1H/L三态数据线
9DB2H/L三态数据线
10DB3H/L三态数据线
11DB4H/L三态数据线
12DB5H/L三态数据线
13DB6H/L三态数据线
14DB7H/L三态数据线
15PSBH/LH:8位或4位并口方式,L:串口方式
16NC-空脚
17/RESETH/L复位端,低电平有效
18VOUT-LCD驱动电压输出端
19AVDD背光源正端(+5V)
20KVSS背光源负端

指令集 – 重要

指令指令码功 能
RSR/WD7D6D5D4D3D2D1D0
清除显示0000000001将DDRAM填满"20H",并且设定DDRAM的地址计数器(AC)到"00H"
地址归位000000001X设定DDRAM的地址计数器(AC)到"00H",并且将游标移到开头原点位置;这个指令不改变DDRAM 的内容
显示状态开/关0000001DCBD=1: 整体显示 ONC=1: 游标ON B=1:游标位置反白允许
进入点设定00000001I/DS指定在数据的读取与写入时,设定游标的移动方向及指定显示的移位
游标或显示移位控制000001S/CR/LXX设定游标的移动与显示的移位控制位;这个指令不改变DDRAM 的内容
功能设定00001DLXREXXDL=0/1:4/8位数据RE=1: 扩充指令操作RE=0: 基本指令操作
设定CGRAM地址0001AC5AC4AC3AC2AC1AC0设定CGRAM 地址
设定DDRAM地址0010AC5AC4AC3AC2AC1AC0设定DDRAM 地址(显示位址)第一行:80H-87H第二行:90H-97H
读取忙标志和地址01BFAC6AC5AC4AC3AC2AC1AC0读取忙标志(BF)可以确认内部动作是否完成,同时可以读出地址计数器(AC)的值
写数据到RAM10数据将数据D7——D0写入到内部的RAM (DDRAM/CGRAM/IRAM/GRAM)
读出RAM的值11数据从内部RAM读取数据D7——D0(DDRAM/CGRAM/IRAM/GRAM)

扩展指令

指令指 令 码功 能
RSR/WD7D6D5D4D3D2D1D0
待命模式0000000001进入待命模式,执行其他指令都可终止待命模式
卷动地址开关开启000000001SRSR=1:允许输入垂直卷动地址SR=0:允许输入IRAM和CGRAM地址
反白选择00000001R1R0选择4行中的任一行作反白显示,并可决定反白与否。初始值R1R0=00,第一次设定为反白显示,再次设定变回正常
睡眠模式0000001SLXXSL=0:进入睡眠模式SL=1:脱离睡眠模式
扩充功能设定00001CLXREG0CL=0/1:4/8位数据RE=1: 扩充指令操作RE=0: 基本指令操作G=1/0:绘图开关
设定绘图RAM地址0010AC60AC50AC4AC3AC3AC2AC2AC1AC1AC0AC0设定绘图RAM先设定垂直(列)地址AC6AC5…AC0再设定水平(行)地址AC3AC2AC1AC0将以上16位地址连续写入即可

连接方式
LCD12864与单片机的连接有两种方式,一种是直接控制方式,另一种是所谓的间接控制方式。它们的区别只是所用的数据线的数量不同,其他都一样。
1.直接控制方式
LCD12864的8根数据线和3根控制线E,RS和R/W与单片机相连后即可正常工作。一般应用中只须往LCD12864中写入命令和数据,因此,可将LCD12864的R/W读/写选择控制端直接接地,这样可节省1根数据线。VO引脚是液晶对比度调试端,通常连接一个10kΩ的电位器即可实现对比度的调整;也可采用将一个适当大小的电阻从该引脚接地的方法进行调整,不过电阻的大小应通过调试决定。
在这里插入图片描述
在这里插入图片描述

2.间接控制方式
间接控制方式也称为四线制工作方式,是利用HD44780所具有的4位数据总线的功能,将电路接口简化的一种方式。为了减少接线数量,只采用引脚DB4~DB7与单片机进行通信,先传数据或命令的高4位,再传低4位。采用四线并口通信,可以减少对微控制器I/O的需求,当设计产品过程中单片机的I/O资源紧张时,可以考虑使用此方法。 可以看做是一个LCD12864加上一个IIC转并口输出模块。
在这里插入图片描述

使用
使用前先给模块加上工作电压,再按照下图的连接方法调节LCD的对比度,使其显示出黑色的底影。此过程亦可以初步检测LCD有无缺段现象。
1、字符显示
带中文字库的128X64-0402B每屏可显示4行8列共32个16×16点阵的汉字,每个显示RAM可显示1个中 文字符或2个16×8点阵全高ASCII码字符,即每屏最多可实现32个中文字符或64个ASCII码字符的显示。带中文字库的128X64-0402B内部提供128×2字节的字符显示RAM缓冲区(DDRAM)。字符显示是通过将字符显示编码写入该字符显示RAM实现的。根据写入内容的不同,可分别在液晶屏上显示CGROM(中文字库)、HCGROM(ASCII码字库)及CGRAM(自定义字形)的内容。三种不同字符/字型的选择编码范围为:0000~0006H(其代码分别是0000、0002、0004、0006共4个)显示自定义字型,02H~7FH显示半宽ASCII码字符,A1A0H~F7FFH显示8192种GB2312中文字库字形。字符显示RAM在液晶模块中的地址80H~9FH。字符显示的RAM的地址与32个字符显示区域有着一一对应的关系,其对应关系如下表所示。

80H81H82H83H84H85H86H87H
90H91H92H93H94H95H96H97H
88H89H8AH8BH8CH8DH8EH8FH
98H99H9AH9BH9CH9DH9EH9FH

2、图形显示
先设垂直地址再设水平地址(连续写入两个字节的资料来完成垂直与水平的坐标地址)
垂直地址范围 AC5…AC0
水平地址范围 AC3…AC0
绘图RAM 的地址计数器(AC)只会对水平地址(X 轴)自动加一,当水平地址=0FH 时会重新设为00H 但并不会对垂直地址做进位自动加一,故当连续写入多笔资料时,程序需自行判断垂直地址是否需重新设定。GDRAM的坐标地址与资料排列顺序如下图:

这个可以使用取模小工具配合使用。
在这里插入图片描述
用带中文字库的128X64显示模块时应注意以下几点:
①欲在某一个位置显示中文字符时,应先设定显示字符位置,即先设定显示地址,再写入中文字符编码。
②显示ASCII字符过程与显示中文字符过程相同。不过在显示连续字符时,只须设定一次显示地址,由模块自动对地址加1指向下一个字符位置,否则,显示的字符中将会有一个空ASCII字符位置。
③当字符编码为2字节时,应先写入高位字节,再写入低位字节。
④模块在接收指令前,向处理器必须先确认模块内部处于非忙状态,即读取BF标志时BF需为“0”,方可接受新的指令。如果在送出一个指令前不检查BF标志,则在前一个指令和这个指令中间必须延迟一段较长的时间,即等待前一个指令确定执行完成。指令执行的时间请参考指令表中的指令执行时间说明。
⑤“RE”为基本指令集与扩充指令集的选择控制位。当变更“RE”后,以后的指令集将维持在最后的状态,除非再次变更“RE”位,否则使用相同指令集时,无需每次均重设“RE”位。

基本操作
读状态。输入RS=0,RW=1,E=高脉冲。输出:D0—D7为状态字。
在这里插入图片描述

读数据。输入RS=1,RW=1,E=高脉冲。输出:D0—D7为数据。
在这里插入图片描述

写命令。输入RS=0,RW=0,E=高脉冲。输出:无。
在这里插入图片描述
写数据。输入RS=1,RW=0,E=高脉冲。输出:无。

串口操作时序
在这里插入图片描述

初始化
在这里插入图片描述

驱动程序
1、公共代码

#include <reg51.h>
sbit lcden=P2^7;
sbit lcdwr=P2^6;
sbit lcdrs=P2^5;
unsigned char  table0[]={"去年今日此门中,"}; 
unsigned char  table1[]={"人面桃花相映红,"};
void DelayTime1ms(unsigned int DelayValue)
{
	unsigned int a,b;
	for(a=0;a<DelayValue;a++)
		for(b=0;b<182;b++);	
}

2、初始化

void init_12864()
{   
  write_com(0x30);
  write_com(0x06); 
  write_com(0x01);
  write_com(0x0c);
  write_com(0x02);
}

3、写指令

void write_com(unsigned char com) 
{   
  LCDWR = 0;           //LCDWR为读写控制端,LCDWR = 0,这里可不写   
  LCDRS = 0;          //液晶rs接口为0时,写指令,rs为1时写数据  
  P0 = com;          //将要写的指令赋给P0口,   
  DelayTime1ms(5);       //由1602读写操作时序图,先将指令赋给P0口,延时后将使能  
  LCDEN = 1;       //  端LCDEN置高,再延时一段时间,然后将LCDEN置低,这样指令  
  DelayTime1ms(5);     // 就写入到LCD了  
  LCDEN = 0;  
}

4、写一个数据

void write_data(unsigned char date)//与写指令类似,这里LCDRS设为1 
{  
  LCDRS = 1;  
  P0 = date;  
  DelayTime1ms(5);  
  LCDEN = 1;  
  DelayTime1ms(5);  
  LCDEN = 0;  
}

5、读一个数据

uchar Read_Lcd_Data()
{
	unsigned char byte;
	P0 = 0xff;       //防止低电平干扰拉低数据位
	Lcd_RW = 1;
	Lcd_RS = 1;
	DelayTime1ms(5);       //写个延时程序 为什么加延时请看时序图
	lcden= 0;
	byte = P0;
	DelayTime1ms(5);  
	lcden= 1;
	return byte;
}

在这里插入图片描述

标签:11,字符,显示,数据线,C51,--,设定,地址,指令
来源: https://blog.csdn.net/qq_41110647/article/details/120595187

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有