⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ead_20040.c

📁 这是《Keil Cx51 V7.0单片机高级语言编程与uVision2应用实践》教材各章中列出的全部程序例子。
💻 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 + -