引脚四高电平为数据选择端,低电平为命令选择端
引脚五同理高电平为读选择端,低电平为写选择端
7-14并行输出,八个数据端口同时输出可以输出一个字
先进行读写检测,当7为1时,表明正在处理数据,则不能够进行相应的操作
只可以显示十六个,但RAM中有80位,可以左移或者右移
总结,要应用一个硬件,需要严格按照硬件手册的流程来写,如何收发命令,如何初始化硬件,如何编写发送指令,已经如何发送显示函数,都需要严格按照数据手册来进行编写。
程序部分:
程序功能能够使字符串在lcd1602上面显示并且是滚动显示,需要掌握的重点,能够数据手册编写相应的程序。
#include<reg51.h>
#include<intrins.h> //存在nop函数的定义
#define uchar unsigned char
#define uint unsigned int
bit RS=P2^5;
sbit RW=P2^6;
sbit E=P2^7;
uchar *text1[]="tomorrow will be better";
//第一行要显示的数据
uchar text2[]=""; //第二行要显示的数据
void delay_ms(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
uchar Lcd1602_ReadBusy() //读取是否忙碌
{
uchar temp;
RS=0;//设置读的状态
RW=1;
_nop_();
P3=0xff; //给总线输入0xff
/*原因:电路中存在的一个普遍的现象:高电平很容易被低电平拉低,而低电平一般不可能被高电平拉高。所以在读数据之前将单片机IO口拉高才不会影响原来数据线上的数据!*/
_nop_();
E=1;//使能端,使能端开启后数据就会传送到P0口中,并覆盖之前的P0口的值
_nop_();
temp=P3; //将总线的数据传送到temp临时变量中
_nop_();
E=0;//关闭使能端
return (temp&0x80);
/*状态字为temp(8位2进制数)的最高位,最高位为1表示禁止读写,为0表示允许读写,即temp&0x80得1表示忙,得0表示不忙*/
}
void Lcd1602_WriteCom(uchar com)
{
while(Lcd1602_ReadBusy());
RS=0; //命令
RW=0; //写
_nop_();
P3=com; //准备发送命令
_nop_();
_nop_();
_nop_();
_nop_();
E=1; //使能端拉高才能交换数据
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
E=0; //使能端拉低关闭交换数据
_nop_();
_nop_();
}
void Lcd1602_WriteData(uchar dat)
{
while(Lcd1602_ReadBusy());
RS=1; //写数据
RW=0;
_nop_();
P3=dat;
_nop_();
_nop_();
_nop_();
_nop_();
E=1;
_nop_();
_nop_();
E=0;
_nop_();
_nop_();
}
void Lcd1602_init() //初始化函数
{
delay_ms(15);
Lcd1602_WriteCom(0x38); //显示模式设置
delay_ms(5);
Lcd1602_WriteCom(0x38);
delay_ms(5);
Lcd1602_WriteCom(0x38);
Lcd1602_WriteCom(0x0f);
Lcd1602_WriteCom(0x0c); //显示开
Lcd1602_WriteCom(0x01); //清屏
Lcd1602_WriteCom(0x07); //地址指针移位指令
}
void main()
{
uchar i = 0;
uint k = 2;
char *pa;
Lcd1602_init();
Lcd1602_WriteCom(0x80|0x10); //0x80是第一行的第一个字符的地址
pa
= text1[i];
while(*pa!='0')
{
Lcd1602_WriteData(*pa++);
while(k--);//延迟使的数据能够显示
}
//Lcd1602_WriteCom(0x80+0x40);
/*表示的方法有很多,可以用0xc0,0x80+0x40,0x80|0x40等等*/
/*for(j=0;j<10;j++)
Lcd1602_WriteData(text2[j]);*/
}
Tomorrow在LCD1602中为移动显示
注意指针的使用,指针的使用能够极大地带来方便。