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

📄 lcd1602cg.h

📁 这个是一个用Keil C51编写的LCD1602驱动程序示例
💻 H
字号:
/****************************************************************/
/*********          LCD1602CG.H C51 driver          *************/
/**********       Written by CUST---20060308     ****************/
/****************************************************************/
//---------------------------------------------
#define busy 0x80 //用于检查写忙信号
//-------------------------------------------------------------------------------
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//-------------------------------------------------------------------------------
//------------1602 控制引脚定义-----------------
#define DATAPORT P0 // 数据端口
sbit    RS  =P1^4;
sbit    RW  =P1^3;
sbit    Elcd=P1^2;
//-----------------外部函数--------------------------------------------------
void Init_Lcd1602(void);//LCD RESET
void ClsAll(void);//LCD clear
void ClsChar(unsigned char x,unsigned char y);//clear one char
	//-----------------------
void DispChar(unsigned char x,unsigned char y,unsigned char Wdata);//显示一个字符
void DispString(unsigned char x,unsigned char y,char *ptr);//显示一行字符串
void DispHexChar(unsigned char x,unsigned char y,unsigned char InData);//显示一个字符
void DispNumbChar(unsigned char x,unsigned char y,unsigned char n,unsigned char number_bit);
void DispNumbInt(unsigned char x,unsigned char y,unsigned int n,unsigned char number_bit);
void DispNumbLong(unsigned char x,unsigned char y,unsigned long n,unsigned char number_bit);
	//-----------------------
void CGRAM_LoadData(unsigned char *ptCGRAM);
//-------------------------------------------------------------------------------
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//------------------内部函数-----------------------------------------------------
void WaitForEnable( void ); //忙信号检测
void LocateXY( char posx,char posy);
void LcdWrite_C( unsigned char CMD,unsigned char AttribC );
void LcdWrite_D( char dataW ) ; //写一个数据
void delay5ms(void);
//---------------------------FOR LCD 1602------------------------------------
//-----------------初始化-------------------------------
void Init_Lcd1602(void)
{	
	LcdWrite_C(0x38,0);//显示模式设置(不测试忙信号)共三次
	delay5ms();
	LcdWrite_C(0x38,0);
	delay5ms();
	LcdWrite_C(0x38,0);
	delay5ms();
	LcdWrite_C(0x38,1);//0x38-8bit,0x28-4bit
	LcdWrite_C(0x08,1);//close lcd
	ClsAll();//Cls
	LcdWrite_C(0x06,1);//0x06-cor->right,charN;0x04-cor->left,charN;0x07-charY
	LcdWrite_C(0x0c,1);//0x0c-allY,corN,blnN;0x0e-allY,corY,blnN;0x0f-threeY
} 
//-----------Cls----------------------------------------
void ClsAll(void)
{	
	LcdWrite_C(0x01,1);
	delay5ms();
}
//-------------------------------------------------------
void ClsChar(unsigned char x,unsigned char y)
{
	DispChar(x,y,' ');
}
//------------------------------------------------------------
void DispChar(unsigned char x,unsigned char y,unsigned char Wdata) 
{	
	LocateXY( x, y ); // 定位显示地址
	LcdWrite_D( Wdata ); // 写字符
}
//------------------------------------------------------------
void DispString(unsigned char x,unsigned char y,char *ptr)
{
	unsigned char i,l=0;

	while (ptr[l] >31){l++;};//取得要显示的个数
	for (i=0;i<l;i++)
 	{	DispChar(x++,y,ptr[i]);
		if ( x == 16 )
		{	x = 0; 
			y ^= 1;//换行
		}
	}
}
//------------------------------------------------------------
unsigned char code number[]="0123456789";//for dis table
	//------------------------------------
