默认的LCD1602都是8线驱动,数据口D0~D7都要接线,这种方式对于写数据而言,很方便,不需要考虑太多。但是因为要的数据线过多,在实际布线过程中,可能会考虑使用四线驱动。
因为少了4根线,原来的11根线,现在只需要7根就可以了。
proteus电路设计与实验效果:
源代码:
#include <reg52.h>#include <stdio.h>#include <string.h>unsigned char code table1[] = {"hello,world."};unsigned char code table2[] = {"0123456789"};sbit RS=P2^0; sbit RW=P2^1; sbit EN=P2^2; void delay(unsigned int n){unsigned int i=0,j=0;for (i=n;i>0;i--)for (j=0;j<110;j++); }void writecmd(unsigned char command){ RS = 0; RW = 0; P3 = command; EN = 1; delay(2);EN = 0;RS = 0; RW = 0;P3 = command << 4;EN = 1; delay(2);EN = 0;}void writedata(unsigned char dat){RS = 1; RW = 0; P3 = dat;EN = 1; delay(2);EN = 0;RS = 1; RW = 0;P3 = dat << 4;EN = 1; delay(2);EN = 0;}void display(unsigned int len,unsigned char *s){unsigned int i;for(i=0;i<len;i++)writedata(s[i]);}void init_1602(void){delay(50);writecmd(0x33);//原来1602初始化成4位数据线之前必需先初始化成8位(此时命令发送方式是8位格式,但数据线只需接4位)writecmd(0x32);//然后再改到4位线宽,这样初始化才稳定writecmd(0x28);//四线模式设置writecmd(0x0c);//显示开--对应开关显示控制指令writecmd(0x01);delay(30);}void main(void){init_1602();writecmd(0x80);display(strlen(table1),table1);writecmd(0xc0);display(strlen(table2),table2);while(1); }
需要注意的是,四线接法,虽然代码上与八线接法很多雷同的地方,但是仍然需要注意,这里四线接法在初始化的时候:
writecmd(0x33);writecmd(0x32);writecmd(0x28);
这几个很关键,尤其是0x28是设置四线模式,但是前面几项0x33,0x32是先设置八线模式,然后切换到四线模式,这一步最最关键,往往很多资料上都没有提,我经过很多次试验,发现这两句代码太关键了。
四线模式写指令和数据的时候,需要先写高四位,再写低四位,所以代码上有这样的地方:
P3 = command;... P3 = command << 4;
注意了这两块,四线模式就很容易了。
在很多地方提到,四线模式,需要RW接地,其实从代码和试验结果来看,并不是一定要RW接地。
///
按照四线驱动的仿真实验理论,我通过自己的普中-2单片机成功接线并让LCD1602显示了结果。实验现象如下所示:
唯一的缺点就是,显示屏不太亮,我根据仿真实验接线,VDD接到了开发板上的5v电源,效果就这样,但是可以大概看出来,字母和数字显示没问题。
这个接线完全按照仿真实验接线,包括VSS,VDD,VO都需要接线,VSS,VO需要接地。VDD接电源。