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

📄 lcddriver.c

📁 包含所有LCD7981接口定义
💻 C
📖 第 1 页 / 共 2 页
字号:
	sLcdWriteData(bitno);
	
}

/************************************************************************************
*Function name:		sLcdHLine														*
*Parameters:		x,y left pixel  of the line										*
*					len:the length of line											*
*Description:		this function is used only for horizontal line					*
*					the colour of line is based on bLcdReverse						*
*************************************************************************************/

void	sLcdHLine(INT8U	x,INT8U y,INT16U len)
{
	INT8U	bLowBitNo;
	INT8U	bHighBitNo;
	INT8U	bByteNo;
	INT8U	bBitMask;
	
	INT16U	temp;
	
	
	temp=x+y*bMaxPixelX;
	bLowBitNo=(temp-(temp>>3)*8);
	if(bLowBitNo!=0)
	{
		bLowBitNo=8-bLowBitNo;
	}
	
	
	temp=x+y*bMaxPixelX+len-1;
	bHighBitNo=(temp-(temp>>3)*8);
	if(bHighBitNo!=7)
	{
		bHighBitNo+=1;
	}
	else
	{
		bHighBitNo=0;
	}

	bByteNo=(len-bHighBitNo-bLowBitNo)>>3;
	
	bMetricsMode=cMetricsPixel;
	
	
	if(bLowBitNo!=0)
	{
		bBitMask=((1<<(8-bLowBitNo))-1);
		sLcdMoveTo(x,y);
		sLcdWriteCommand(LCD_REG_READ);
		temp=sbLcdReadData();
		sLcdWriteCommand(LCD_REG_READ);
		temp=sbLcdReadData();
		if(bLcdReverse==cLcdNormal)
		{
			temp|=~bBitMask;
		}
		else
		{
			temp&=bBitMask;
		}
		sLcdMoveTo(x,y);
		sLcdWriteCommand(LCD_REG_DATA);
		sLcdWriteData(temp);
	}
	if(bByteNo!=0)
	{
		sLcdMoveTo(x+bLowBitNo,y);
		sLcdWriteCommand(LCD_REG_DATA);
		for(temp=0;temp<bByteNo;temp++)
		{
			if(bLcdReverse==cLcdNormal)
			{
				sLcdWriteData(0x00FF);
			}
			else
			{
				sLcdWriteData(0x0000);
			}
		}
	}
	if(bHighBitNo!=0)
	{
		bBitMask=(1<<(bHighBitNo))-1;
		sLcdMoveTo(x+len-1,y);
		sLcdWriteCommand(LCD_REG_READ);
		temp=sbLcdReadData();
		sLcdWriteCommand(LCD_REG_READ);
		temp=sbLcdReadData();
		if(bLcdReverse==cLcdNormal)
		{
			temp|=bBitMask;
		}
		else
		{
			temp&=~bBitMask;
		}
		sLcdMoveTo(x+len-1,y);
		sLcdWriteCommand(LCD_REG_DATA);
		sLcdWriteData(temp);
	}
	
}
		


/************************************************************************************
*Function name:		sLcdVLine														*
*Parameters:		x,y up pixel of the line										*
*					len:the length of line											*
*Description:		this function is used only for vertical line					*
*					the colour of line is based on bLcdReverse						*
*************************************************************************************/

void	sLcdVLine(INT8U	x,INT8U y,INT16U len)
{
	INT8U i;
	
	for(i=0;i<len;i++)
	{
		if(bLcdReverse==cLcdNormal)
		{
			sLcdPixelSet(x,y+i);
		}
		else
		{
			sLcdPixelClr(x,y+i);
		}
	}
}	

	
/************************************************************************************
*Function name:		sLcdFillRect													*
*Parameters:		x0,y0:top left pixel											*
*					xLen,yLen:size of the rectangle									*
*Description:		this function is used only in pixel mode						*
*					draw a rectangle in the region									*
*************************************************************************************/
void	sLcdFillRect(INT8U x0,INT8U y0,INT8U xLen,INT8U yLen)
{
	INT8U i;
//	INT8U j;
			
	for(i=0;i<yLen;i++)
	{
		sLcdHLine(x0,i+y0,xLen);
	}
}