void DispHexChar(unsigned char x,unsigned char y,unsigned char InData)
{
	unsigned char H_Byte,L_Byte;


	DispChar(x,y,'0');DispChar(x+1,y,'x');

	H_Byte=(InData&0xf0)>>4;if(H_Byte>9) H_Byte+=0x37;else H_Byte+=0x30;	 //0x37->'A',0x57->'a'
	L_Byte=(InData&0x0f);if(L_Byte>9) L_Byte+=0x37;else L_Byte+=0x30;

	//h=(InData&0xf0)>>4;if(h>9) h+=0x57;else h+=0x30;	 //0x57->'a',0x37->'A'
	//l=(InData&0x0f);if(l>9) l+=0x57;else l+=0x30;

	DispChar(x+2,y,H_Byte);DispChar(x+3,y,L_Byte);
}
	//------------------------------------
void DispNumbChar(unsigned char x,unsigned char y,unsigned char n,unsigned char number_bit)
{	
	unsigned char digi[3];
	unsigned char i;

	digi[0]=n/100;
	digi[1]=n/10%10;
	digi[2]=n%10;

	for(i=0;i<number_bit;i++) DispChar(x+i,y,number[(digi[3-number_bit+i])]);
}
//-----------------------------------------------
void DispNumbInt(unsigned char x,unsigned char y,unsigned int n,unsigned char number_bit)
{	
	unsigned char digi[5];
	unsigned char i;

	digi[0]=n/10000;
	digi[1]=n/1000%10;
	digi[2]=n/100%10;
	digi[3]=n/10%10;
	digi[4]=n%10;

	for(i=0;i<number_bit;i++) DispChar(x+i,y,number[(digi[5-number_bit+i])]);
}
//------------------------------------------------------
void DispNumbLong(unsigned char x,unsigned char y,unsigned long n,unsigned char number_bit)
{	
	unsigned char digi[10];
	unsigned char i;

	digi[0]=n/1000000000;
	digi[1]=n/100000000%10;
	digi[2]=n/10000000%10;
	digi[3]=n/1000000%10;
	digi[4]=n/100000%10;
	digi[5]=n/10000%10;
	digi[6]=n/1000%10;
	digi[7]=n/100%10;
	digi[8]=n/10%10;
	digi[9]=n%10;

	for(i=0;i<number_bit;i++) DispChar(x+i,y,number[(digi[10-number_bit+i])]);
}
//-------------------------------------------------------
void CGRAM_LoadData(unsigned char *ptCGRAM)
{
	unsigned char i;

	LcdWrite_C(0x40,1);
	for(i=0;i<64;i++)
	{
		LcdWrite_D(ptCGRAM[i]);
	}
}
//-------------------------------------------------------
//------------------------------------------------------------
void LocateXY( char posx,char posy) 
{	
	unsigned char temp;

	temp = posx & 0xf;
	posy &= 0x1;
	if ( posy )temp |= 0x40;
	temp |= 0x80;
	LcdWrite_C(temp,0);
}
//------------------------------------------------------------
void LcdWrite_C( unsigned char CMD,unsigned char AttribC ) 
{	
	if (AttribC) WaitForEnable(); // 检测忙信号?
	RS = 0; RW = 0; 
	DATAPORT =CMD;// 送控制字子程序
	Elcd = 1;Elcd = 0; // 操作允许脉冲信号 
}
//------------------------------------------------------------
void LcdWrite_D( char dataW ) 
{	
	WaitForEnable(); // 检测忙信号
	RS = 1; RW = 0;
	DATAPORT = dataW;
	Elcd = 1;Elcd = 0; // 操作允许脉冲信号 
}
//------------------------------------------------------------
void WaitForEnable( void )
{	
	DATAPORT = 0xff;
	RS =0; RW = 1;Elcd = 1;
	while( DATAPORT & busy );
	Elcd = 0;
} 
//----------------------------------短延时-------------------
void delay5ms(void)
{	
	unsigned int i=5552;

	while(i--);
}
//----------------LCD1602CG.H END----------------------------------------

⌨️ 快捷键说明

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