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

📄 lcdb_driver.c

📁 C8051F020的LCD的驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
    }
	else if(id == 2)
	{
		para = MAP3|CURSOR;
		LCDBGraph_BaseAddr = SAD3_ADDR;
	}
	else
		return FALSE;

	LCDB_WriteCmdPara(CMD_DISPON, &para, 1);
	return TRUE;	
}

/***********************************************************************************
* Function: LCDB_DrawPixel;
*
* Description: 画点(x,y);
*              
* Input:  x, LCD行坐标; y, LCD列坐标; bit类型标识mode,1:画点,0:擦除点;
*
* Output: none;
*
* Return: none;
*
* Note:   none;
************************************************************************************/
void LCDB_DrawPixel(unsigned int x, y, bit mode)
{
	unsigned int xdata StartAddr;
	unsigned char xdata val,dat;

	StartAddr=x*LCDB_LineChar + (y>>3) + LCDBGraph_BaseAddr;
	y = (unsigned char)y&0x07;

	LCDB_WriteCmd(CMD_CSRDOWN);
    LCDB_WriteCmd(CMD_CSRW);   					// 设置光标地址
    LCDB_WriteData((unsigned char)StartAddr);   // 计算光标地址
    LCDB_WriteData((unsigned char)(StartAddr>>8));
	LCDB_WriteCmd(CMD_MREAD);  					// MREAD 代码 
	
	dat=LCDB_ReadData();   						// 读取当前显示数据

	val = 0x01<<(7-y);	
	if(mode) 
		val = val|dat;
	else
		val = (~val)&dat;

	LCDB_WriteCmd(CMD_CSRW);   					// 设置光标地址 
    LCDB_WriteData((unsigned char)StartAddr); 	// 计算光标地址
    LCDB_WriteData((unsigned char)(StartAddr>>8));
	LCDB_WriteCmd(CMD_MWRITE);  				// MWRITE 代码
	LCDB_WriteData(val);						// 写入合成数据
}


/***********************************************************************************
* Function: LCDB_DrawLine;
*
* Description: (x1,y1)--(x2,y2)处划线;
*              
* Input:  x1,x2, LCD行坐标; y1,y2, LCD列坐标; bit类型标识mode,1:画直线:擦除直线;
*
* Output: none;
*
* Return: none;
*
* Note:   none;
************************************************************************************/
void LCDB_DrawLine(unsigned int x1, y1, x2, y2, bit mode)
{
	unsigned int xdata x,y;
	double xdata k,b;

	if( abs(y1-y2) <= abs(x1-x2) ) // |k|<=1
	{
		k=(float)(y2-y1) / (float)(x2-x1) ;
		b=y1-k*x1;

		if( x1 <= x2 )
		{
			for(x=x1;x<=x2;x++)
			{
				y=k*x+b;
				LCDB_DrawPixel(x, y, mode);
			}
		}
		else
		{
			for(x=x2;x<=x1;x++)
			{ 
				y=k*x+b;
				LCDB_DrawPixel(x, y, mode);
			}
		}
	}
	else // abs(y1-y2) > abs(x1-x2) |K|>1
	{
		k=(float)(x2-x1) / (float)(y2-y1) ;
		b=x1-k*y1;

		if( y1 <= y2 )
		{
			for(y=y1;y<=y2;y++)
			{ 
				x=k*y+b;
				LCDB_DrawPixel( x , y, mode);
			}
		}
		else
		{
			for(y=y2;y<=y1;y++)
			{ 
				x=k*y+b;
				LCDB_DrawPixel( x , y, mode);
			}
		}
	}
}


/***********************************************************************************
* Function: LCDB_DrawRectangle;
*
* Description: 以(x1,y1)和(x2,y2)为对角点画矩形;
*              
* Input:  x1,x2, LCD行坐标; y1,y2, LCD列坐标; bit类型标识mode,1:画矩形,0:擦除矩形;
*
* Output: none;
*
* Return: none;
*
* Note:   none;
************************************************************************************/
void  LCDB_DrawRectangle(unsigned int x1, y1, x2, y2, bit mode)
{
	LCDB_DrawLine(x1,y1,x2,y1,mode);
	LCDB_DrawLine(x1,y1,x1,y2,mode);

	LCDB_DrawLine(x2,y1,x2,y2,mode);
	LCDB_DrawLine(x1,y2,x2,y2,mode);
}

/***********************************************************************************
* Function: LCDB_DrawFillRectangle;
*
* Description: 以(x1,y1)和(x2,y2)为对角点画矩形实体;
*              
* Input:  x1,x2, LCD行坐标; y1,y2, LCD列坐标; bit类型标识mode,1:画矩形实体,0:擦除矩形实体;
*
* Output: none;
*
* Return: none;
*
* Note:   none;
************************************************************************************/
void  LCDB_DrawFillRectangle(unsigned int x1, y1, x2, y2, bit mode)
{
	unsigned int xdata i;
	for (i=x1; i<=x2; i++)
		LCDB_DrawLine(i,y1,i,y2,mode);
}

