📄 ead_20040.c
字号:
#include <reg51.h>
#include <intrins.h>
#define Uchar unsigned char
#define Uint unsigned int
sbit RS = P1^0; /* 定义LCD模块控制引脚,可根据需要进行修改 */
sbit RW = P1^1;
sbit E = P1^7;
#define DataPort P0 /* 定义LCD模块数据端口 */
#define Busy 0x80
code char exampl[]="This is an example for HD44780 LCM. \n";
/****************************** 短延时函数 ******************************/
void Delay5Ms(void) {
Uint i = 5552;
while(i--);
}
/****************************** 长延时函数 ******************************/
void Delay400Ms(void) {
Uchar i = 5;
Uint j;
while(i--) {
j=7269;
while(j--);
};
}
/****************************** 读忙状态函数 ****************************
* 功能:在正常读写操作之前检测LCD模块的忙状态,
* DB7 = 0:LCD控制器空闲;DB7 = 1:LCD控制器忙
*************************************************************************/
void WaitForEnable( void ) {
DataPort = 0xff;
RS =0; RW = 1; _nop_(); E = 1; _nop_(); _nop_();
while( DataPort & Busy );
E = 0;
}
/****************************** 命令写入函数 ****************************
* 功能:向LCD模块写入命令字符CMD,
* 若 AttribC = 1 检测忙信号,若 AttribC = 0 不检测忙信号
************************************************************************/
void LcdWriteCommand(Uchar CMD,Uchar AttribC) {
if (AttribC) WaitForEnable(); /* 检测忙信号? */
RS = 0; RW = 0; _nop_();
DataPort = CMD; _nop_(); /* 将命令字符送往数据口 */
E = 1;_nop_();_nop_();E = 0;
}
/**************************** 光标定位函数 ******************************
* 功能: 将显示光标定位到posx,posy坐标处
************************************************************************/
void LocateXY( char posx,char posy) {
Uchar temp;
temp = posx & 0xf;
posy &= 0x1;
if ( posy )temp |= 0x40;
temp |= 0x80;
LcdWriteCommand(temp,0);
}
/***************************** 显示字符写入函数 ***************************
* 功能:在当前光标位置显示一个字符
**************************************************************************/
void LcdWriteData( char dataW ) {
WaitForEnable(); /* 检测忙信号 */
RS = 1; RW = 0; _nop_();
DataPort = dataW; _nop_(); /* 将显示字符送往数据口 */
E = 1; _nop_(); _nop_(); E = 0;
}
/*************************** 单个字符显示函数 *****************************
* 功能:按指定的x,y位置显示一个字符Wdata
**************************************************************************/
void DispOneChar(Uchar x,Uchar y,Uchar Wdata) {
LocateXY( x, y ); /* 定位显示地址 */
LcdWriteData( Wdata ); /* 写字符 */
}
/**************************** 显示字符串函数 *****************************
* 功能:从坐标x,y处开始显示ptr指定的字符串
**************************************************************************/
void ePutstr(Uchar x,Uchar y, Uchar code *ptr) {
Uchar i,l=0;
while (ptr[l] >31){l++;};
for (i=0;i<l;i++) {
DispOneChar(x++,y,ptr[i]);
if ( x == 16 ){
x = 0; y ^= 1;
}
}
}
/**************************** 显示字符串函数 ****************************
* 功能: 显示一行连续字符串
************************************************************************/
void Display( Uchar dd ) {
Uchar i;
for (i=0;i<16;i++) {
DispOneChar(i,1,dd++);
dd &= 0x7f;
if (dd<32) dd=32;
}
}
/****************************** 初始化函数 ******************************
* 功能:向LCD模块写入不同命令,完成必要的初始化过程
*************************************************************************/
void LcdReset( void ) {
LcdWriteCommand( 0x38, 0); /* 设置显示模式(不检测忙信号) */
Delay5Ms(); /* 短延时 */
LcdWriteCommand( 0x38, 0); /* 共进行三次 */
Delay5Ms();
LcdWriteCommand( 0x38, 0);
Delay5Ms();
LcdWriteCommand( 0x38, 1); /* 设置显示模式(以后均检测忙信号) */
LcdWriteCommand( 0x08, 1); /* 显示关闭 */
LcdWriteCommand( 0x01, 1); /* 显示清屏 */
LcdWriteCommand( 0x06, 1); /* 设置显示光标移动 */
LcdWriteCommand( 0x0c, 1); /* 设置显示开及光标位置 */
}
/********************************* 主函数 ******************************/
void main(void) {
Uchar temp;
Delay400Ms(); /* 长延时 */
LcdReset(); /* LCD模块初始化 */
temp = 32;
ePutstr(0,0,exampl); /* 显示一个预定字符串 */
Delay400Ms(); /* 长延时 */
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
while(1){
temp &= 0x7f; /* 只显示ASCII字符 */
if (temp<32)temp=32; /* 屏蔽控制字符,不予显示 */
Display( temp++ );
Delay400Ms();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -