一、关于lcd1602:
在编写lcd1602程序前,我们必须了解其手册上一些非常重要的信息,如果这些信息不能理解透彻,编程可能会遇到或多或少的问题,在此先大致归纳几点。
1.管脚:1602共16个管脚,但是编程用到的主要管脚不过三个,分别为:rs(数据命令选择端),r/w(读写选择端),e(使能信号);以后编程便主要围绕这三个管脚展开进行初始化,写命令,写数据。
以下具体阐述这三个管脚:
rs为寄存器选择,高电平选择数据寄存器,低电平选择指令寄存器。
r/w为读写选择,高电平进行读操作,低电平进行写操作。
e端为使能端,后面和时序联系在一起。
除此外,d0~d7分别为8位双向数据线。
2.操作时序:
注:关于e=h脉冲——开始时初始化e为0,然后置e为1,再清0.
读取状态字时,注意d7位,d7=1,禁止读写操作;d7=0,允许读写操作;
所以对控制器每次进行读写操作前,必须进行读写检测。(即后面的读忙子程序)
3.指令集:
lcd_1602 初始化指令小结:
0x38 设置16*2显示,5*7点阵,8位数据接口。
0x01 清屏。
0x0f 开显示,显示光标,光标闪烁。
0x08 只开显示。
0x0e 开显示,显示光标,光标不闪烁。
0x0c 开显示,不显示光标。
0x06 地址加1,当写入数据的时候光标右移。
0x02 地址计数器ac=0;(此时地址为0x80) 光标归原点,但是ddram中断内容不变。
0x18 光标和显示一起向左移动。
4.显示地址:
lcd1602内部ram显示缓冲区地址的映射图,00~0f、40~4f分别对应lcd1602的上下两行的每一个字符,只要往对应的ram地址写入要显示字符的ascii**,就可以显示出来。
5.读写时序:
时序图1602手册中有,这里不引用了。时序图很重要,编程就是根据时序图设置寄存器,让lcd工作。
二、lcd1602程序编写流程:
lcd1602在了解完以上信息后便可以编写,这里我们把程序分为以下几步:
1.定义lcd1602管脚,包括rs,r/w,e。这里定义是指这些管脚分别接在单片机哪些i/o口上。
现举例如下:
sbit en=p3^4;
sbit rs=p3^5;
sbit rw=p3^6;
2.显示初始化,在这一步进行初始化及设置显示模式等操作,包括以下步骤:
设置显示方式。
延时。清理显示缓存。
设置显示模式。
通常推荐的初始化过程如下:
延时15ms
写指令38h
延时5ms写指令38h
延时5ms写指令38h
延时5ms注:以上写38h指令可以看情况省略1~2步。
以上都不检测忙信号)
以下都要检测忙信号)
写指令38h
写指令08h 关闭显示。
写指令01h 显示清屏。
写指令06h 光标移动设置。
写指令0ch 显示开及光标设置。
3.设置显示地址(写显示字符的位置)。
4.写显示字符的数据。
三、lcd1602各子程序模块及主程序编写:
现在按照上面编写程序的流程,给出各子程序模块及主程序的例子。
1.头文件,宏定义,定义管脚等:
#include<>
#include <>
#define uchar unsigned char
#define uint unsigned int
sbit en=p3^4;
sbit rs=p3^5;
sbit rw=p3^6;
uchar code table0=此条语句为显示字符串时定义的字符串数组。
2.lcd1602基本初始化子程序:
void lcd1602()
en=0;rs=1;
rw=1;p0=0xff; /这里p0为与lcd d0~d7相连的i/o口。
3.读忙子程序:
voidread_busy()
p0=0xff;
rs=0;rw=1;
en=1;while(p0&0x80); p0和***相与,d7位若不为0,停在此处。
en=0; /若为0跳出进入下一步;这条语句的作用就是检测d7位。
若忙在此等待,不忙跳出读忙子程序执行读写指令。
4.写指令写数据子程序:
void write(uchari,bit j)
read_busy();
p0=i; /其中i=0,写指令;i=1,写数据;
rs=j;rw=0;
en=1;en=0;
5.延时子程序:
void delay(uint c) /功能为提供初始化等其他子程序中的延时1xc ms
uinta,b;
for(a=0;afor(b=0;b<120;b++)
6.lcd1602初始化子程序:
void init() 完全按照要求初始化流程来,中间省略了一步写指令38h
delay(15);
write(0x38,0);
delay(5);
write(0x38,0);
write(0x08,0);
write(0x01,0);
write(0x06,0);
write(0x0c,0);
7.显示单个字符子程序:
void display_lcd_byte(uchary,ucharx,uchar z) /y=0,1(起始行)x=0~15(起始列)z=想写字符的ascii码。
if(y) /是否显示在第二行(若在第一行y=0,不进入if语句,若在第二行,进入if语句。
x+=0x40; /第二行起始地址加上列数为字符显示地址。
x+=0x80; /设置数据指针位置。
write(x,0);
write(z,1); 写入数据。
8.显示字符串子程序:
void display_lcd_text(uchary,ucharx,uchar table)y,x同上字符显示,table字符串数组。
uchar z=0;
uchar t;
t=strlen(table)+x; /求得字符串长度加上起始列位置。
while(x{ /没有16个字符,从而不够位产生乱码;
display_lcd_byte(y,x,table[z]);逐位显示数组内字符。
x++;z++;
9.主程序:
主程序里除了放入初始化程序外就是加入自己编写的显示子程序,根据你所要的不用功能可以编写各种类型的显示子程序,这里不做详细介绍,以下举例为显示一个字符和显示字符串的显示子程序。
void main()
lcd1602();
init();
display_lcd_byte(0,0,'a');显示一个字符。
display_lcd_text(1,3,table); 显示字符串。
while(1);
到此,让lcd1602显示的操作流程和编程思想基本可以告一段落了,这里有一个完整的显示程序可显示2行英文:大家可依样画瓢,自己修改运行,但是1602的功能实现远不止这些。利用1602你可以做出动态效果的显示,并且除了显示一般字符外,1602还支持自定义字符等等其他一些功能,下面在最后简单介绍下显示动态效果和自定义字符。
一、显示动态效果:
显示动态效果包括让一个字符或字符串原位置闪烁,或者前后移动等等。其实动态效果原理很简单,就是简单的利用延时。
例如让字符原位置闪烁,可以认为是先让1602显示字符,延时一段时间后,可以显示空格或者直接清屏操作都可以达到让字符消失不见的效果,再延时一段时间后再让1602显示这个字符。
同理,让字符前后移动也是这样,例如让字符在第一个位置显示,延时一段时间后让其在后面第二个位置显示,只要显示地址加1,然后显示即可。字符串也是同样的道理。
在这里补充一点就是如何让字符串从1602第16个地址外进入,动态向前移动。其实可以通过显示地址表我们知道起始位置开始后1602一行只能显示16个字符,但是一行的地址却远远不止16个。大家可以看到第一行显示地址是从00~27,然而能显示在1602可见范围的只有00~0f,后面的位置其实就是起到一个缓冲的作用,你完全可以让字符数据存在在10地址后的ram中,只不过,我们无法看到就是了,如果存在10前的地址我们就能看到显示。
因此,我们可以先把显示起始地址设在10地址后的某一个位置,然后让字符显示地址每次加1,当加到0f时,我们就可以看到字符串第一个字符出现在1602的最末一位,然后继续向前移动。
下面给出一段字符串移动显示的例子:
voiddisplay_lcd_byte(uchary,ucharx,uchar z)
if(y)x+=0x40;
x+=0x80;
write(x,0);
write(z,1);
voiddisplay_lcd_text(uchary,ucharx,uchar table)
uchar z=0;
uchar t;
t=strlen(table)+x;
while(x{
display_lcd_byte(y,x,table[z]);
x++;z++;
display_lcd_byte(y,x,'
/前两个子程序是显示子程序。
160句英语入门短句
1.hi 你好!2.nice to meet you.很高興見到你。3.how are things going?近來如何?4.keeping busy?近來忙嗎?5.how are you doing?你好嗎?i m doing great.我過得很好。6.how s everything?一切都...
疯狂英语160句实用会话
1.hi.你好。2.nice to meet you.见到你很高兴。3.how are things going?近况如何?4.keeping busy?近来忙吗?5.how are you doing?你好吗?6.how s everything?一切都好吗?7.how h e you been?...
读书名言大全160句
1 不怕读得少,只怕记不牢。徐特立。2 莫等闲,白了少年头,空悲切!岳飞。3 书籍是培育我们的良师,无需鞭答和根打,不用言语和训斥,不收学费,也不拘形式,对图书倾注的爱,就是对才智的爱。德伯里。4 熟读唐诗三百首,不会作诗也会吟。孙洙 唐诗三百首序 5 书到精绝潜心读 文穷情理放声吟。对联集锦 6 ...