📄 lcdb_driver.c
字号:
}
else if(id == 2)
{
para = MAP3|CURSOR;
LCDBGraph_BaseAddr = SAD3_ADDR;
}
else
return FALSE;
LCDB_WriteCmdPara(CMD_DISPON, ¶, 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 + -