赞
踩
编程初始化条件–写命令
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); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。