编程初始化条件–写命令
LCD1602液晶模块内部的控制器共有11条控制指令
**
一、
**
DDRAM(display data RAM)是显示数据随机存储器
CGROM :1602液晶模块内部的字符发生存储器(CGROM:Custom Glyph Read-only Memory定制字符只读存储器)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A” ; 首先显示内容分为两种,一种是常用字符,存储在CGROM中,用户可以直接调用,另一种是自定义的字符,比如自己设计的一些奇怪的图形之,存储在CGRAM;
对于CGRAM和CGROM只是在你想要定制你自己想要的字符时才用到,也是写命令进行初始化时设置的指令
【注意】这个图在指令设置时对应的地址不一定对,主要是读者方便理解CGRAM和CGROM
LCD的已有的字模存储在CGROM中,自定义的存储在CGRAM,留给自定义的位置只有8个地址,字模地址为01000000-01000111八个地址,也就是最多自定义8个符号或者图形。
LCD1602按其说明书说明,可以设置成为四位总线(想当于4个并行接口),原八位并口输入接线可以减少四个,即只接D4-D7,这适用于单片机接口比较少或比较紧张的情况下。不过,接成四位总线后,发送任何八位数据都应分两次进行,先发高四位,再发低四位。在初始化时,应将LCD1602设置成四位总线。其他控制与八位总线完全相同。
定制字符这部分可以参考一下该作者的
原文链接:https://blog.csdn.net/weixin_42133183/article/details/80911996
二
地址是用16进制表示的,比如00H表示第一个字节,十六进制27转换为十进制就是39,表示第40个字节;第二行是直接从十六进制40H开始的(第一行后面的还有一些地址不使用所以在这不提,仅提到这80个字节)
举例比如第二行第一字符0100 0000(40H) 根据指令8可知,DDRAM存储器的地址设置(1000 0000)+ 屏幕字符坐标的具体地址(0100 0000)
这个用处只是用来你显示的数据的第一个字符从哪里开始
# include"reg51.h"
typedef unsigned int u16;
typedef unsigned char u8;
#define lcd1602D0_D7 P0 //D0-D7
sbit lcd_E=P2^7; //使能端
sbit lcd_W=P2^5;
sbit lcd_RS=P2^6;
void delay(u16 i)
{
while(i--);
}
u8 display1[]=" TEST Distance!!!";
u8 display2[]=":0.0000 m";//输出一个字符串
void lcdwritecommand(u8 comd) //先写命令。。。
//命令也是靠时序来执行的
{
lcd_E=0;//使能
lcd_RS=0;//0表示选择写命令,1表示选择写数据
lcd_W=0;// 0表示写,1表示读
lcd1602D0_D7=comd;//将该一个字节数据放入总线(直接对应p0管脚)
delay(10);//视频说要延时1个ms???
lcd_E=1;
lcd_E=0; //使能产生一个下降沿
}
void lcdwritedat(u8 dat) //后写数据。。。。根据写数据时序图来写
//(以下内容已经是在写时序中)
{
lcd_E=0;//使能
lcd_RS=1;//0表示选择写命令,1表示选择写数据
lcd_W=0;// 0表示写,1表示读
lcd1602D0_D7=dat;//将该一个字节数据放入总线(直接对应p0管脚)
delay(10);//
lcd_E=1;
lcd_E=0; //使能产生一个下降沿
}
void lcdinit()
{
lcdwritecommand(0x38);//LCD1602指令4,选择8总线(并行口)
lcdwritecommand(0x0f);//指令3
lcdwritecommand(0x06);//指令2
lcdwritecommand(0x01);//指令1
lcdwritecommand(0x8f);//显示初始数据光标第一行第一列???
//问题一:出现一个问题就是数据是从第6位开始显示的
}
void main()
{
u8 i,j;
lcdinit(); //lcd初始化
for(i=0;i<21;i++)
{
lcdwritedat(display1[i]);//第一行一个字符一个字符输出
delay(10);
}
lcdwritecommand(0xc1);
for(j=0;j<9;j++)
{
lcdwritedat(display2[j]);//第二行一个字符一个字符输出
delay(10);
}
while(1);
}