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

📄 lcd12864scs.h

📁 这是本人完全自主编写的一个LCD12864的串行驱动程序
💻 H
字号:
/************************************************************/
/*********        LCD12864scs.H C51 driver      *************/
/**********  Written by WangBiao---20060813  ****************/
/************************************************************/
//--------------------------------------
sbit RS_CS=P1^2;
sbit RW_SID=P1^3;
sbit E_CLK=P1^4;
//-----------------------外部函数----------------------------------------
void Init_Lcd12864(void); //LCD RESET
void ClearScreen(void);
//----------------------------------------------------------
void DispChar(unsigned char x,unsigned char y,unsigned char dataW);
void DispString(unsigned char x,unsigned char y,unsigned char *ptr);
void DispChinese(unsigned char x,unsigned char y,unsigned char *ptr);
void DispNumb(unsigned char x,unsigned char y,unsigned int n,unsigned char number_bit);
//-----------------------------------------------------------------------
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//-----------------------------------------------------------------------
//-----------------------内部函数----------------------------------------
void WaitForEnable(void);//忙信号检测
void SendByte(unsigned char Data);
unsigned char ReceByte(void);
void LcdWrite_C(unsigned char CMD,unsigned char AttribC);//write Control Charactor
void LcdWrite_D(unsigned char dataW); //写一个数据
unsigned char LcdRead(void);//read a data from LCD
void Delay5ms(void);
//-------------------------------------------------------------------------
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//-------------------------------------------------------------------------
//----------------------具体子函数---------------------------------------
//----------------------------初始化---------------------------------
void Init_Lcd12864(void)
{	
	RS_CS=0;
	E_CLK=0;
	RW_SID=0;
	LcdWrite_C(0x30,0); //显示模式设置(不测试忙信号)共三次
	Delay5ms();
	LcdWrite_C(0x30,1);
	Delay5ms();
	LcdWrite_C(0x0c,1);//0x0f->all on,show arrow;0x0c->no arrow
	ClearScreen();
}
//--------------------------------------------------------------
void SendByte(unsigned char Data)
{
	unsigned char i,t=0x80;
	for(i=0;i<8;i++)
	{
		if(Data&t) RW_SID=1;
		else RW_SID=0;
		E_CLK=1;
		t>>=1;
		E_CLK=0;
	}
}
//---------------------------------------------
unsigned char ReceByte(void)
{
	unsigned char i,t=0;
	for(i=0;i<8;i++)
	{	
		t<<=1;
		if(RW_SID) t|=1;
		E_CLK=1;
		E_CLK=0;
	}
	return t;
}
//---------------------------------------------------------
void LcdWrite_C(unsigned char CMD,unsigned char AttribC) 
{
	if(AttribC) WaitForEnable(); //检测忙信号	

	RS_CS=1;//start

	SendByte(0xf8);//MCU->LCD,COMMAND
	SendByte(CMD&0xf0);
	SendByte((CMD&0x0f)<<4);

	RS_CS=0;//end
}
//--------------------------------------------------------
void LcdWrite_D(unsigned char DATA) 
{	
	WaitForEnable(); // 检测忙信号

	RS_CS=1;//start

	SendByte(0xfa);//MCU->LCD,DATA
	SendByte(DATA&0xf0);
	SendByte((DATA&0x0f)<<4);

	RS_CS=0;//end
}
//---------------------------------------------------------
unsigned char LcdRead(void)
{	
	unsigned char t,DATA;
	
	WaitForEnable(); // 检测忙信号

	RS_CS=1;//start

	SendByte(0xfe);//LCD->MCU,DATA
	t=ReceByte();DATA=t&0xf0;
	t=ReceByte();DATA|=((t&0xf0)>>4);

	RS_CS=0;//end

    return DATA;
}
//----------------------------------------------------------
void WaitForEnable( void )
{
	unsigned char t,DATA;

	for(;;)
	{
		RS_CS=1;//start

		SendByte(0xfc);//LCD->MCU,BUSY CHECK
		t=ReceByte();DATA=t&0xf0;
		t=ReceByte();DATA|=((t&0xf0)>>4);

		RS_CS=0;//end

		if((DATA&0x80)==0) break;
	}
}
//----------------------------------------------------------
//--------------------------短延时-----------------------
void Delay5ms(void)
{	unsigned int i = 5552;
	while(i--);
}
//-------------------------------------------------------------------
//###################################################################
//---------------------------------------------------
void ClearScreen(void)
{	
	LcdWrite_C(0x01,1);//清除显示
}
//-------------------------------------------------------
//----------------------------------------------------------------------------
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//----------------------------------------------------------------------------
//=======================================================//
//              按指定位置显示一个字符                   //
//=======================================================//
void DispChar(unsigned char x,unsigned char y,unsigned char dataW) 
{	unsigned char temp,t;
	
	LcdWrite_C(0x30,1);//command back

	temp=x&0x0f;
	t=y>>1;
	y&=0x01;
	if(temp&0x01)
	{	temp=temp>>1;
		if(y)temp|=0x10;
		temp|=0x80;
		if(t)temp|=0x08;
		LcdWrite_C(temp,1);
		LcdRead();
		LcdWrite_D(dataW);	
	}
	else
	{	temp=temp>>1;
		if(y)temp|=0x10;
		temp|=0x80;
		if(t)temp|=0x08;
		LcdWrite_C(temp,1);
		LcdWrite_D(dataW);
	}
}
//=======================================================//
//                 按指定位置显示一串字符                //
//=======================================================//
void DispString(unsigned char x,unsigned char y,unsigned char *ptr) 
{	unsigned char i,len=0;//len=0!!!!!!!!
	while (ptr[len]>31){len++;};//取得要显示的个数
	for(i=0;i<len;i++) 
	{	
		if((i!=0)&&((x+i)%16==0)) y++;
		DispChar((x+i)%16,y,*ptr++);
	}
}
//=======================================================//
//   按指定位置显示中文字符串(x必须偶对齐取值为0~7)    //
//=======================================================//
void DispChinese(unsigned char x,unsigned char y,unsigned char *ptr)
{	unsigned char i,len=0;//len=0!!!!!!!!
	while (ptr[len]>31){len++;};//取得要显示的个数
	for(i=0;i<len;i++) //DispChar(x*2+i,y,*ptr++);
	{	
		if((i!=0)&&((x+i)%16==0)) y++;
		DispChar((x*2+i)%16,y,*ptr++);
	}
}
//=======================================================//
//        按指定位置显示一个数字表(可变位BCD码)          //
//=======================================================//
unsigned char code number[]="0123456789";//for dis table
//---------------------------------------------------------
void DispNumb(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])]);
}
//--------------------------------------------------------------------------
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//--------------------------------------------------------------------------
//-------------------end LCD12864.H-----------------------------------------

⌨️ 快捷键说明

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