/***********************************************************************************
* Function: LCDB_DrawCircle;
*
* Description: 以(x,y)为圆心, r为半径画圆;
*              
* Input:  x, LCD行坐标; y, LCD列坐标; bit类型标识mode,1:画圆,0:擦除圆;
*
* Output: none;
*
* Return: none;
*
* Note:   none;
************************************************************************************/
void  LCDB_DrawCircle(unsigned int x, y, r, bit mode)
{
	unsigned int xdata r_2,i,x1,y1,temp_x;
	unsigned int xdata temp;

	r_2=0.707*r;
	temp=r*r;

	for (i=0; i<=r_2; i++)
	{
		if (mode)
		{
			if (!(i&0x01))
			{	

				x1=i;
				y1=sqrt(1.0*(temp-x1*x1))+0.5;
				LCDB_DrawPixel(x1+x,y1+y,mode);
				LCDB_DrawPixel(-x1+x,y1+y,mode);
				LCDB_DrawPixel(x1+x,-y1+y,mode);
				LCDB_DrawPixel(-x1+x,-y1+y,mode);
		
				temp_x=x1;
				x1=y1;
				y1=temp_x;
		
				LCDB_DrawPixel(x1+x,y1+y,mode);
				LCDB_DrawPixel(-x1+x,y1+y,mode);
				LCDB_DrawPixel(x1+x,-y1+y,mode);
				LCDB_DrawPixel(-x1+x,-y1+y,mode);
			}
		}
		else
		{
			x1=i;
			y1=sqrt(1.0*(temp-x1*x1))+0.5;
			LCDB_DrawPixel(x1+x,y1+y,mode);
			LCDB_DrawPixel(-x1+x,y1+y,mode);
			LCDB_DrawPixel(x1+x,-y1+y,mode);
			LCDB_DrawPixel(-x1+x,-y1+y,mode);
	
			temp_x=x1;
			x1=y1;
			y1=temp_x;
	
			LCDB_DrawPixel(x1+x,y1+y,mode);
			LCDB_DrawPixel(-x1+x,y1+y,mode);
			LCDB_DrawPixel(x1+x,-y1+y,mode);
			LCDB_DrawPixel(-x1+x,-y1+y,mode);
		}
	}
}

/***********************************************************************************
* Function: LCDB_DrawByte;
*
* Description: 向LCD(x,y)点开始写一个字节数据;
*              
* Input:  x, LCD行坐标; y, LCD列坐标; value,写入字节数据;
*
* Output: none;
*
* Return: none;
*
* Note:   应尽量使y(LCD列坐标)是8的整数倍,可使显示速度加快;
************************************************************************************/
void  LCDB_DrawByte(unsigned int x, y, unsigned char val)
{
	unsigned char xdata dat1,dat2,bit_x;
	unsigned int xdata StartAddr;

	bit_x=(unsigned char)y&0x07;	
	StartAddr=x*LCDB_LineChar + (y>>3) + LCDBGraph_BaseAddr; 

	if (bit_x==0)
	{	
		LCDB_WriteCmd(CMD_CSRW);   					// 设置光标地址 
    	LCDB_WriteData((unsigned char)StartAddr); 	// 计算光标地址
    	LCDB_WriteData((unsigned char)(StartAddr>>8));
		LCDB_WriteCmd(CMD_MWRITE);  				// MWRITE 代码
		LCDB_WriteData(val);						// 写入合成数据
	}
	else
	{
		LCDB_WriteCmd(CMD_CSRRGT);
		LCDB_WriteCmd(CMD_CSRW);   					// 设置光标地址
		LCDB_WriteData((unsigned char)StartAddr);   // 计算光标地址
    	LCDB_WriteData((unsigned char)(StartAddr>>8));
		LCDB_WriteCmd(CMD_MREAD);  					// MREAD 代码 
    	dat1=LCDB_ReadData();   					// 读取当前显示数据
 		dat2=LCDB_ReadData();   					// 读取当前显示数据
		
		dat1&=(0xff<<(8-bit_x));   	
		dat1|=(val>>bit_x);
			
		dat2&=(0xff>>bit_x);   	
		dat2|=(val<<(8-bit_x));
		
		LCDB_WriteCmd(CMD_CSRRGT);
		LCDB_WriteCmd(CMD_CSRW);   					// 设置光标地址
		LCDB_WriteData((unsigned char)StartAddr);   // 计算光标地址
    	LCDB_WriteData((unsigned char)(StartAddr>>8));
		LCDB_WriteCmd(CMD_MWRITE);  				// MWRITE 代码
		LCDB_WriteData(dat1);						// 写入合成数据
    	LCDB_WriteData(dat2);						// 写入合成数据
	}
}

/***********************************************************************************
* Function: LCDB_ShowHZxy;
*
* Description: 从LCD(x,y)点开始显示(line*col)的字符;
*              
* Input:  x, LCD行坐标; y, LCD列坐标; line,字符占用行数; col,字符占用列数;
*         *p,字符数据指针;
*
* Output: none;
*
* Return: none;
*
* Note:   应尽量使y(LCD列坐标)是8的整数倍,可使显示速度加快; 本函数也可作为自定义图形显示;
************************************************************************************/
void LCDB_ShowHZxy(unsigned int x, y, unsigned int line, col, unsigned char *p)
{
	unsigned int xdata i,j;

	for(i=0;i<line;i++)
	{
		for(j=0;j<col;j+=8)
			LCDB_DrawByte(x+i,y+j,*p++);
	}
}

/************************************************************************************
* 文件结束
************************************************************************************/









⌨️ 快捷键说明

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