配色: 字号:
1602液晶资料
2014-01-03 | 阅:  转:  |  分享 
  
蓝底白字



标准型16X2液晶显示字符模块(背光/蓝屏)



1602采用标准的16脚接口,其中:



第1脚:VSS为地电源



第2脚:VDD接5V正电源



第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度



第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。



第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。



第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。



第7~14脚:D0~D7为8位双向数据线。



第15脚:背光电源正极



第16脚:背光电源负极



1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如表1所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。



以下是在液晶模块的第二行第一个字符的位置显示字母“A”的程序:ORG0000H



RSEQUP3.7;确定具体硬件的连接方式

RWEQUP3.6;确定具体硬件的连接方式

EEQUP3.5;确定具体硬件的连接方式



MOVP1,#00000001B;清屏并光标复位

ACALLENABLE;调用写入命令子程序



MOVP1,#00111000B;设置显示模式:8位2行5x7点阵

ACALLENABLE;调用写入命令子程序



MOVP1,#00001111B;显示器开、光标开、光标允许闪烁

ACALLENABLE;调用写入命令子程序



MOVP1,#00000110B;文字不动,光标自动右移

ACALLENABLE;调用写入命令子程序



MOVP1,#0C0H;写入显示起始地址(第二行第一个位置)

ACALLENABLE;调用写入命令子程序



MOVP1,#01000001B;字母A的代码



SETBRS;RS=1

CLRRW;RW=0;准备写入数据

CLRE;E=0;执行显示命令

ACALLDELAY;判断液晶模块是否忙?

SETBE;E=1;显示完成,程序停车



AJMP$



ENABLE:

CLRRS;写入控制命令的子程序

CLRRW

CLRE

ACALLDELAY

SETBE

RET



DELAY:

MOVP1,#0FFH;判断液晶显示器是否忙的子程序

CLRRS

SETBRW

CLRE

NOP

SETBE

JBP1.7,DELAY;如果P1.7为高电平表示忙就循环等待

RET



END



程序在开始时对液晶模块功能进行了初始化设置,约定了显示格式。注意显示字符时光标是自动右移的,无需人工干预,每次输入指令都先调用判断液晶模块是否忙的子程序DELAY,然后输入显示位置的地址0C0H,最后输入要显示的字符A的代码41H。





SMC1602A(162)模拟口线接线方式

连接线图:

---------------------------------------------------

|LCM-----51|LCM-----51|LCM------51|

------------------------------------------------|

|DB0-----P1.0|DB4-----P1.4|RW-------P2.0|

|DB1-----P1.1|DB5-----P1.5|RS-------P2.1|

|DB2-----P1.2|DB6-----P1.6|E--------P2.2|

|DB3-----P1.3|DB7-----P1.7|VLCD接1K电阻到GND|

---------------------------------------------------







[注:AT89S52使用12M晶振]

=============================================================/



#defineLCM_RWP2_0//定义引脚

#defineLCM_RSP2_1

#defineLCM_EP2_2

#defineLCM_DataP1

#defineBusy0x80//用于检测LCM状态字中的Busy标识



#include



voidWriteDataLCM(unsignedcharWDLCM);

voidWriteCommandLCM(unsignedcharWCLCM,BuysC);

unsignedcharReadDataLCM(void);

unsignedcharReadStatusLCM(void);

voidLCMInit(void);

voidDisplayOneChar(unsignedcharX,unsignedcharY,unsignedcharDData);

voidDisplayListChar(unsignedcharX,unsignedcharY,unsignedcharcodeDData);

voidDelay5Ms(void);

voidDelay400Ms(void);



unsignedcharcodeuctech[]={"uctech"};

unsignedcharcodenet[]={"uctech.icpcn.com"};



voidmain(void)

{

Delay400Ms();//启动等待,等LCM讲入工作状态

LCMInit();//LCM初始化

Delay5Ms();//延时片刻(可不要)



DisplayListChar(0,5,uctech);

DisplayListChar(0,0,net);

ReadDataLCM();//测试用句无意义

while(1);

}



//写数据

voidWriteDataLCM(unsignedcharWDLCM)

{

ReadStatusLCM();//检测忙

LCM_Data=WDLCM;

LCM_RS=1;

LCM_RW=0;

LCM_E=0;//若晶振速度太高可以在这后加小的延时

LCM_E=0;//延时

LCM_E=1;

}



//写指令

voidWriteCommandLCM(unsignedcharWCLCM,BuysC)//BuysC为0时忽略忙检测

{

if(BuysC)ReadStatusLCM();//根据需要检测忙

LCM_Data=WCLCM;

LCM_RS=0;

LCM_RW=0;

LCM_E=0;

LCM_E=0;

LCM_E=1;

}



//读数据

unsignedcharReadDataLCM(void)

{

LCM_RS=1;

LCM_RW=1;

LCM_E=0;

LCM_E=0;

LCM_E=1;

return(LCM_Data);

}



//读状态

unsignedcharReadStatusLCM(void)

{

LCM_Data=0xFF;

LCM_RS=0;

LCM_RW=1;

LCM_E=0;

LCM_E=0;

LCM_E=1;

while(LCM_Data&Busy);//检测忙信号

return(LCM_Data);

}



voidLCMInit(void)//LCM初始化

{

LCM_Data=0;

WriteCommandLCM(0x38,0);//三次显示模式设置,不检测忙信号

Delay5Ms();

WriteCommandLCM(0x38,0);

Delay5Ms();

WriteCommandLCM(0x38,0);

Delay5Ms();



WriteCommandLCM(0x38,1);//显示模式设置,开始要求每次检测忙信号

WriteCommandLCM(0x08,1);//关闭显示

WriteCommandLCM(0x01,1);//显示清屏

WriteCommandLCM(0x06,1);//显示光标移动设置

WriteCommandLCM(0x0C,1);//显示开及光标设置

}



//按指定位置显示一个字符

voidDisplayOneChar(unsignedcharX,unsignedcharY,unsignedcharDData)

{

Y&=0x1;

X&=0xF;//限制X不能大于15,Y不能大于1

if(Y)X|=0x40;//当要显示第二行时地址码+0x40;

X|=0x80;//算出指令码

WriteCommandLCM(X,0);//这里不检测忙信号,发送地址码

WriteDataLCM(DData);

}



//按指定位置显示一串字符

voidDisplayListChar(unsignedcharX,unsignedcharY,unsignedcharcodeDData)

{

unsignedcharListLength;



ListLength=0;

Y&=0x1;

X&=0xF;//限制X不能大于15,Y不能大于1

while(DData[ListLength]>0x20)//若到达字串尾则退出

{

if(X<=0xF)//X坐标应小于0xF

{

DisplayOneChar(X,Y,DData[ListLength]);//显示单个字符

ListLength++;

X++;

}

}

}



//5ms延时

voidDelay5Ms(void)

{

unsignedintTempCyc=5552;

while(TempCyc--);

}



//400ms延时

voidDelay400Ms(void)

{

unsignedcharTempCycA=5;

unsignedintTempCycB;

while(TempCycA--)

{

TempCycB=7269;

while(TempCycB--);

};







以上程序仅供参考!!



献花(0)
+1
(本文系云山逸语首藏)