?? 16x2字符液晶屏驅動演示程序總線方式.htm
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0037)http://www.mcu51.com/list.asp?id=1486 -->
<HTML><HEAD><TITLE>16x2 字符液晶屏驅動演示程序總線方式</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<style>
.small {
FONT-SIZE: 9pt
}
.smallh20 {
FONT-SIZE: 12px; LINE-HEIGHT: 20pt
}
.smallh15 {
FONT-SIZE: 12px; LINE-HEIGHT: 15pt
}
.medium {
FONT-SIZE: 14px
}
.mediumh15 {
FONT-SIZE: 14px; LINE-HEIGHT: 15pt
}
.mediumh20 {
FONT-SIZE: 14px; LINE-HEIGHT: 20pt
}
.big {
FONT-SIZE: 16px
}
A {
COLOR: #003399
}
A:link {
COLOR: #003399
}
A:active {
COLOR: #cc0000
}
A:visited {
COLOR: #666666
}
A:hover {
COLOR: #cc0000
}
TD {
FONT-SIZE: 12px
}
BODY {
MARGIN-TOP: 5pt
}
</style>
<META content="MSHTML 6.00.2800.1226" name=GENERATOR></HEAD>
<BODY>
<DIV align=center>
<CENTER></CENTER></DIV>
<DIV align=center>
<CENTER>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=0 width="97%"
borderColorLight=#000000 border=1>
<TBODY>
<TR>
<TD width="100%" bgcolor="#d0d0d0"> <P align=center>KS0070(44780) 16x2
字符液晶屏驅動演示程序總線方式</P></TD>
</TR>
<TR>
<TD width="100%"> <BLOCKQUOTE><BR>
/*===========================================================================
<p> KS0070(44780) 16x2 字符液晶屏驅動演示程序總線方式 曉奇<br>
=============================================================================<br>
連接線圖: LCM-------51 LCM-------51 LCM--------51<br>
DB0-----P0.0 DB4-----P0.4 RW-------P2.0<br>
DB1-----P0.1 DB5-----P0.5 RC-------P2.1<br>
DB2-----P0.2 DB6-----P0.6 E--------P2.7 =>74ls00+wr+rd<br>
DB3-----P0.3 DB7-----P0.7 VLCD接1K2電阻到GND</p>
<p>[注]:AT89C51的晶振頻率為12MHz<br>
============================================================================*/<br>
//#pragma src <br>
// 產生匯編文件<br>
#include <reg51.h><br>
#include<intrins.h></p>
<p>//========= 變量類型標識的宏定義,大家都喜歡這么做 ==============<br>
#define Uchar unsigned char<br>
#define Uint unsigned int</p>
<p>// ================= LCM1602A端口地址定義 =======================<br>
char xdata Lcd1602CmdPort _at_ 0x7cff; //E=1 RS=0 RW=0<br>
char xdata Lcd1602WdataPort _at_ 0x7eff; //E =1 RS=1 RW=0<br>
char xdata Lcd1602StatusPort _at_ 0x7dff; //CS=1 RS=0 RW=1</p>
<p>#define Busy 0x80 <br>
// 忙判別位</p>
<p><br>
code char exampl[]="For an example. - By xiaoqi\n";</p>
<p>void Delay400Ms(void);<br>
void Delay5Ms(void);<br>
void LcdWriteData( char dataW );<br>
void LcdWriteCommand( Uchar CMD,Uchar AttribC );<br>
void LcdReset( void );<br>
void Display( Uchar dd );<br>
void DispOneChar(Uchar x,Uchar y,Uchar Wdata);<br>
void ePutstr(Uchar x,Uchar y, Uchar code *ptr);</p>
<p>//================ 隨便寫幾句測試主程序 ================<br>
void main(void)<br>
{<br>
Uchar temp;<br>
<br>
Delay400Ms(); // 啟動時必須的延時,<br>
等待lcm進入工作狀態</p>
<p> LcdReset(); // 這也是必需<br>
的....初始化<br>
temp = 32;<br>
ePutstr(0,0,exampl); // 上面一行顯示一個預定字符串</p>
<p> Delay400Ms(); // 保留顯示內容<br>
Delay400Ms();<br>
Delay400Ms();<br>
Delay400Ms();<br>
Delay400Ms();<br>
Delay400Ms();<br>
Delay400Ms();<br>
Delay400Ms();</p>
<p> while(1)<br>
{<br>
temp &= 0x7f; // 只顯示ASCII字符</p>
<p> if (temp<32)temp=32; // 屏蔽控制字符,不予顯示<br>
Display( temp++ );<br>
<br>
Delay400Ms();<br>
}<br>
}</p>
<p>/*=======================================================<br>
顯示字符串<br>
=======================================================*/<br>
void ePutstr(Uchar x,Uchar y, Uchar code *ptr) {<br>
Uchar i,l=0;<br>
while (ptr[l] >31){l++;};<br>
for (i=0;i<l;i++) {<br>
DispOneChar(x++,y,ptr[i]);<br>
if ( x == 16 ){<br>
x = 0; y ^= 1;<br>
}<br>
}<br>
}</p>
<p>/*=======================================================<br>
演示一行連續字符串,配合上位程序演示移動字串<br>
=======================================================*/<br>
void Display( Uchar dd ) {</p>
<p>Uchar i;<br>
<br>
for (i=0;i<16;i++) {</p>
<p> DispOneChar(i,1,dd++);<br>
<br>
dd &= 0x7f;<br>
if (dd<32) dd=32;<br>
}<br>
}</p>
<p>/*=======================================================<br>
顯示光標定位<br>
=======================================================*/<br>
void LocateXY( char posx,char posy) {</p>
<p>Uchar temp;</p>
<p> temp = posx & 0xf;<br>
posy &= 0x1;<br>
if ( posy )temp |= 0x40;<br>
temp |= 0x80;<br>
LcdWriteCommand(temp,0);<br>
}</p>
<p>/*=======================================================<br>
按指定位置顯示數出一個字符<br>
=======================================================*/<br>
void DispOneChar(Uchar x,Uchar y,Uchar Wdata) {</p>
<p> LocateXY( x, y ); // 定位顯示地址<br>
LcdWriteData( Wdata ); // 寫字符<br>
}</p>
<p>/*=======================================================<br>
初始化程序, 必須按照產品資料介紹的初始化過程進行<br>
=======================================================*/<br>
void LcdReset( void ) {</p>
<p> LcdWriteCommand( 0x38, 0); // 顯示模式設置(不檢<br>
測忙信號)<br>
Delay5Ms();<br>
LcdWriteCommand( 0x38, 0); // 共三次<br>
Delay5Ms();<br>
LcdWriteCommand( 0x38, 0);<br>
Delay5Ms();</p>
<p> LcdWriteCommand( 0x38, 1); // 顯示模式設置(以后<br>
均檢測忙信號)<br>
LcdWriteCommand( 0x08, 1); // 顯示關閉<br>
LcdWriteCommand( 0x01, 1); // 顯示清屏<br>
LcdWriteCommand( 0x06, 1); // 顯示光標移動設置<br>
LcdWriteCommand( 0x0c, 1); // 顯示開及光標設置<br>
}</p>
<p>/*=======================================================<br>
寫控制字符子程序: E=1 RS=0 RW=0<br>
=======================================================*/<br>
void LcdWriteCommand( Uchar CMD,Uchar AttribC ) {</p>
<p> if (AttribC) while( Lcd1602StatusPort & Busy ); // 檢測忙<br>
信號?<br>
Lcd1602CmdPort = CMD;<br>
}<br>
<br>
/*=======================================================<br>
當前位置寫字符子程序: E =1 RS=1 RW=0<br>
=======================================================*/<br>
void LcdWriteData( char dataW ) {</p>
<p> while( Lcd1602StatusPort & Busy ); <br>
// 檢測忙信號<br>
Lcd1602WdataPort = dataW;<br>
}</p>
<p>// 短延時<br>
void Delay5Ms(void)<br>
{<br>
Uint i = 5552;<br>
while(i--);<br>
}</p>
<p>//長延時<br>
void Delay400Ms(void)<br>
{<br>
Uchar i = 5;<br>
Uint j;<br>
while(i--)<br>
{<br>
j=7269;<br>
while(j--);<br>
};<br>
}<br>
</p>
</BLOCKQUOTE></TD>
</TR>
<TR>
<TD width="100%"> <P align=center> </P></TD>
</TR>
</TBODY>
</TABLE>
</CENTER></DIV></BODY></HTML>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -