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

📄 lcd.c

📁 LCD12864直接写屏驱动程序
💻 C
字号:
/***********************************************************************************/
#include "Lcd.h"
#include "CharModeLib.h"
/***********************************************************************************/ 
/***********************************************************************************/
void	LCD_WriteLeftIns(unsigned char command)	/*写左半屏命令*/
{
	while ((LCD_READ_LEFT_INS & 0x90) != 0);
	LCD_WRITE_LEFT_INS	= command;	
}
/***********************************************************************************/
void	LCD_WriteRightIns(unsigned char command)	
{
	while ((LCD_READ_RIGHT_INS & 0x90) != 0);
	LCD_WRITE_RIGHT_INS	= command;		
}	
/***********************************************************************************/
void	LCD_WriteData(void)			/*写数据*/
{
	if (LCD_StrData.List_Y < 64)
	{
		while( (LCD_READ_LEFT_INS  & 0x90) != 0 );
		LCD_WRITE_LEFT_DATA		= LCD_StrData.WriteData;
	}
	else
	{
		while( (LCD_READ_RIGHT_INS & 0x90) != 0 );
		LCD_WRITE_RIGHT_DATA	= LCD_StrData.WriteData;
	}
}
/***********************************************************************************/
void	LCD_SetXY(void)	/*设置X、Y指针*/
{
	if (LCD_StrData.List_Y < 64)
	{		
		LCD_WriteLeftIns(0xB8 + LCD_StrData.Page_X / 8);/*设置X页地址*/
		LCD_WriteLeftIns(0x40 + LCD_StrData.List_Y);	/*设置Y横向地址*/
	}
	else
	{
		LCD_WriteRightIns(0xB8 +  LCD_StrData.Page_X / 8);		
		LCD_WriteRightIns(0x40 + (LCD_StrData.List_Y - 64));
	}
}
/***********************************************************************************/
void	LCD_Clear(void)	/*清屏*/
{
	for (LCD_StrData.Page_X=0; LCD_StrData.Page_X != 64; LCD_StrData.Page_X += 8)
	{
		LCD_StrData.List_Y	= 0;	
		LCD_SetXY();
		for ( ; LCD_StrData.List_Y != 64; LCD_StrData.List_Y++)
		{
			while( (LCD_READ_LEFT_INS  & 0x90) != 0 );
			LCD_WRITE_LEFT_DATA		= 0;
		}
		LCD_SetXY();
		for ( ; LCD_StrData.List_Y != 128; LCD_StrData.List_Y++)
		{
			while( (LCD_READ_RIGHT_INS & 0x90) != 0 );
			LCD_WRITE_RIGHT_DATA	= 0;
		}
	}
}
/***********************************************************************************/
void	LCD_DispInput(unsigned char x, unsigned char y, unsigned char opp_bit, enum Character *string_pt)
{	
	enum Character offset_addr;
	unsigned char i;
	unsigned short	mode_addr;
	
	i=0;
	offset_addr	= *string_pt;
	while (offset_addr != CHARACTER_END)
	{		
		if (i!=opp_bit)
		{
			mode_addr = &CharMode + (unsigned short)offset_addr * 16;
			LCD_WriteGraph(x, y, 16, 8, CHAR_DISP, (unsigned char code *)mode_addr);
		}	
		else
		{
			mode_addr = &CharMode + (unsigned short)offset_addr * 16;
			LCD_WriteGraph(x, y, 16, 8, CHAR_OPP, (unsigned char code *)mode_addr);	
		}
		y	+= 8;
		string_pt++;
		offset_addr	= *string_pt;
		i++;
	}
}
/***********************************************************************************/
void	LCD_WriteString(unsigned char x, unsigned char y, unsigned char opp, enum Character *string_pt)
{	/*写字符串,格式为8×15、15×15,可以反显写,string_pt为字符串字符的机内码地址*/
	enum Character offset_addr;
	unsigned short	mode_addr;
	
	offset_addr	= *string_pt;
	while (offset_addr != CHARACTER_END)
	{		
		if (offset_addr>ASC_END)
		{
			mode_addr = &CharMode + (unsigned short)(ASC_END+1)*16+(unsigned short)(offset_addr-ASC_END-1)*30;
			LCD_WriteGraph(x, y, 16, 15, opp, (unsigned char code *)mode_addr);
			LCD_WriteGraph(x, y+15, 16, 1, opp, (unsigned char code *)(&CharMode + (unsigned short)ASC_SPACE*16));
			y	+= 16;
		}	
		else
		{
			mode_addr = &CharMode + (unsigned short)offset_addr * 16;
			LCD_WriteGraph(x, y, 16, 8, opp, (unsigned char code *)mode_addr);
			y	+= 8;	
		}
		string_pt++;
		offset_addr	= *string_pt;	
	}
}
/***********************************************************************************/
void	LCD_WriteGraph(unsigned char x, unsigned char y, 
					   unsigned char height, unsigned char width, unsigned char opp, 
					   unsigned char code *buf_pt)
{	/*写一个图形,x、y、height、width、opp、buf_pt*/
	unsigned char	i, j;
	unsigned char	list_num, page_num;			/*页数、列数*/
		
	LCD_StrData.Page_X	= x;	/*显示地址为任意值*/
	LCD_StrData.List_Y	= y;
	list_num	= width;		/*显示模块的宽是任意的*/
	page_num	= height / 8;	/*height必须为8的倍数,不支持高度不为8倍数的显示模块*/

	for (j=page_num; j != 0; j--)
	{
		LCD_SetXY();
		for (i=list_num; i != 0; i--)
		{  
			LCD_StrData.WriteData = (*buf_pt) ^ opp;
			buf_pt++;
			LCD_WriteData();
			LCD_StrData.List_Y++;
			if (LCD_StrData.List_Y == 64)	/*跨页,调整X、Y地址*/
			{
				LCD_SetXY();
			}
		}
		LCD_StrData.List_Y	= LCD_StrData.List_Y - list_num;
		LCD_StrData.Page_X	= LCD_StrData.Page_X + 8;
	}	
}				
/***********************************************************************************/					
void	LCD_OnOFF(unsigned char status)	/*开关LCD显示*/
{
	unsigned char	cmd;
	if (status == 0)
	{
		cmd	= 0x3E;
		BackLight = 1;
	}
	else
	{
		cmd	= 0x3F;
		BackLight = 0;	/*开背光*/
	}
	LCD_WriteLeftIns  ( cmd );
	LCD_WriteRightIns ( cmd );	
}

/***********************************************************************************/
void	LCD_Initialize(void)		/*初始化LCD的Z地址、清屏、开显示*/
{
	LCD_WriteLeftIns  ( 0xC0 );		// set Z address to zero
	LCD_WriteRightIns ( 0xC0 );		// set Z address to zero
	LCD_Clear();	// Clear Screen 
	LCD_OnOFF(1);	
}
/***********************************************************************************/

⌨️ 快捷键说明

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