📄 ks0070(44780) 16x2 字符液晶屏驱动演示程序.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0037)http://www.mcu51.com/list.asp?id=1371 -->
<HTML><HEAD><TITLE>KS0070(44780) 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>文章编号:1371----加入日期:2004-4-7 </P></TD></TR>
<TR>
<TD width="100%">
<P align=right><A href="javascript:self.close()">『关闭窗口』</A></P></TD></TR>
<TR>
<TD width="100%">
<P align=center><B>KS0070(44780) 16x2 字符液晶屏驱动演示程序</B></P></TD></TR>
<TR>
<TD width="100%">
<BLOCKQUOTE><BR>/*===================================================================<BR><BR> KS0070(44780)
16x2
字符液晶屏驱动演示程序 晓奇<BR> =====================================================================<BR> 连接线图:
LCM-------51 LCM-------51
LCM--------51<BR> DB0-----P0.0 DB4-----P0.4
RS-------P2.0<BR> DB1-----P0.1 DB5-----P0.5
RW-------P2.1<BR> DB2-----P0.2 DB6-----P0.6
E--------P2.7<BR> DB3-----P0.3 DB7-----P0.7
VLCD接1K2电阻到GND<BR> <BR>[注]:AT89C51的晶振频率为12MHz<BR>====================================================================*/<BR><BR><BR>/*<BR><BR>改写的4bit 模拟总线方式 mu<BR>MCU
90S8515<BR>连线 <BR>PORTA0
RS<BR>PORTA1 RW<BR>PORTA2
E<BR>PORTC7 D7<BR>PORTC6 D6<BR>PORTC5 D5<BR>PORTC4 D4<BR>*/<BR><BR>#include
<IO8515v.h><BR><BR><BR>//变量类型标识的宏定义,大家都喜欢这么做<BR>#define Uchar
unsigned char<BR>#define Uint unsigned int<BR><BR>//
控制引脚定义,不同的连接必须修改的部分<BR><BR>#define CTLPORT PORTA<BR>#define
LCD_RS 0 // pin-0 on
CTLPORT<BR>#define
LCD_RW 1 // pin-1 on
CTLPORT<BR>#define
LCD_E 2 //
pin-2 on CTLPORT<BR><BR>#define
SET_LCD_E CTLPORT|=(1<<LCD_E) //
LCD: E = 1<BR>#define
CLR_LCD_E CTLPORT&=~(1<<LCD_E) //
LCD: E = 0<BR>#define
SET_LCD_RW CTLPORT|=(1<<LCD_RW) //
LCD: R/W = 1 (read)<BR>#define
CLR_LCD_RW CTLPORT&=~(1<<LCD_RW) //
LCD: R/W = 0 (write)<BR>#define
SET_LCD_RS CTLPORT|=(1<<LCD_RS) //
LCD: R/S = 1 (data reg)<BR>#define
CLR_LCD_RS CTLPORT&=~(1<<LCD_RS) //
LCD: R/S = 0 (status reg)<BR><BR>#define DataPortOUT PORTC //
数据端口<BR>#define DataPortIN PINC<BR>#define
DataPortfx DDRC<BR>#define Busy
0x80<BR><BR><BR>char exampl[]="HELLO WORLD\n";<BR><BR>void
Delay400Ms(void);<BR>void Delay5Ms(void);<BR>void WaitForEnable( 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 *ptr);<BR><BR>//测试主程序<BR>void
main(void)<BR>{<BR>Uchar
temp;<BR>DDRA=0XFF;<BR>DDRC=0XFF;<BR>Delay400Ms();<BR><BR>LcdReset();<BR>temp
= 32;<BR>ePutstr(0,0,exampl); //
上面一行显示一个预定字符串<BR><BR>Delay400Ms();<BR>Delay400Ms();<BR>Delay400Ms();<BR>Delay400Ms();<BR>Delay400Ms();<BR>Delay400Ms();<BR>Delay400Ms();<BR>Delay400Ms();<BR><BR>while(1)<BR>{<BR>temp
&= 0x7f; // 只显示ASCII字<BR>符<BR>if (temp<32)temp=32; //
屏蔽控制字符,不予显示<BR>Display( temp++
);<BR>Delay400Ms();<BR>}<BR>}<BR><BR>/*=======================================================<BR>显示字符串<BR>=======================================================*/<BR>void
ePutstr(Uchar x,Uchar y, Uchar *ptr)<BR>{<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 == 8 ){<BR>x = 0; y ^=
1;<BR>}<BR>}<BR>}<BR><BR>/*=======================================================<BR>演示一行连续字符串,配合上位程序演示移动字串<BR>=======================================================*/<BR>void
Display( Uchar dd ) <BR>{<BR><BR>Uchar i;<BR><BR>for
(i=0;i<8;i++)<BR>{<BR>DispOneChar(i,1,dd++);<BR>dd &= 0x7f;<BR>if
(dd<32)
dd=32;<BR>}<BR>}<BR><BR>/*=======================================================<BR>显示光标定位<BR>=======================================================*/<BR>void
LocateXY( char posx,char posy) <BR>{<BR><BR>Uchar temp;<BR><BR>temp =
posx & 0xf;<BR>posy &= 0x1;<BR>if ( posy )temp |= 0x40;<BR>temp
|=
0x80;<BR>LcdWriteCommand(temp,0);<BR>}<BR><BR>/*=======================================================<BR>按指定位置显示数出一个字符<BR>=======================================================*/<BR>void
DispOneChar(Uchar x,Uchar y,Uchar Wdata)<BR>{<BR><BR>LocateXY( x, y );
// 定位显示地址<BR>LcdWriteData( Wdata ); //
写字符<BR>}<BR><BR>/*=======================================================<BR>初始化程序,
必须按照产品资料介绍的初始化过程进行<BR>=======================================================*/<BR>void
LcdReset( void ) <BR>{<BR><BR> LcdWriteCommand( 0x38,
0); // 显示模式设置<BR>(不检测忙信号)<BR>Delay5Ms();<BR>LcdWriteCommand( 0x38, 0);
// 共三次<BR>Delay5Ms();<BR>LcdWriteCommand( 0x38,
0);<BR>Delay5Ms();<BR><BR>LcdWriteCommand( 0x28, 1); //
显示模式设置<BR>(以后均检测忙信号)<BR> LcdWriteCommand( 0x08,
1); // 显示关闭<BR> LcdWriteCommand( 0x01, 1); //
显示清屏<BR>LcdWriteCommand( 0x06, 1); // 显示光标移动<BR>设置<BR>LcdWriteCommand(
0x0c, 1); //
显示开及光标<BR>设置<BR>}<BR><BR>/*=======================================================<BR>写控制字符子程序:
E=1 RS=0
RW=0<BR>=======================================================*/<BR>void
LcdWriteCommand( Uchar CMD,Uchar AttribC ) <BR>{<BR><BR><BR>if (AttribC)
WaitForEnable(); // 检<BR>测忙信号?<BR><BR>CLR_LCD_RS;
<BR>CLR_LCD_RW;<BR>asm("nop");<BR>DataPortOUT = CMD;<BR>asm("nop"); //
送<BR>控制字子程序<BR>SET_LCD_E;<BR>asm("nop");<BR>asm("nop");<BR>CLR_LCD_E;<BR>asm("nop");
<BR>DataPortOUT = CMD << 4;<BR>asm("nop");<BR>asm("nop"); //
送<BR>控制字子程序<BR>SET_LCD_E;<BR>asm("nop");<BR>asm("nop");<BR>CLR_LCD_E;<BR>}<BR><BR>/*=======================================================<BR>当前位置写字符子程序:
E =1 RS=1
RW=0<BR>=======================================================*/<BR>void
LcdWriteData( char dataW )<BR>{<BR><BR>WaitForEnable(); <BR>//
检测忙信号<BR><BR>SET_LCD_RS; <BR>CLR_LCD_RW<BR>asm("nop");
<BR><BR>DataPortOUT = dataW; <BR>asm("nop"); <BR>SET_LCD_E;
<BR>asm("nop");<BR>asm("nop");<BR>CLR_LCD_E; // 操作允许脉冲信号<BR>asm("nop");
<BR><BR>DataPortOUT = dataW<<4; <BR>asm("nop"); <BR>SET_LCD_E;
<BR>asm("nop");<BR>asm("nop");<BR>CLR_LCD_E; //
操作允许脉冲信号<BR><BR>}<BR><BR>/*=======================================================<BR>正常读写操作之前必须检测LCD控制器状态:
CS=1 RS=0 RW=1<BR>DB7: 0 LCD控制器空闲;
1 LCD控制器忙<BR>========================================================*/<BR>void
WaitForEnable( void )<BR>{<BR>DDRC=0X00;<BR>CLR_LCD_RS;
<BR>SET_LCD_RW;<BR>asm("nop");<BR><BR><BR><BR>SET_LCD_E;
<BR>asm("nop");<BR>asm("nop");<BR><BR>while( DataPortIN & Busy
);<BR>CLR_LCD_E;<BR><BR>SET_LCD_E;
<BR>asm("nop");<BR>asm("nop");<BR>CLR_LCD_E;<BR><BR>DataPortfx=0xff;<BR><BR>}
<BR><BR><BR>// 短延时<BR>void Delay5Ms(void)<BR>{<BR>Uint i =
25552;<BR>while(i--);<BR>}<BR><BR>//长延时<BR>void
Delay400Ms(void)<BR>{<BR>Uchar i = 40;<BR>Uint
j;<BR>while(i--)<BR>{<BR>j=7269;<BR>while(j--);<BR>};<BR>}<BR><BR><BR><BR>(文章推荐人:思雨)
<BR><BR></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 + -