原帖由
nongxiaoming
发自:dev.eefocus.com
------------------------------------------------------------------------------------------------------------------------------------------
上一节我们讲了如何使用8线方式驱动LCD1602字符液晶,LCD1602自带ASCII码字符,使用比较方便,但是它的接线太多,占用太多IO,实验不方便,笔者实验时因为接错了一根线,导致驱动不成功白白浪费了不少时间检查,下面我们在之前的代码基础上稍微修改一下,改成4线驱动方式,让我们可以省出4个IO,少接4根线。 首先说一下连线,其他不变,使用数据线的高四位,也就D4,D5,D6,D7作为数据线。因为我们的数据线是4位的,所以我们将之前在lcd1602.h中定义的DATAPIN[8]改成DATAPIN[4]。在lcd1602.cpp中我们要进行几处的修改,具体修改如下:
将 lcd1602::lcd1602()改为如下代码,因为只用了4根数据线 lcd1602::lcd1602(char *dataPin,char rsPin,char rwPin,char aPin) { for(int i=0;i<4;i++) { DATAPIN=dataPin; } RS=rsPin; RW=rwPin; A=aPin; } 将void lcd1602:ataOut() 改写如下: void lcd1602:ataOut(unsigned char dat) //遍历数据 { for(int i=0;i<4;i++) { if(dat&0x01) { digitalWrite(DATAPIN,HIGH); }else { digitalWrite(DATAPIN,LOW); } dat>>=1; } } 因为我们只用了4条数据线,所以一个字节必须要分两次传输,我们还需要改写写指令函数和写数据函数,具体如下: void lcd1602::WriteCmd(unsigned char cmd) { if(ReadBusy())delay(2); digitalWrite(RS,LOW); digitalWrite(RW,LOW); DataOut(cmd>>4); //写高四位 digitalWrite(A,HIGH); delay(1); digitalWrite(A,LOW); delay(1); DataOut(cmd); //写低四位 digitalWrite(A,HIGH); delay(1); digitalWrite(A,LOW); } void lcd1602::WriteData(unsigned char dat) { if(ReadBusy())delay(2); digitalWrite(RS,HIGH); digitalWrite(RW,LOW); DataOut(dat>>4); //写高四位 digitalWrite(A,HIGH); delay(1); digitalWrite(A,LOW); delay(1); DataOut(dat); //写低四位 digitalWrite(A,HIGH); delay(1); digitalWrite(A,LOW); } 最后就是我们的初始化函数也要修改一下,在测试时必须告诉液晶屏工作在4线方式,这个很重要,不然我们前面改的都白费力气了。具体修改如下: void lcd1602::Init(void) { for(int i=0;i<4;i++) { pinMode(DATAPIN,OUTPUT); digitalWrite(DATAPIN,HIGH); } pinMode(RS,OUTPUT); digitalWrite(RS,HIGH); pinMode(RW,OUTPUT); digitalWrite(RW,HIGH); pinMode(A,OUTPUT); digitalWrite(A,HIGH); delay(20); WriteCmd(0x33);//原来1602初始化成4位数据线之前必需先初始化成8位(此时命令发送方式是8位格式,但数据线只需接4位) delay(10); WriteCmd(0x32);//然后再改到4位线宽,这样初始化才稳定 delay(10); WriteCmd(0x28);//四线模式设置 delay(10); WriteCmd(0x0c);//显示开--对应开关显示控制指令 delay(10); WriteCmd(0x01); } 好了,到此我们就修改好了。最后就是将我们的测试主程序复制过来,然后不之前定义的8位的数据线改成4位就好了,具体如下: #include "lcd1602.h" char dPin[4]={4,5,6,7}; //定义数据线连接的管脚,笔者的D4连接的是4管脚 lcd1602 mylcd(dPin,8,9,10); //构造lcd1602,RS连8,RW连接9,E连接10 void setup() { mylcd.Init(); //初始化液晶 mylcd.PutString(1,1,"Hello,I am ChipKIT Uno32!"); //第一行显示 mylcd.PutString(2,1,"I love Uno32!^v^"); //第二行显示 } void loop() { mylcd.Rolling(); //滚动一个字节 delay(1000); //延时1S } 编译并下载到板子运行,哈哈,效果我就不多说了~ 好了,本节就讲到这里,谢谢大家。如有错误欢迎大家向我反馈,我的电子邮箱: nongxiaoming@igxnu.com
|