今天,小编给各位电子爱好者伙伴讲解这么一个程序,也许你看了郭天祥的10天学会单片机后感觉好多代码都不能亲手动手去写对吗?其实自己写代码写模块都是有一定的方法的,掌握了一定的方法,以后不管写什么,你都会如鱼得手,小编总结了一个很多人都头疼的问题,如何写一个液晶显示的程序呢?代码好长!!!!怎么办?害怕了?没有动力干了?小编告诉你,你立马有动力,不再惧怕类似1602的模块!!请往下看。
首先:
要写一个液晶1602的程序,我们需要明白液晶有三个端口是要写入相关的数据的;分别是E、RS、RW。
数据手册内容众多,小编就不一一阐释了;
所以,请看lcd1602数据手册:http://www.51hei.com/mcu/827.html
接着:
看完了数据手册,有木有发现灵感?是不是好多都是可以看着自己就可以敲出来?
好了,我们开始写程序:
写液晶的时候分为以下步骤:
1、写指令(看看数据手册里有的)
void writecmd(uchar com)
{
E=0; //为什么要写这一条呢,看看时序图就清楚了
RS=0;
RW=0;
P0=com;
delay(2); //延时一下会稳定很多,后面一条也是一样的
E=1;
delay(2);
E=0;
}
//以上的P0就是液晶送数据的端口,当然你可以是P2口,看你的 电路是怎么样那就怎么改,至于为什么是com,这是个自定义形式参数来的,也可以改成别的,但是不能是关键字,这个参数传的就是你想要写的指令;下面写数据的P0是你想要写的数据。详情看看大程序便知
2、写数据(同样数据手册也有)
void writedata(uchar dat)//写数据,函数名随便你定义看得懂就行
{
E=0; //写数据和写命令的方法差不多,复制过来。照着数据手 //册的写数据要求去写!
RS=1;
RW=0;
P0=dat;
delay(2);
E=1;
delay(2);
E=0;
}
3、初始化(一样的,数据手册也有,照写)
void init(void)
{ delay(15);
writecmd(0x38);
delay(5);
writecmd(0x38);
delay(5);
writecmd(0x38);
writecmd(0x38);
writecmd(0x08);
writecmd(0x01);
writecmd(0x06);
writecmd(0x0c);
}
好了一个液晶的基本操作就是这三部分组成的,不难吧?
接下来来看看我们如何显示如图所示的字符:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
//这三个引脚参考资料
sbit E=P2^7; //1602使能引脚
sbit RW=P2^6; //1602读写引脚
sbit RS=P2^5; //1602数据/命令选择引脚
uchar tab1[]=" www.51hei.com "; //要显示什么就在这儿改
uchar tab2[]="LCD1602 test ok!"; //[size=15.5555562973022px]要显示什么就在这儿改
void delay(uint del) //延时1ms
{
uint i,j;
for(i=0;i<del;i++)
for(j=0;j<=168;j++);
}
void writecmd(uchar com) //写指令
{
E=0;
RS=0;
RW=0;
P0=com;
delay(2);
E=1;
delay(2);
E=0;
}
void writedata(uchar dat)//写数据
{
E=0;
RS=1;
RW=0;
P0=dat;
delay(2);
E=1;
delay(2);
E=0;
}
void init(void) //初始化
{
delay(15);
writecmd(0x38);
delay(5);
writecmd(0x38);
delay(5);
writecmd(0x38);
writecmd(0x38);
writecmd(0x08);
writecmd(0x01);
writecmd(0x06);
writecmd(0x0c);
}
void main()
{ uchar j;
init();
writecmd(0x80); //告诉液晶在哪个地方显示 (设置地址指针)//80H+00
for(j=0;j<16;j++) //有16个字符,要循环16次
{
writedata(tab1[j]);
delay(2);
}
writecmd(0x80+0x40); //再设置第二行的起始位置80H+40H
for(j=0;j<16;j++) //有16个字符,要循环16次
{ writedata(tab2[j]);
delay(2);
}
while(1); //让液晶显示就一直停在这里。
}
好了,你们可以照着我这个程序去修改得到你们想要的显示结果,同样也可以发挥一下你们的想法,如何让液晶进行移屏显示呢?怎么样做出移动的效果呢?有待大家的努力噢!小编最主要的目的是要告诉大家,任何模块拿起来都不要惧怕,把数据手册看一遍,看不懂再看一遍,然后看看别人是怎么写的,自己动手改一遍,再写一遍,转化为自己的东西,这样就可以学到经验了。
|