查看: 3875|回复: 3

[求助] 【玩转 ChipKIT Uno32】第五节LCD1602字符液晶驱动(8线模式)

[复制链接]

该用户从未签到

发表于 2012-8-8 13:00:13 | 显示全部楼层 |阅读模式
分享到:
原帖由
nongxiaoming
发自:dev.eefocus.com
------------------------------------------------------------------------------------------------------------------------------------------
  上一节我们讲了如何将自己写好的驱动文件加入到库中,这样可以让我们的开发更加的便捷。接下来我们就主要讲各种模块的驱动代码的编写了,首先我们来讲一下LCD1602字符液晶屏的驱动。
  LCD1602字符液晶屏的驱动有两种,分别为8线方式和4线方式。这里的8线和4线主要是讲数据线的条数,并不是说总的连接线条数,这一节我们讲的是8先方式的驱动。
下面我们先简单的介绍一下1602字符液晶。
1.jpg
上图就是我们今天要驱动的LCD1602液晶。1602能够同时显示16x02即32个字符。(16列2行),是一种专门用来显示字母、数字、符号等的点阵型液晶模块它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符。每位之间有一个点距的间隔每行之间也有间隔起到了字符间距和行间距的作用。
1602采用标准的16脚接口,如下图:
2.jpg
1脚:VSS为电源地   
2脚:VDD5V电源正极   
3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会 产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。        
4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。   
6脚:E(EN)端为使能(enable)端。   
714脚:D0D78位双向数据端。   
1516脚:空脚或背灯电源。
15脚背光正极,16脚背光负极。
  
   下面是1602的读写操作说明:
3.jpg
  LCD1602初始化过程如下:
4.jpg
     好了,关于1602字符液晶就介绍这么多了,需要更多了解请翻阅数据手册。下面我们开始写我们的驱动代码。首先新建工程命名为“lcd1602test”,同时在工程中新建一个“lcd1602.cpp”和一个“lcd1602.h”文件用于编写我们的驱动。
lcd1602.h中输入一下代码:
#ifndef __LCD1602_H       //防重复包含
#define __LCD1602_H   
#include "WProgram.h"      //包含板子硬件信息
class lcd1602              //声明LCD1602
{
public:
lcd1602(char *dataPin,char rsPin,char rwPin,char aPin);        //构造方法
void DataOut(unsigned char dat);                          //用于将数据遍历到数据管脚
void Init(void);                                         //液晶屏初始化
void WriteCmd(unsigned char cmd);                        //写指令
void WriteData(unsigned char dat);                         //写数据
void SetXY(unsigned char x,unsigned char y);                //设置光标点
void PutChar(unsigned char x,unsigned char y,const char c);     //写一个字符
void PutString(const char *s);                              //写一个字符串
void PutString(unsigned char x,unsigned char y,const char *s);    //特定位置写一个字符串
char ReadBusy(void);                                     //读忙状态
void Rolling(void);                                       //滚动显示
private:
char DATAPIN[8];                                       //数据管脚定义
char RS,RW,A;                                          //控制管脚
};
#endif
lcd1602.cpp的代码较多,所以不一一说明了,简要介绍几个。
void lcd1602:ataOut(unsigned char dat)     //遍历数据
{
     for(int i=0;i<8;i++)
   {
      if(dat&0x01)               
     {
       digitalWrite(DATAPIN,HIGH);
     }else
     {
       digitalWrite(DATAPIN,LOW);
     }
     dat>>=1;
   }
}
      这个函数主要用于将数据的搞个位对应输出到LCD的对应的数据线,因为笔者没有找到可以总线操作的方式,板子连接LCD的数据线也不是连续的,所以就这样子操作了,相对比较慢,但对应1602这样的液晶,我们的ChipKIT还显得快了,因为在笔者没有判断忙操作时就出现不能显示的错误,呵呵,这里可以看出ChipKIT Uno3280Mhz的频率可不是盖的。
    void lcd1602::WriteCmd(unsigned char cmd)
{
    if(ReadBusy())delay(2);        //判断状态,如果液晶忙则延时
   digitalWrite(RS,LOW);
   digitalWrite(RW,LOW);
    DataOut(cmd);
   digitalWrite(A,HIGH);       //E管脚下降沿时送入数据
   delay(1);
   digitalWrite(A,LOW);
}
void lcd1602::WriteData(unsigned char dat)
{
  if(ReadBusy())delay(2);        //判断状态,如果液晶忙则延时
  digitalWrite(RS,HIGH);
   DataOut(dat);
   digitalWrite(A,HIGH);     //E管脚下降沿时送入数据
   delay(1);
   digitalWrite(A,LOW);
}
写指令时RS为低,写数据时RS为高,数据在E管脚产生一个下降沿时将被送入LCD
接下来我们开始测试我们的1602字符液晶了,在主程序中输入如下代码进行测试:
#include "lcd1602.h"
char dPin[8]={11,12,2,3,4,5,6,7};     //定义数据线连接的管脚,笔者的D0连接的是11管脚
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
}
编译并下载到板子运行,哈哈,看到效果了吗?O(_)O~
5.jpg

6.jpg

1602液晶说明.pdf (255.88 KB, 下载次数: 25)

回复

使用道具 举报

  • TA的每日心情
    奋斗
    2018-8-29 20:40
  • 签到天数: 1341 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2014-1-7 23:10:47 | 显示全部楼层
    多谢 学习啦!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2014-7-16 09:10
  • 签到天数: 361 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2014-2-21 08:32:42 | 显示全部楼层
    这个要赞呐                              
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2023-1-28 16:20
  • 签到天数: 980 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2014-2-23 16:51:06 | 显示全部楼层
    四线驱动和八线驱动有什么区别啊?
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

    手机版|小黑屋|与非网

    GMT+8, 2024-12-21 18:56 , Processed in 0.143198 second(s), 21 queries , MemCache On.

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

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.