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

📄 lcddriver.c

📁 包含所有LCD7981接口定义
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "Kernel.H"
#include "Driver\Lcd\ports\database.h"
#include "Driver\Lcd\ports\LcdhdPorts.h"

/************************************************************************************
*constant definition																*
*************************************************************************************/

#define	cLcdBusy			0
#define	cLcdFree			1

#define	cLcdNormal			0
#define	cLcdReverse			1

#define	cMetricsChar		0
#define	cMetricsPixel		1

#define	cLcdHdNormal		0
#define	cLcdHdError			1

#define cInv				1
#define cNotInv				0

/************************************************************************************
*7981 registers definition															*
*************************************************************************************/
#define	LCD_REG_MODE		0
#define LCD_REG_CHA_PITCH	1
#define	LCD_REG_CHA_NO		2
#define LCD_REG_DIV_NO		3
#define	LCD_REG_CURSOR		4
#define LCD_REG_START_LADD	8
#define	LCD_REG_START_HADD	9
#define	LCD_REG_CUR_LADD	10
#define	LCD_REG_CUR_HADD	11
#define	LCD_REG_DATA		12
#define	LCD_REG_READ		13
#define	LCD_REG_BCLR		14
#define	LCD_REG_BSET		15

/************************************************************************************
*internal variables definition														*
*************************************************************************************/
INT8U	bMaxPixelX;
INT8U	bMaxPixelY;
INT8U	bMaxCharX;
INT8U	bMaxCharY;

INT8U	bLcdCharX;
INT8U	bLcdCharY;
INT16U	wLcdAddress;

INT8U	bMetricsMode;
INT8U	bLcdReverse;

INT8U	bLcdHdStatus;
/************************************************************************************
*Functions declaration																*
*************************************************************************************/
void			sLcdLightOn(void);
void			sLcdLightOff(void);
INT8U			sbLcdCheckBusy(void);
INT8U			sbLcdReadData(void);
void			sLcdWriteCommand(INT8U command);
void			sLcdWriteData(INT8U	data);
INT8U			sbGetLcdHdStatus(void);
void			sLcdInitial(INT8U xmax,INT8U ymax);
void			sLcdMoveTo(INT8U x,INT8U y);
void			sLcdReverse(void);
void			sLcdNormal(void);
void			sLcdPixelSet(INT8U	x,INT8U y);
void			sLcdPixelClr(INT8U x,INT8U y);
void			sLcdHLine(INT8U	x,INT8U y,INT16U len);
void			sLcdVLine(INT8U	x,INT8U y,INT16U len);
void			sLcdFillRect(INT8U x0,INT8U y0,INT8U xLen,INT8U yLen);
void			sLcdClearScreen(void);
INT8U			LcdInvData(INT8U data);
void			sLcdDisplayByte(INT16U addr,INT8U data,INT8U bInv);
void			sLcdShowHalfWord(INT16U *pdata);
void			sLcdShowWord(INT16U *pdata);
void			sLcdShowSingleChar(INT16U code);
void			sLcdShowString(INT8U x,INT8U y,INT8S *pString);
void 			sShowDynamicIcon(INT8U x,INT8U y);
extern void 	sReadBankedData(void);
void sLcdShowBmp(INT8U x,INT8U y,INT8U bWidth,INT8U bHeight,INT16U bDataAddr,INT8U bByteOrData);
/************************************************************************************
*Hardware related operations														*
*************************************************************************************/
void	sLcdLightOn(void)
{
	M_LCD_LIGHT_ON();
}

void	sLcdLightOff(void)
{
	M_LCD_LIGHT_OFF();
}
/************************************************************************************
*Function name: sbLcdCheckBusy														*
*returns:		cLcdBusy:	0	Lcd is busy now										*
*				cLcdFree:	1	Lcd is free now										*
*this function is related with 7981 timing											*
*************************************************************************************/

INT8U	sbLcdCheckBusy(void)
{
	INT8U	temp;
//	OS_ENTER_CRITICAL();
	mLcdSetELow();
	mLcdSetRead();
	mLcdSelRegister();
	mLcdTasDly();
	mLcdSetEHigh();
//	OS_EXIT_CRITICAL();
	mLcdTdhrDly();
//	OS_ENTER_CRITICAL();
	temp=sbLcdDataIn();
	mLcdSetELow();
	mLcdSetWrite();
	mLcdSelData();
//	OS_EXIT_CRITICAL();
	if(temp&0x0080)
	{
		return(cLcdBusy);
	}
	else
	{
		return(cLcdFree);
	}
//	return cLcdFree;
}

