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

📄 lcd1602func.c.bak

📁 51单片机
💻 BAK
字号:
/*******************************************************************
**函数功能:LCD的驱动函数										  **
**创建人:xingyuegu												  **
**创建日期:2006-7-12											  **
**版本:1.0														  **
**修改日期:2006-10-30										  	  **
**版本:2.0														  **
 1602液晶仿真的一些发现


看了JJJ的例子:字符液晶1602仿真测试
按自己习惯也写了个,发现些问题
一、
JJJ说仿真时要屏蔽掉检查LCD忙的代码,否则会死循环
while(DBPort&0x80);    //这句要屏蔽

我写的程序总是无法正确仿真,因为不检查LCD忙,就不能保证LCD已经空闲
查资料LCD清屏命令要1.64ms才完成,一般命令也要40us,最后加上足够的延时后才仿真通过

后来又试了下其它LCD资料上的例程,仿真发现检查LCD忙标志也不会死循环
分析了下,区别是:它不是一直在使能的情况下读忙信号,而是每次都有EN=0,再EN=1重新读取忙标志
我还没做好实际实验电路板,没试过实际电路
根据JJJ的描述和我的仿真实验,我猜仿真和实际硬件的区别是:
实际硬件在EN=1的情况下,LCD执行完指令会更新LCD忙标志为0;
而仿真需要EN=0,EN=1来重新读取忙信号,否则就不会更新,而一直以为是忙

在JJJ的LCD1602.h加了几句,变成
while(DBPort&0x80)
    {    LcdEn=0;        _nop_();
         LcdEn=1;        _nop_();
    }
仿真就可以检查忙标志了

自己的代码也做相应改动,都可以成功检查忙标志,也无需多加延时了

*******************************************************************/

#include <lcd1602.h>
#include <reg52.h>

sbit LcdRs =P2^0;
sbit LcdRw =P2^1;
sbit LcdEn =P2^2;
sfr DBPort =0x80;

/*************************************************************
**功能:延时1.64ms											**
**参数:无													**
*************************************************************/

void delay1_64ms(void)
{
	uchar i;
	for(i = 0;i < 250;i++)
	{
		_nop_();
		_nop_();
		_nop_();
		_nop_();
	}
}
/*************************************************************
**功能:延时40us											**
**参数:无													**
*************************************************************/

void delay40us(void)
{
	uchar i;
	for(i = 0;i < 20;i++)
	{
		;
	}
}
/*************************************************************
**功能:判断LCD忙											**
**参数:无       											**
*************************************************************/

unsigned char Lcd_Wait(void)
{
	
	while(1)
	{
	DBPort=0xff;
	LcdEn=0;
	_nop_();
	LcdRs=0;
	_nop_();
	_nop_();
	LcdRw=1;
	_nop_();
	_nop_();
	LcdEn=1;
	_nop_();
	_nop_();
	
	_nop_();
	_nop_();
	if((DBPort&0x80)==0)
	{
		break;
		
	}
	LcdEn=0;
	}
	//delay40us();
	return DBPort;
}
/**************************************************************
**功能:写LCD函数											 **
**参数:style为写命令/数据,0-命令,1-数据;input为写入的8位 **
**		命令/数据											 **
**************************************************************/


void Lcd_Write(bit style,unsigned char input)
{
	LcdEn=0;
	_nop_();
	_nop_();
	LcdRs=style;
	_nop_();
	_nop_();
	LcdRw=0;
	DBPort=input;
	_nop_();
	_nop_();
	LcdEn=1;
	_nop_();
	_nop_(); 
	LcdEn=0;
	_nop_();
	Lcd_Wait();
	
}
/****************************************************************
**功能:LCD清屏函数										       **
**参数:无     											       **
****************************************************************/
void ClrScreen(void)
{	
	Lcd_Write(Lcd_Command,Lcd_Clear_Screen);
	delay1_64ms();
}

/****************************************************************
**功能:LCD归位函数										       **
**参数:无     											       **
****************************************************************/
void Screen_home(void)
{
	
	Lcd_Write(Lcd_Command,Lcd_Home);
	delay1_64ms();

}
/***************************************************************
**功能:设置显示模式										  **
**参数:													  **
***************************************************************/

void  Lcd_SetDisplay(unsigned char DisplayMode)
{
	Lcd_Write(Lcd_Command,0x08|DisplayMode);

}
/***************************************************************
**功能:LCD移动设置											  **
**参数:取值如下											  **
***************************************************************/


void Lcd_Move(unsigned char MoveMode)
{
	Lcd_Write(Lcd_Command,0x10|MoveMode);

}

/****************************************************************
**功能:LCD输入设置											   **
**参数:取值如下											   **
****************************************************************/
//
void Lcd_SetInput(unsigned char InputMode)
{
	Lcd_Write(Lcd_Command,0x04|InputMode);

}
/****************************************************************
**功能:LCD初始化										       **
**参数:取值如下											   **
****************************************************************/
void Lcd_Init(void)
{
	delay1_64ms();
	Lcd_Write(Lcd_Command,0x38);           //8位数据端口,2行显示,5*7点阵
	
	Lcd_Write(Lcd_Command,0x38);
	Lcd_Write(Lcd_Command,0x38);
	Lcd_SetDisplay(Lcd_Display_On);    //开启显示, 无光标	 |Lcd_Cursor|Lcd_Flash
	//Lcd_Move(Lcd_CursorMove|Lcd_Left);
												 
	Lcd_SetInput(Lcd_Ac_Up|Lcd_No_Move);       //AC递增, 画面不动_To	

	
}

/****************************************************************
**功能:显示位置设置										   **
**参数:x-行;y-列											   **
****************************************************************/
void GotoXY(unsigned char x,unsigned char y)
{
	if(y==0)
		{Lcd_Write(Lcd_Command,0x80|x);
		}
	if(y==1)
		{Lcd_Write(Lcd_Command,0x80|(x+0x40));
		 }
								 
}

/****************************************************************
**功能:LCD显示函数											   **
**参数:str-要显示的字符串指针								   **
****************************************************************/
void Print(unsigned char *str)
{	
	while(*str!='\0')
	{

		Lcd_Write(Lcd_Data,*str);

		str++;

	}
}

void print_char(uchar a)
{
	Lcd_Write(Lcd_Data,a);
	//Lcd_Wait();
}		

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -