原创 LCD1602 4位数据线连接方式 驱动程序 (ZZ)

2007-12-21 00:09 3268 4 6 分类: MCU/ 嵌入式
         单片机I/O口使单片机资源的重要组成部分,也是用来扩展外围设备的必选资源,尽可能以更少的I/O口实现更多的功能是单片机工程师追求的目标,现在的一些串行器件也为这一目标的实现添加了更多的可能性,比如I2C总线,MAXIM力推的1-WIRE等等,都可以以很少的I/O口实现更多的功能,当然这是以降低一定的速度为代价的。

        显示器件多见的是LED数码管,LCD液晶屏等。一般的数码管成本低廉,在显示内容要求不多的时候适用;LCD液晶屏以更多的显示空间得到了许多人的爱好,不过成本上要高的多(市场价在20元左右),本文以LCD1602为例说明如何驱动液晶屏。


         LCD1602外接的控制接口有RS,R/W,E;数据接口为DB7--DB0。总共有11跟线与单片机的I/O口连接,若使用标准的51单片机,至少占用了一个端口再加上另一个端口的部分I/O口。这再很多应用场合是不大可取的。所以很有必要减少连接数。从其数据手册上介绍的4线连接方式可以达到只使用7个I/O口即可满足要求,其中为3个控制口RS,R/W,E和数据口的DB7--DB4;写入数据或指令的顺序是先写高半个字节,再写低半个字节。


 


其中P0口的高四位接到LCD1602的DB7-DB4,P3.0-P3.1分别接RS,R/W,E;


下面给出驱动源程序*/



#i nclude <reg52.h>
#i nclude "intrins.h"


#define  uint unsigned int
#define  uchar unsigned char


#define TRUE  1
#define FALSE 0
#define nop _nop_()



#define PtData P0  //定义连接口线,
#define PtContr P3
sbit RS="PtContr"^0;
sbit RW="PtContr"^1;
sbit E="PtContr"^2;


void InitialLcd();
void WriteLcdInstr(uchar);
void WriteLcdData(uchar);
void CheckLcdBusy();
uchar HexToDdram(uchar);


void Delay(unsigned int);


 


main()
{Delay(1000);


InitialLcd();


WriteLcdInstr(0x80);
WriteLcdData('e');
WriteLcdData('l');
WriteLcdData('k');
WriteLcdData('e');
WriteLcdData('l');
WriteLcdData('i');
WriteLcdData('k');
WriteLcdData('e');


WriteLcdInstr(0xc0);
WriteLcdData('L');
WriteLcdData('C');
WriteLcdData('D');
WriteLcdData('1');
WriteLcdData('6');
WriteLcdData('0'); 
WriteLcdData('2');


while(1)
 {


WriteLcdInstr(0x0f);
Delay(30000); 
WriteLcdInstr(0x08);
Delay(40000);
 }


}


//----------------LCD1602函数---------------------//
//---初始化
void InitialLcd()
{Delay(600);//延时应大于15ms,不同的晶振使需要修改,本程序再6M下调试通过
RS=0;
RW=0;nop;
E=0;nop;


E=1;nop;
PtData=0x20;//  
nop;
E=0;
Delay(200);//延时应大于4.1ms


E=1;nop;
PtData=0x20;//  
nop;
E=0;
Delay(5);//延时应大于100us


E=1;nop;
PtData=0x20;// 
nop;
E=0;//设置4位操作;


WriteLcdInstr(0x01);//清屏
WriteLcdInstr(0x28);//设置4位操作,1行显示,5x8
WriteLcdInstr(0x02);//光标归位
WriteLcdInstr(0x06);//AC自动加1,画面不动
WriteLcdInstr(0x0f);//0x0f:光标闪烁开; 


}
//---写指令
void WriteLcdInstr(uchar Temp)
{CheckLcdBusy();
RS=0;
RW=0;
E=0;nop;
E=1;nop;
PtData=Temp;
nop;
E=0;nop;
E=1;nop;
PtData=(Temp<<4);
nop;
E=0;nop;
}



//---写数据
void WriteLcdData(uchar Temp)
{
CheckLcdBusy();
RS=1;
RW=0;
E=0;nop;
E=1;nop;
PtData=Temp;
nop;
E=0;nop;
E=1;nop;
PtData=(Temp<<4);
nop;
E=0;nop;
}



//---查忙
void CheckLcdBusy()
{uchar Temp,t;
PtData=0xff;


RW=1;
RS=0;nop;
E=0;nop;
do
 {nop;
 E=1;nop;
 Temp=PtData;
 nop;nop;nop;
 E=0;nop;nop;


 E=1;nop;
 t=PtData;
 nop;nop;nop;
 E=0;nop;nop;


 Temp&=0x80;
 }while(Temp==0x80);
}


 


//---delay
void Delay(unsigned int N)
{unsigned int i;
for(i=0;i<N;i++){i=i;}
}

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户1613626 2011-8-6 00:38

还是不行。。 唉 我怎么那么悲剧呢

用户741296 2007-12-21 15:29

见过了!

o(∩_∩)o...

相关推荐阅读
用户1597890 2009-09-07 10:23
朽而不锈看模拟应用设计之二电容很需要(转载)
 2.电容很需要,但不是放在哪里都有效―――门窗漏风盖被子依然冷前面已经讲过对于LDO的输出电容品种很重要,实际上数值,位置也很重要,包括TI等公司在自己的LDO芯片说明手册上都提出关键电容的布置图和...
用户1597890 2009-09-07 10:06
朽而不锈看模拟应用设计(转载)
第一章       电源设计到位要注意的―――固本1.  开关电源这5V输出有时还真不是东西,真扎手----。经常听兄弟们抱怨自己的设计的系统在实验室或生产车间里调试老化时一点问题都没有,可一到现查就...
用户1597890 2009-08-23 20:22
仪表放大器
三运放组成的仪表放大器电路分析      仪表放大器与运算放大器的区别是什么?仪表放大器是一种具有差分输入和相对参考端单端输出的闭环增益单元。大多数情况下,仪表放大器的两个输入端阻抗平衡并且阻值很高,...
用户1597890 2009-03-13 12:44
项目完成之感
             回味一下自己走过的技术之路,工作将近三年,独立完成小项目一个,为期一个月,包括制版、调试、成型、生产。另一个项目从07的5月开始到现在接近尾声,从一开始的负责显示模块到后来整...
用户1597890 2008-12-06 14:06
C语言,结构体(struct) 用法 (ZZ)
 转自:匠人百宝箱                                             C语言,结构体(struct) 用法结构(struct)      结构是由基本数据类型构成...
用户1597890 2008-10-24 15:26
浅谈单片机程序设计中的“分层思想”(zt)
浅谈单片机程序设计中的“分层思想”   随便写下的一点东西,本来打算去发表,不过想想还是算了,不是什么重要的东西,不过这个东西确实很有用。文章烂的去组织和修改了,随便看看吧。 分层的思想,并不是什么神...
EE直播间
更多
我要评论
2
4
关闭 站长推荐上一条 /3 下一条