/************************************************************************************
*Function name: sbLcdReadData														*
*returns:		data in ram															*
*this function is related with 7981 timing											*
*************************************************************************************/
INT8U	sbLcdReadData(void)
{
	INT8U i;
	INT8U temp;
//	OS_ENTER_CRITICAL();
	mLcdSetELow();
	i=0;
	while(i<2)
	{
		i++;
	}	
	mLcdSetRead();
	mLcdSelData();
	mLcdTasDly();
	mLcdSetEHigh();
	i=0;
	while(i<5)
	{
		i++;
	}		
	mLcdTdhrDly();
	temp=sbLcdDataIn();
	mLcdSetELow();
	i=0;
	while(i<2)
	{
		i++;
	}		
	mLcdSetWrite();
	mLcdSelData();
//	OS_EXIT_CRITICAL();
	return(temp);
}

/************************************************************************************
*Function name: sLcdWriteCommand													*
*Parameters:	command																*
*this function is related with 7981 timing											*
*************************************************************************************/
void	sLcdWriteCommand(INT8U command)
{
	INT16U	i;
	
	i=0;	
	while(sbLcdCheckBusy()==cLcdBusy)
	{
		i++;
		if(i>=10)
		{
			bLcdHdStatus=cLcdHdError;
			return;
		}
	}

	mLcdSetELow();
	
	i=0;
	while(i<2)
	{
		i++;
	}
//	OS_ENTER_CRITICAL();
	mLcdSelRegister();
	mLcdSetWrite();
	mLcdTasDly();
	mLcdSetEHigh();	
//	OS_EXIT_CRITICAL();
	i=0;
	while(i<5)
	{
		i++;
	}	
	
//	OS_ENTER_CRITICAL();
	sLcdDataOut(command);
	mLcdTdswDly();
	mLcdSetELow();
//	OS_EXIT_CRITICAL();
	
	i=0;
	while(i<2)
	{
		i++;
	}	
//	OS_ENTER_CRITICAL();
	mLcdSetWrite();
	mLcdSelData();
//	OS_EXIT_CRITICAL();
}

/************************************************************************************
*Function name: sLcdWriteData														*
*Parameters:	data																*
*this function is related with 7981 timing											*
*************************************************************************************/
void	sLcdWriteData(INT8U	data)
{
	INT16U	i;
	
	i=0;
	while(sbLcdCheckBusy()==cLcdBusy)
	{
		i++;
		if(i>=10)
		{
			bLcdHdStatus=cLcdHdError;
			return;
		}
	}
	
	mLcdSetELow();
	i=0;
	while(i<2)
	{
		i++;
	}	
//	OS_ENTER_CRITICAL();
	
	mLcdSelData();
	mLcdSetWrite();
	mLcdTasDly();
	mLcdSetEHigh();
//	OS_EXIT_CRITICAL();
	
	i=0;
	while(i<5)
	{
		i++;
	}	
//	OS_ENTER_CRITICAL();
	
	sLcdDataOut(data);
	mLcdTdswDly();
	mLcdSetELow();
//	OS_EXIT_CRITICAL();
	
	i=0;
	while(i<2)
	{
		i++;
	}
	
	mLcdSetWrite();
	mLcdSelData();
}

/************************************************************************************
*Function name: sbGetLcdHdStatus													*
*returns:		cLcdHdNormal:	Lcd hardware works normally							*
*				cLcdHdError:	Lcd hardware works abnormally						*
*************************************************************************************/
INT8U	sbGetLcdHdStatus(void)
{
	return(bLcdHdStatus);
}

/************************************************************************************
*Default settings:	Graphic Mode													*
*					Ram start address:	0x0000										*
*					8 bit a byte													*
*Paramters:			bLineByteNo:How many bytes per line(column)						*
*					bLineNo:How many lines											*
*************************************************************************************/
void	sLcdInitial(INT8U xmax,INT8U ymax)
{
//	INT16U	i,j;
	
/*	for (i=0;i<30000;i++)
	{
		mLcdDelay10us();	
	}*/
	
	hoLcdReset = 0;
	mLcdSetWrite();
	mLcdSelData();
	mLcdSetELow();
	hoLcdReset = 1;	
	


	sLcdWriteCommand(LCD_REG_MODE);		
	sLcdWriteData(0x32);					
	sLcdWriteCommand(LCD_REG_CHA_PITCH);	
	sLcdWriteData(0x07);					
	sLcdWriteCommand(LCD_REG_CHA_NO);	
	sLcdWriteData((xmax>>3)-1);					
	sLcdWriteCommand(LCD_REG_DIV_NO);		
	sLcdWriteData(ymax);					
	sLcdWriteCommand(LCD_REG_CURSOR);
	sLcdWriteData(0x00);
	sLcdWriteCommand(LCD_REG_START_LADD);
	sLcdWriteData(0x00);
	sLcdWriteCommand(LCD_REG_START_HADD);
	sLcdWriteData(0x00);

	M_LCD_LIGHT_OFF();
	
	bMaxPixelX=xmax;
	bMaxPixelY=ymax;
	
	bMaxCharX=xmax>>3;
	bMaxCharY=ymax>>4;
	
	bLcdReverse=cLcdNormal;
	sDBInitial();

	sLcdClearScreen();
}
/************************************************************************************
*Default settings:	Graphic Mode													*
*					Ram start address:	0x0000										*
*					8 bit a byte													*
*Paramters:			bLineByteNo:How many bytes per line(column)						*
*					bLineNo:How many lines											*
*************************************************************************************/


void	sLcdReset(void)
{
	
	hoLcdReset = 0;
	mLcdSetWrite();
	mLcdSelData();
	mLcdSetELow();
	hoLcdReset = 1;	
	


	sLcdWriteCommand(LCD_REG_MODE);		
	sLcdWriteData(0x32);					
	sLcdWriteCommand(LCD_REG_CHA_PITCH);	
	sLcdWriteData(0x07);					
	sLcdWriteCommand(LCD_REG_CHA_NO);	
	sLcdWriteData(19);					
	sLcdWriteCommand(LCD_REG_DIV_NO);		
	sLcdWriteData(80);					
	sLcdWriteCommand(LCD_REG_CURSOR);
	sLcdWriteData(0x00);
	sLcdWriteCommand(LCD_REG_START_LADD);
	sLcdWriteData(0x00);
	sLcdWriteCommand(LCD_REG_START_HADD);
	sLcdWriteData(0x00);


}
/************************************************************************************
*Function name:		sLcdMoveTo														*
*Parameters:		x,y																*
*this function is used in both character and pixel mode								*
*move the cursor to the pointed position											*
*************************************************************************************/

void	sLcdMoveTo(INT8U x,INT8U y)
{
	if(bMetricsMode==cMetricsPixel)
	{
		wLcdAddress=(x+y*bMaxPixelX)>>3;
			 
	}
	
	else if(bMetricsMode==cMetricsChar)
	{
		wLcdAddress=x+y*16*bMaxCharX;
		bLcdCharX=x;
		bLcdCharY=y;
	}
	
	sLcdWriteCommand(LCD_REG_CUR_LADD);
	sLcdWriteData(wLcdAddress&0x00FF);
	sLcdWriteCommand(LCD_REG_CUR_HADD);
	sLcdWriteData(wLcdAddress>>8);
}

/************************************************************************************
*Function name:		sLcdReverse sLcdNormal											*
*these two functions define the reverse mode of LCD display							*
*************************************************************************************/

void	sLcdReverse(void)
{
	bLcdReverse=cLcdReverse; 
}

void	sLcdNormal(void)
{
	bLcdReverse=cLcdNormal;
}

/************************************************************************************
*Following functions are used only in pixel mode									*
*************************************************************************************/


/************************************************************************************
*Function name:		sLcdPixelSet													*
*Parameters:		x,y																*
*this function is used in pixel mode												*
*set the pixel of position x,y														*
*************************************************************************************/
void	sLcdPixelSet(INT8U	x,INT8U y)
{
	INT16U	bitno;
	
	bMetricsMode=cMetricsPixel;
	sLcdMoveTo(x,y);
	
	bitno=x+y*bMaxPixelX-wLcdAddress*8;

	sLcdWriteCommand(LCD_REG_BSET);
	sLcdWriteData(bitno);

}

/************************************************************************************
*Function name:		sLcdPixelClr													*
*Parameters:		x,y																*
*Description:		this function is used in pixel mode								*
*					clear the pixel of position x,y									*
*************************************************************************************/
void	sLcdPixelClr(INT8U x,INT8U y)
{
	INT16U bitno;
	
	bMetricsMode=cMetricsPixel;
	sLcdMoveTo(x,y);
	
	bitno=x+y*bMaxPixelX-wLcdAddress*8;
	
	sLcdWriteCommand(LCD_REG_BCLR);

⌨️ 快捷键说明

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