原帖由
nongxiaoming
发自:dev.eefocus.com
------------------------------------------------------------------------------------------------------------------------------------------
上一节我们讲了如何将自己写好的驱动文件加入到库中,这样可以让我们的开发更加的便捷。接下来我们就主要讲各种模块的驱动代码的编写了,首先我们来讲一下LCD1602字符液晶屏的驱动。 LCD1602字符液晶屏的驱动有两种,分别为8线方式和4线方式。这里的8线和4线主要是讲数据线的条数,并不是说总的连接线条数,这一节我们讲的是8先方式的驱动。 下面我们先简单的介绍一下1602字符液晶。 上图就是我们今天要驱动的LCD1602液晶。1602能够同时显示16x02即32个字符。(16列2行),是一种专门用来显示字母、数字、符号等的点阵型液晶模块它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符。每位之间有一个点距的间隔每行之间也有间隔起到了字符间距和行间距的作用。 1602采用标准的16脚接口,如下图: 第1脚:VSS为电源地 第2脚:VDD接5V电源正极 第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会 产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。 第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。 第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。 第6脚:E(或EN)端为使能(enable)端。 第7~14脚:D0~D7为8位双向数据端。 第15~16脚:空脚或背灯电源。 15脚背光正极,16脚背光负极。 下面是1602的读写操作说明: LCD1602初始化过程如下: 好了,关于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 Uno32的80Mhz的频率可不是盖的。 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); //构造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 } 编译并下载到板子运行,哈哈,看到效果了吗?O(∩_∩)O~
1602液晶说明.pdf
(255.88 KB, 下载次数: 25)
|