查看: 3894|回复: 4

[求助] 【玩转ChipKIT Uno32】第六节LCD1602字符液晶驱动(4线方式)

[复制链接]

该用户从未签到

发表于 2012-8-8 12:55:47 | 显示全部楼层 |阅读模式
分享到:
原帖由
nongxiaoming
发自:dev.eefocus.com
------------------------------------------------------------------------------------------------------------------------------------------
上一节我们讲了如何使用8线方式驱动LCD1602字符液晶,LCD1602自带ASCII码字符,使用比较方便,但是它的接线太多,占用太多IO,实验不方便,笔者实验时因为接错了一根线,导致驱动不成功白白浪费了不少时间检查,下面我们在之前的代码基础上稍微修改一下,改成4线驱动方式,让我们可以省出4IO,少接4根线。
首先说一下连线,其他不变,使用数据线的高四位,也就D4D5D6D7作为数据线。因为我们的数据线是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);         //构造lcd1602RS8,RW连接9E连接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

回复

使用道具 举报

该用户从未签到

发表于 2012-8-24 09:06:32 | 显示全部楼层
好帖子不少啊
回复 支持 反对

使用道具 举报

  • TA的每日心情
    难过
    2015-7-11 15:23
  • 签到天数: 567 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2012-9-8 09:16:25 | 显示全部楼层
    标记下,以后要用再来拿,嘿嘿
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-3-2 10:14
  • 签到天数: 166 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2013-11-23 05:38:06 | 显示全部楼层
    帮助很大, 多谢了!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2013-12-10 18:06:15 | 显示全部楼层
    哪个呦,发这么好的帖子,顶你
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /5 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-12-21 14:15 , Processed in 0.158866 second(s), 24 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.