一般情况下,LCD1602与单片机连接的线路共有11条,其中有8条数据线,3条控制线(其余的5条为电源和地)。如果把它们都连接上,将占用较多的单片机的接口。那么如何减少接口呢? LCD1602还有一种使用高4位数据线的接法,可以减少单片机的负担。另外,RW的控制也并非是必用的,如果仅仅是用于读取LCD1602“忙”的状态,就可以用稍事等待来代替。这样一来,RW就可以直接接地,使LCD1602永远处于写入的状态。那么,LCD1602和单片机之间就仅仅需要6条线了,这算是一种比较简洁的接法了。
下面的一个例子是使用P1口的高4位连接到LCD1602的高4位数据线。
源代码:
1602.c
(4.39 KB)
(下载次数: 280, 2013-12-10 18:41 上传)
对应的原理图:
(备注:程序中只使用了八位数据线的高四位)
/*==========================================================
* 开发人员:laowang
* 当前版本:V1.0
* 创建时间:12/8/2013
* 修改时间:
* 功能说明:让1602显示“51Start:” “the best one!”
*==========================================================*/
* 数据口:P1.4-P1.7
* 控制口:lcdrs=P3^2 lcdrw=P3^3 lcden=P3^4
* 传输方式:并口,四线(高四位)
*==========================================================*/
#include
#define uchar unsigned char
#define uint unsigned int
***it lcdrs=P3^2; //数据/命令选择端,低电平为指令,高电平为数据
***it lcdrw=P3^3; //读写控制端,低电平为写
***it lcden=P3^4; //使能端
uchar code table1[]=" 51Start: ";
uchar code table2[]=" the best one! ";
void delay(uint x) //延时 x 毫秒
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
/*==========================================================
*函数名称:Lcd_1602_write(uchar com,date)
*功 能:向1602写数据/指令
*入口参数:com(com=0 写命令 com=1 写数据)
*出口参数:
*说 明:四线用的是1602的高四位DB4-DB7,单片机的数据口为P1口的高四位P1.4-P1.7
*==========================================================*/
void Lcd_1602_write(uchar com,date)
{
uchar i;
lcdrw=0; //设置为写
lcdrs=com; //将形参传给lcdrs
for(i=0;i<2;i++) //每次写四位,写完一个数据/命令(8位)需要两次
{
lcden=1;
P1=(P1&0x0f)|(date&0xf0); //将date的高四位送入P1,同时保持P1的低四位不变
//如果使用P1的低四位的话,则该处应该改为:P1=(P1&0xf0)|((date>>4)&0x0f);
delay(3); //适当延时,数据稳定
lcden=0; //送入数据
date<<=4; //低四位左移到高四位
}
}
/*==========================================================
*函数名称:void Lcd_1602_init()
*功 能:对1602进行初始化
*入口参数:
*出口参数:
*说 明:用四线时,1602的初始化只需要高四位数据就可以完成,在初始化完成之后必须再传入四位数据,需注意。
* 执行完write_1602(0,0x28);之后液晶已经初始化,其实在执行了一半的时候就已经初始化完成,此时又传入了
四位数据(一个写语句会传入8位数据),这时候如果直接写数据的话,就会形成乱码
*==========================================================*/
void Lcd_1602_init()
{
Lcd_1602_write(0,0x28); //0x28=0010 1000,将液晶设置为16*2显示,5*7点阵,4位数据口
delay(5); //
lcden=1; //
lcden=0;
Lcd_1602_write(0,0x28); //显示方式设置
Lcd_1602_write(0,0x0e); //设置开显示,不显示光标
Lcd_1602_write(0,0x06); //默认(0x06)写入新数据后光标右移 屏幕不移动
Lcd_1602_write(0,0x01); //显示清0,数据指针清0
}
//主函数
void main()
{
uchar num;
Lcd_1602_init();
Lcd_1602_write(0,0x80); //第一行
for(num=0;num<16;num++)
{
Lcd_1602_write(1,table1[num]); //写数据
delay(3);
}
Lcd_1602_write(0,0xc0); //第二行
for(num=0;num<16;num++)
{
Lcd_1602_write(1,table2[num]);
delay(3);
}
while(1);
}