今日无事,就把1602液晶试着跟这教程走了一遍
边抄边自己写 写了一点代码 感觉目前按模块来学习51还是蛮轻松的,这种学习效率也挺高的。不说了,先从原理图和1602的datasheet开始了
本人的开发板是从同学那拿来的,算是一个精简的51开发板吧 先看看关于1602的连接方式信号定义
这里提一下,板上已经将5脚直接接地了,根据管脚信号定义可知5脚是读写控制端,接地就是意味着液晶就只能是写数据而不能读数据 这个没啥太大的关系,初学嘛,写就行了 3脚接了可变电阻用来调节亮度
下面查看一下datasheet的操作指令部分和读写操作部分
在根据时序图可以看出 针对本开发板 RW==0
写指令的时候,RS=0,需要写入指令先建立好,然后EN来个高脉冲(这个高脉冲有持续时间要求)就可以把指令写入LCD
写数据的过程和以上过程类似,就是RS=1罢了
下面根据上图总结一下基本操作指令
显示模式指令0x38 显示开关指令一般用0x0f或者0x0e(开显示,显示不闪烁光标)
之后的光标移动方向指令一般用0x06(写入字符后指针+1光标+1)
另外一个整屏移动指令0x18要在英文datasheet中才有,这个中文datasheet省略了
(这个指令主要针对的是写入的字符逐渐从右“飞入”显示屏)
地址指针指令:0x80+(0x00~0x27) 第一行
0x80+(0x40~0x67) 第二行
清屏指令:0x01
好了,了解了以上这些,可以开始试用了
下面是代码
/*################# 开发板说明:R/W读写使能端已经接地,说明该液晶的功能已经限定了只能写入#########*/
#include <reg52.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcdrs="P2"^0;
sbit lcden="P2"^1;
uchar table1[]="I love Nightwish";
uchar table2[]="dnchina.com";
uchar i,l1,l2;
void delay(uchar z) //延时函数
{
uint a,b;
for(a=100;a>0;a--)
for(b=z;b>0;b--);
}
void writedata(uchar dat)
{
lcdrs=1;
P0=dat;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void writecode(uchar cod)
{
lcdrs=0;
P0=cod;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void initlcd() //液晶初始化函数
{
lcden=0;
writecode(0x38);
writecode(0x0e);
writecode(0x06);
writecode(0x01);
writecode(0x80+0x10);
}
void main()
{
initlcd();
l1=strlen(table1);
l2=strlen(table2);
for(i=0;i<l1;i++)
{
writedata(table1);
delay(30);
}
writecode(0x80+0x50);
delay(5);
for(i=0;i<l2;i++)
{
writedata(table2);
delay(10);
}
for(i=0;i<16;i++)
{
writecode(0x18);
delay(40);
}
while(1); //不明白,不加个while(1)的话蜂鸣器居然会启动?
}
不行了,代码贴上去本来还想加一点注释,没想到添的几个字把后面的字都覆盖了,暂时也不知道怎么解决就干脆不加注释了
从函数名就可以看出那几个函数是干什么的
另外非常搞不明白,不插LCD的时候把程序写入单片机居然蜂鸣器会启动,我真的是想不同,控制蜂鸣器的三极管开关是P2.2口,这里根本就没碰过P2.2,居然会有频率的发出声音,我真的见鬼了,还希望大侠给点解释。
烧入程序后,呵呵,字符就从右边飞入屏幕了,1602的初试成功啦
还有就是如果你想居中显示的,你要调整一下初始的指针地址就可以了 自己试试吧
还有,一开始我居然把液晶插反了,程序烧都烧不进去。。。
第一篇很二百五的日志,记录自己做的整个过程而已,学在其中,乐在其中~~
ilove314_323192455 2008-10-4 07:41