void sLcdShowBmp(INT8U x,INT8U y,INT8U bWidth,INT8U bHeight,INT16U bDataAddr,INT8U bByteOrData)
{
	INT16U	addr;
	INT8U	i,j;
		
	bMetricsMode=cMetricsChar;
	
	sLcdMoveTo(x,y);
	
	addr=wLcdAddress;	
	
	sLcdWriteCommand(LCD_REG_DATA);
	
	
	if(bByteOrData == 1)
	{
		for(i=0;i<bHeight;i++)
		{
			for(j=0;j<(bWidth/16);j++)
			{
				wBankedDataAddress=bDataAddr+(i*(bWidth/16)+j)*2;
				sReadBankedData();
				sLcdDisplayByte(addr+j*2,wBankedData/256,cNotInv);
				sLcdDisplayByte(addr+j*2+1,wBankedData%256,cNotInv);
				
			}
			addr+=bMaxCharX;
		}
	}
	else if(bByteOrData == 0)
	{
		for(i=0;i<bHeight;i++)
		{
			for(j=0;j<(bWidth/8);j++)
			{
				wBankedDataAddress=bDataAddr+(i*(bWidth/8)+j)*2;
				sReadBankedData();
				sLcdDisplayByte(addr+j,wBankedData/256,cNotInv);
				addr+=bMaxCharX;
				sLcdDisplayByte(addr+j,wBankedData%256,cNotInv);
				
			}
		}	
	}

}


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

void	sLcdClearScreen(void)
{
	INT8U	i;
	INT8U 	j;
	
	bMetricsMode=cMetricsChar;
	
	sLcdMoveTo(0,0);

	sLcdWriteCommand(LCD_REG_DATA);
	
	for(i=0;i<bMaxCharX;i++)
 	{
  		for(j=0;j<bMaxPixelY;j++)
  		{
  			sLcdWriteData(0x0000); 
  		}
 	}
}

/************************************************************************************
*Function name:	LcdInvData															*
*Parameters:	data:the data to be displayed		 								*
*This function inverter the data from database										*
*************************************************************************************/

INT8U	LcdInvData(INT8U data)
{
	INT8U	temp;
	temp=0;
	temp+=((data&0x0001)<<7);
	temp+=(((data>>1)&0x0001)<<6);
	temp+=(((data>>2)&0x0001)<<5);
	temp+=(((data>>3)&0x0001)<<4);
	temp+=(((data>>4)&0x0001)<<3);
	temp+=(((data>>5)&0x0001)<<2);
	temp+=(((data>>6)&0x0001)<<1);
	temp+=((data>>7)&0x0001);
	if(bLcdReverse==cLcdReverse)
	{
		temp=~temp;
	}
	return(temp);
}			
/************************************************************************************
*Function name:	LcdDisplayByte														*
*Parameters:	address:the phisical address in display ram							*
*				data:one byte data to be displayed									*
*This function inverter the data from database										*
*************************************************************************************/
void	sLcdDisplayByte(INT16U addr,INT8U data,INT8U bInv)
{
	INT16U temp;
	if(bInv==cInv)
	{
		temp=LcdInvData(data);
	}
	else
	{
		temp=data;
	}
	sLcdWriteCommand(LCD_REG_CUR_LADD);
	sLcdWriteData(addr&0x00FF);
	sLcdWriteCommand(LCD_REG_CUR_HADD);
	sLcdWriteData(addr>>8);
	sLcdWriteCommand(LCD_REG_DATA);
	sLcdWriteData(temp);
}


/****************************************************************************************
*Function name:			sLcdShowHalfWord												*
*Parameters:			pdata:	the pointer to the database to be displayed				*
*Description:			show a half word in the screen,the position must be set by		*
*						sLcdMoveTo,after the function,the position turns to the next	*
*						position automaticly											*
*****************************************************************************************/

void	sLcdShowHalfWord(INT16U *pdata)
{
	INT16U	addr;
	INT8U	i;
	
	
	addr=wLcdAddress;
	
	sLcdDisplayByte(addr,0,cInv);
	addr+=bMaxCharX;
	
	wBankedDataAddress=(INT16U)(pdata);
	
	for(i=0;i<7;i++)
	{
		sReadBankedData();
		sLcdDisplayByte(addr,(wBankedData)>>8,cInv);
		addr+=bMaxCharX;
		sLcdDisplayByte(addr,(wBankedData)&0x00FF,cInv);
		addr+=bMaxCharX;
		wBankedDataAddress+=2;
	}
	sLcdDisplayByte(addr,0,cInv);
	
	bLcdCharX++;
	if(bLcdCharX>=bMaxCharX)
	{
		bLcdCharX=0;
		bLcdCharY++;
	}
	sLcdMoveTo(bLcdCharX,bLcdCharY);	
}

/****************************************************************************************
*Function name:			sLcdShowWord													*
*Parameters:			pdata:	the pointer to the database to be displayed				*
*Description:			show  a  word in the screen,the position must be set by			*
*						sLcdMoveTo,after the function,the position turns to the next	*
*						position automaticly											*
*****************************************************************************************/
void	sLcdShowWord(INT16U *pdata)
{
	INT16U	addr;
	INT8U	i;
		
	addr=wLcdAddress;
	
	
	sLcdDisplayByte(addr,0,cInv);
	sLcdDisplayByte(addr+1,0,cInv);
	
	addr+=bMaxCharX;

	wBankedDataAddress=(INT16U)(pdata);

	for(i=0;i<14;i++)
	{
		sReadBankedData();
		sLcdDisplayByte(addr,(wBankedData)>>8,cInv);
		sLcdDisplayByte(addr+1,(wBankedData)&0x00FF,cInv);
		addr+=bMaxCharX;
		wBankedDataAddress+=2;
	}
	
	sLcdDisplayByte(addr,0,cInv);
	sLcdDisplayByte(addr+1,0,cInv);

	bLcdCharX+=2;
	if(bLcdCharX>=bMaxCharX)
	{
		bLcdCharX=0;
		bLcdCharY++;
	}
	sLcdMoveTo(bLcdCharX,bLcdCharY);
	
}

/************************************************************************************
*Functuon name:	sLcdShowSingleChar													*
*Parameter:		code:		the data to be displayed								*
*************************************************************************************/
void	sLcdShowSingleChar(INT16U code)
{
	INT16U	*pdata;

	pdata=sbDBSearchCode(code); 
	
	
	if(pdata==NULL)
	{
		return;
	}
	
	if(code<0x0080)
	{
		sLcdShowHalfWord(pdata);
	}
	else 
	{
		sLcdShowWord(pdata);
	}
}
	

/************************************************************************************
*Functuon name:	sLcdShowChar														*
*Parameter:		x,y																	*
*				pString:	the pointer to the string								*
*************************************************************************************/
void	sLcdShowString(INT8U x,INT8U y,INT8U *pString)
{
	INT8U	*p1;
	INT16U	*p2;
	
	bMetricsMode=cMetricsChar;
	sLcdMoveTo(x,y);
	while(1)
	{
		
		if(*pString=='\0')
		{
			break;
		}
		
		if(*pString<0x0080)
		{
			p1=pString;
			sLcdShowSingleChar(*p1);
			p1++;
			pString=p1;
		}
		else
		{
			
			p2=(INT16U*)pString;
			sLcdShowSingleChar(*p2);
			
			p2++;
			pString=(INT8U*)p2;
		}
	
	}
}


/************************************************************************************
*For User defined Database															*
*************************************************************************************/

/************************************************************************************
*Functuon name:	sLcdShowUserHalfChar												*
*Parameter:		x,y																	*
*				pdata:		the pointer to the user's database						*
*Description:	show user's half character in (x,y)									*
*************************************************************************************/
void	sLcdShowUserEChar(INT8U  x,INT8U y,INT16U *pdata)
{
	bMetricsMode=cMetricsChar;
	sLcdMoveTo(x,y);
	sLcdShowHalfWord(pdata);
}

/************************************************************************************
*Functuon name:	sLcdShowUserChar													*
*Parameter:		x,y																	*
*				pdata:		the pointer to the user's database						*
*Description:	show user's character in (x,y)										*
*************************************************************************************/
void	sLcdShowUserCChar(INT8U x,INT8U y,INT16U *pdata)
{
	bMetricsMode=cMetricsChar;
	sLcdMoveTo(x,y);
	sLcdShowWord(pdata);
}


INT8U sGetLcdBackLight(void)
{
	return M_GET_LCD_LIGHT;
}

⌨️ 快捷键说明

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