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

📄 lcd1602.c

📁 能较好的实现无线通信 用点阵来实现 距离有100米 程序已通过调试
💻 C
字号:
#include "LCD1602.h"

/*********LCD1602***********/

sbit	LCD_RW	=	P3^6;
sbit	LCD_RS	=	P3^7;
sbit	LCD_E	=	P3^4;

//sbit	LCD_RW	=	P2^5;
//sbit	LCD_RS	=	P2^6;
//sbit	LCD_E	=	P2^4;

#define LCD_Data 	P1
						  
#define BUSYFLAG 0x80 //用于检测LCM状态字中的Busy标识


#define Xtal 11.0592

void delay_1ms(void)
{
	unsigned int i;

	for (i=1; i<(unsigned int)((Xtal*143-2)/12); ++i);  
}

void delay_ms(unsigned int n)
{
	unsigned int i;

	for (i=0; i<n; ++i)
		delay_1ms();
}



/*static void short_delay(unsigned int i)
{
	while (i>0) i--;
}*/


void ReadBusyLCD(void)	   // 测试LCD忙碌状态 直到忙碌状态结束
{       
	bit result;
	LCD_Data |= BUSYFLAG; //D7(BF) 1-正在执行内部操作 0-可接收指令
	do
	{
		LCD_RS = 0;
		LCD_RW = 1;
		LCD_E = 1;
		result = (bit)(LCD_Data & 0x80);////
		LCD_E = 0;
	}while (result == 1);
}



//写数据
void WriteDataLCD(unsigned char WDLCD)
{
	ReadBusyLCD(); //检测忙
	LCD_Data = WDLCD;
	LCD_RS = 1;
	LCD_RW = 0;
	LCD_E = 1;
	LCD_E = 1;
	LCD_E = 0; //若晶振速度太高可以在这后加小的延时

}


//写指令
void WriteCommandLCD(unsigned char WCLCD,unsigned char BusyC) //BusyC为0时忽略忙检测
{
	if (BusyC) ReadBusyLCD(); //根据需要检测忙
	LCD_Data = WCLCD;
	LCD_RS = 0;
	LCD_RW = 0; 
	LCD_E = 1;
	LCD_E = 1; 
	LCD_E = 0;

}


void LCDInit(void) //LCM初始化
{
	LCD_E = 0;
	WriteCommandLCD(0x38,0); //三次显示模式设置,不检测忙信号
	delay_ms(5);
	//short_delay(250);
	WriteCommandLCD(0x38,0);
	//short_delay(250);
	delay_ms(5);
	WriteCommandLCD(0x38,0);
	WriteCommandLCD(0x38,1); //显示模式设置,开始要求每次检测忙信号
	WriteCommandLCD(0x08,1); //关闭显示
	WriteCommandLCD(0x01,1); //显示清屏
	WriteCommandLCD(0x06,1); // 显示光标移动设置
	WriteCommandLCD(0x0C,1); // 显示开及光标设置
	delay_ms(5);
	//short_delay(250);
}


//按指定位置显示一个字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
	Y &= 0x1;
	X &= 0xF; //限制X不能大于15,Y不能大于1
	if (Y) X |= 0x40; //当要显示第二行时地址码 0x40;
	X |= 0x80; // 算出指令码
	WriteCommandLCD(X, 0); //这里不检测忙信号,发送地址码
	WriteDataLCD(DData);
}


//按指定位置显示一串字符
void DisplayListChar_code(unsigned char X, unsigned char Y, unsigned char code *DData)
{
	unsigned char ListLength;
	unsigned char j;
 	ListLength = strlen(DData);
  	Y &= 0x1;
  	X &= 0xF; //限制X不能大于15,Y不能大于1
	if (X <= 0xF) //X坐标应小于0xF
	{ 
		for(j=0;j<ListLength;++j)
		{			
	        DisplayOneChar(X, Y, DData[j]); //显示单个字符
	        X++;
	    }
	}
}



#ifdef DisplayListChar_ENABLE
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char  *DData)
{
	unsigned char ListLength;
	unsigned char j;
 	ListLength = strlen(DData);
  	Y &= 0x1;
  	X &= 0xF; //限制X不能大于15,Y不能大于1
	if (X <= 0xF) //X坐标应小于0xF
	{ 
		for(j=0;j<ListLength;++j)
		{			
	        DisplayOneChar(X, Y, DData[j]); //显示单个字符
	        X++;
	    }
	}

}

#endif 



#ifdef ReadDataLCD_ENABLE
	//读数据
	unsigned char ReadDataLCD(void)
	{
		LCD_RS = 1; 
		LCD_RW = 1;
		LCD_E = 1;
		LCD_E = 0;
		//short_delay(250);
		delay_ms(5);
		return(LCD_Data);
	}
#endif
 

⌨️ 快捷键说明

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