📄 1602lcmʦ
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0057)file://F:\Temporary\1602LCM液晶显示屏的驱动函数和实例.htm -->
<!-- saved from url=(0047)http://www.cdle.net/alldata/mywz/04022901_1.htm --><HTML><HEAD><TITLE>1602LCM液晶显示屏的驱动函数和实例</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2800.1226" name=GENERATOR></HEAD>
<BODY bgColor=#ffffff leftMargin=0 topMargin=0>
<DIV align=center>
<TABLE cellSpacing=0 cellPadding=0 width="80%" align=center border=1>
<TBODY>
<TR>
<TD height=10>
<DIV class=title1 align=center><FONT
size=2>1602LCM液晶显示屏的驱动函数和实例</FONT></DIV></TD></TR>
<TR>
<TD height=10>
<DIV align=center><FONT size=2>作 者: 明浩 出 处: 磁动力工作室 <A
href="http://www.cdle.net/" target=_blank>http://www.cdle.net/</A> <A
href="mailto:pnzwzw@cdle.net">mailto:pnzwzw@cdle.net</A> (ID189)</FONT></DIV></TD></TR>
<TR>
<TD vAlign=top>
<TABLE cellSpacing=0 cellPadding=0 width="100%" align=center border=0>
<TBODY>
<TR vAlign=top>
<TD class=l12r height=42>
<DIV align=center>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD>
<DIV align=center><FONT size=2><IMG height=360
src="1602LCM液晶显示屏的驱动函数和实例.files/04022901_1_P1.jpg"
width=480><BR>实例中显示本站的网址和站长的EMail</FONT></DIV></TD></TR>
<TR>
<TD><FONT size=2><A
href="http://www.cdle.net/wzadmin/download.asp?autoid=199"
target=_blank>SMC1602A液晶显示屏资料</A> <A
href="http://www.cdle.net/alldata/data/04030701_SMC1602A.pdf"
target=_blank><IMG height=41 alt=点击下载PDF文件
src="1602LCM液晶显示屏的驱动函数和实例.files/pdf.gif" width=30
border=0></A></FONT></TD></TR>
<TR>
<TD><FONT
size=2>/*============================================================<BR>使用1602液晶显示的实验例子
明浩
2004/2/27<BR>==============================================================
<P>SMC1602A(16*2)模拟口线接线方式<BR>连接线图:
<BR>---------------------------------------------------<BR>|LCM-----51
| LCM-----51 | LCM------51
|<BR>---------------------------------------------|<BR>|DB0-----P1.0
| DB4-----P1.4 | RW-------P2.0 |<BR>|DB1-----P1.1 |
DB5-----P1.5 | RS-------P2.1 |<BR>|DB2-----P1.2 | DB6-----P1.6
| E--------P2.2 |<BR>|DB3-----P1.3 | DB7-----P1.7 |
VLCD接1K电阻到GND|<BR>---------------------------------------------------</P></FONT>
<P></P>
<P><FONT
size=2>[注:AT89S51使用12M晶振]<BR>=============================================================*/</FONT></P>
<P><FONT size=2>#define LCM_RW P2_0 //定义引脚<BR>#define LCM_RS
P2_1<BR>#define LCM_E P2_2<BR>#define LCM_Data P1<BR>#define
Busy 0x80 //用于检测LCM状态字中的Busy标识</FONT></P>
<P><FONT size=2>#include <at89x51.h></FONT></P>
<P><FONT size=2>void WriteDataLCM(unsigned char
WDLCM);<BR>void WriteCommandLCM(unsigned char
WCLCM,BuysC);<BR>unsigned char ReadDataLCM(void);<BR>unsigned
char ReadStatusLCM(void);<BR>void LCMInit(void);<BR>void
DisplayOneChar(unsigned char X, unsigned char Y, unsigned char
DData);<BR>void DisplayListChar(unsigned char X, unsigned char
Y, unsigned char code *DData);<BR>void Delay5Ms(void);<BR>void
Delay400Ms(void);</FONT></P>
<P><FONT size=2>unsigned char code cdle_net[] =
{"www.cdle.net"};<BR>unsigned char code email[] =
{"pnzwzw@cdle.net"};</FONT></P>
<P><FONT size=2>void main(void)<BR>{<BR>Delay400Ms();
//启动等待,等LCM讲入工作状态<BR>LCMInit(); //LCM初始化<BR>Delay5Ms();
//延时片刻(可不要)</FONT></P>
<P><FONT size=2>DisplayListChar(0, 0,
cdle_net);<BR>DisplayListChar(0, 1,
email);<BR>ReadDataLCM();//测试用句无意义<BR>while(1);<BR>}</FONT></P>
<P><FONT size=2>//写数据<BR>void WriteDataLCM(unsigned char
WDLCM)<BR>{<BR>ReadStatusLCM(); //检测忙<BR>LCM_Data =
WDLCM;<BR>LCM_RS = 1;<BR>LCM_RW = 0;<BR>LCM_E = 0;
//若晶振速度太高可以在这后加小的延时<BR>LCM_E = 0; //延时<BR>LCM_E =
1;<BR>}</FONT></P>
<P><FONT size=2>//写指令<BR>void WriteCommandLCM(unsigned char
WCLCM,BuysC) //BuysC为0时忽略忙检测<BR>{<BR>if (BuysC)
ReadStatusLCM(); //根据需要检测忙<BR>LCM_Data = WCLCM;<BR>LCM_RS =
0;<BR>LCM_RW = 0; <BR>LCM_E = 0;<BR>LCM_E = 0;<BR>LCM_E = 1;
<BR>}</FONT></P>
<P><FONT size=2>//读数据<BR>unsigned char
ReadDataLCM(void)<BR>{<BR>LCM_RS = 1; <BR>LCM_RW = 1;<BR>LCM_E
= 0;<BR>LCM_E = 0;<BR>LCM_E =
1;<BR>return(LCM_Data);<BR>}</FONT></P>
<P><FONT size=2>//读状态<BR>unsigned char
ReadStatusLCM(void)<BR>{<BR>LCM_Data = 0xFF; <BR>LCM_RS =
0;<BR>LCM_RW = 1;<BR>LCM_E = 0;<BR>LCM_E = 0;<BR>LCM_E =
1;<BR>while (LCM_Data & Busy);
//检测忙信号<BR>return(LCM_Data);<BR>}</FONT></P>
<P><FONT size=2>void LCMInit(void) //LCM初始化<BR>{<BR>LCM_Data =
0;<BR>WriteCommandLCM(0x38,0);
//三次显示模式设置,不检测忙信号<BR>Delay5Ms();
<BR>WriteCommandLCM(0x38,0);<BR>Delay5Ms();
<BR>WriteCommandLCM(0x38,0);<BR>Delay5Ms(); </FONT></P>
<P><FONT size=2>WriteCommandLCM(0x38,1);
//显示模式设置,开始要求每次检测忙信号<BR>WriteCommandLCM(0x08,1);
//关闭显示<BR>WriteCommandLCM(0x01,1);
//显示清屏<BR>WriteCommandLCM(0x06,1); //
显示光标移动设置<BR>WriteCommandLCM(0x0C,1); //
显示开及光标设置<BR>}</FONT></P>
<P><FONT size=2>//按指定位置显示一个字符<BR>void DisplayOneChar(unsigned
char X, unsigned char Y, unsigned char DData)<BR>{<BR>Y &=
0x1;<BR>X &= 0xF; //限制X不能大于15,Y不能大于1<BR>if (Y) X |= 0x40;
//当要显示第二行时地址码+0x40;<BR>X |= 0x80;
//算出指令码<BR>WriteCommandLCM(X, 0);
//这里不检测忙信号,发送地址码<BR>WriteDataLCM(DData);<BR>}</FONT></P>
<P><FONT size=2>//按指定位置显示一串字符<BR>void DisplayListChar(unsigned
char X, unsigned char Y, unsigned char code
*DData)<BR>{<BR>unsigned char ListLength;</FONT></P>
<P><FONT size=2>ListLength = 0;<BR>Y &= 0x1;<BR>X &=
0xF; //限制X不能大于15,Y不能大于1<BR>while (DData[ListLength]>0x20)
//若到达字串尾则退出<BR>{<BR>if (X <= 0xF)
//X坐标应小于0xF<BR>{<BR>DisplayOneChar(X, Y, DData[ListLength]);
//显示单个字符<BR>ListLength++;<BR>X++;<BR>}<BR>}<BR>}</FONT></P>
<P><FONT size=2>//5ms延时<BR>void
Delay5Ms(void)<BR>{<BR>unsigned int TempCyc =
5552;<BR>while(TempCyc--);<BR>}</FONT></P>
<P><FONT size=2>//400ms延时<BR>void
Delay400Ms(void)<BR>{<BR>unsigned char TempCycA =
5;<BR>unsigned int
TempCycB;<BR>while(TempCycA--)<BR>{<BR>TempCycB=7269;<BR>while(TempCycB--);<BR>};<BR>}</FONT></P>
<P></P>
<P></P></TD></TR></TBODY></TABLE></DIV></TD></TR></TBODY></TABLE>
<DIV></DIV></TR></TBODY></DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -