📄 lcddrive.c
字号:
** 操作失败原因是指定地址超出缓冲区范围。
** Input: x0 水平线起点所在列的位置
** y0 水平线起点所在行的位置
** x1 水平线终点所在列的位置
** color 显示颜色
** Output: 无
** Created by: 黄绍斌
** Created Date: 2005-12-31
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void GUI_HLine(uint16 x0, uint16 y0, uint16 x1, TCOLOR color)
{
volatile uint16 *p_buffer;
uint16 bak;
if(x0 > x1) // 对x0、x1大小进行排列,以便画图
{
bak = x1;
x1 = x0;
x0 = bak;
}
if(x0 >= GUI_LCM_XMAX) return; // 参数过滤
if(y0 >= GUI_LCM_YMAX) return;
p_buffer = (uint16 *)FrameBuffer; // 设置填充显示缓冲区的地址
p_buffer = p_buffer + y0*GUI_LCM_XMAX + x0; // 计算显示点对应显示缓冲区的位置
while(x1 >= x0)
{
*p_buffer++ = color; // 不断填充并显示
x0++;
if(x0 >= GUI_LCM_XMAX) return; // 若超出一行的范围,则直接退出
}
}
/*********************************************************************************************************
** Function name: GUI_RLine
** Descriptions: 画垂直线。
** 操作失败原因是指定地址超出缓冲区范围。
** Input: x0 垂直线起点所在列的位置
** y0 垂直线起点所在行的位置
** y1 垂直线终点所在行的位置
** color 显示颜色
** Output: 无
** Created by: 黄绍斌
** Created Date: 2005-12-31
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void GUI_RLine(uint16 x0, uint16 y0, uint16 y1, TCOLOR color)
{
uint16 bak;
if(y0 > y1) // 对y0、y1大小进行排列,以便画图
{
bak = y1;
y1 = y0;
y0 = bak;
}
if(x0 >= GUI_LCM_XMAX) return; // 参数过滤
if(y0 >= GUI_LCM_YMAX) return;
while(y1 >= y0)
{
GUI_Point(x0, y0, color); // 逐点显示,描出垂直线
y0++;
if(y0 >= GUI_LCM_YMAX) return; // 若超出屏幕的范围,则直接退出
}
}
/*********************************************************************************************************
** Function name: GUI_Rectangle
** Descriptions: 画矩形。
** 操作失败原因是指定地址超出缓冲区范围。
** Input: x0 矩形左上角的x坐标值
** y0 矩形左上角的y坐标值
** x1 矩形右下角的x坐标值
** y1 矩形右下角的y坐标值
** color 显示颜色
** Output: 无
** Created by: 黄绍斌
** Created Date: 2005-12-31
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void GUI_Rectangle(uint32 x0, uint32 y0, uint32 x1, uint32 y1, TCOLOR color)
{
GUI_HLine(x0, y0, x1, color);
GUI_HLine(x0, y1, x1, color);
GUI_RLine(x0, y0, y1, color);
GUI_RLine(x1, y0, y1, color);
}
/*********************************************************************************************************
** Function name: GUI_RectangleFill
** Descriptions: 填充矩形。画一个填充的矩形,填充色与边框色一样。
** 操作失败原因是指定地址超出缓冲区范围。
** Input: x0 矩形左上角的x坐标值
** y0 矩形左上角的y坐标值
** x1 矩形右下角的x坐标值
** y1 矩形右下角的y坐标值
** color 填充颜色
** Output: 无
** Created by: 黄绍斌
** Created Date: 2005-12-31
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void GUI_RectangleFill(uint32 x0, uint32 y0, uint32 x1, uint32 y1, TCOLOR color)
{
uint32 i;
// 先找出矩形左上角与右下角的两个点,保存在(x0,y0),(x1,y1)
if(x0 > x1) // 若x0>x1,则x0与x1交换
{
i = x0;
x0 = x1;
x1 = i;
}
if(y0 > y1) // 若y0>y1,则y0与y1交换
{
i = y0;
y0 = y1;
y1 = i;
}
// 判断是否只是直线
if(y0 == y1)
{
GUI_HLine(x0, y0, x1, color);
return;
}
if(x0 == x1)
{
GUI_RLine(x0, y0, y1, color);
return;
}
while(y0 <= y1)
{
GUI_HLine(x0, y0, x1, color); // 当前画水平线
y0++; // 下一行
}
}
/*********************************************************************************************************
** Function name: GUI_Line
** Descriptions: 画任意两点之间的直线。
** 操作失败原因是指定地址超出缓冲区范围。
** Input: x0 直线起点的x坐标值
** y0 直线起点的y坐标值
** x1 直线终点的x坐标值
** y1 直线终点的y坐标值
** color 显示颜色(对于黑白色LCM,为0时灭,为1时显示)
** Output: 无
** Created by: 黄绍斌
** Created Date: 2005-12-31
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void GUI_Line(uint32 x0, uint32 y0, uint32 x1, uint32 y1, TCOLOR color)
{
int32 dx; // 直线x轴差值变量
int32 dy; // 直线y轴差值变量
int8 dx_sym; // x轴增长方向,为-1时减值方向,为1时增值方向
int8 dy_sym; // y轴增长方向,为-1时减值方向,为1时增值方向
int32 dx_x2; // dx*2值变量,用于加快运算速度
int32 dy_x2; // dy*2值变量,用于加快运算速度
int32 di; // 决策变量
dx = x1-x0; // 求取两点之间的差值
dy = y1-y0;
// 判断增长方向,或是否为水平线、垂直线、点
if(dx>0) // 判断x轴方向
{
dx_sym = 1; // dx>0,设置dx_sym=1
}
else
{
if(dx<0)
{
dx_sym = -1; // dx<0,设置dx_sym=-1
}
else
{
// dx==0,画垂直线,或一点
GUI_RLine(x0, y0, y1, color);
return;
}
} // end of if(dx>0)...else...
if(dy>0) // 判断y轴方向
{
dy_sym = 1; // dy>0,设置dy_sym=1
}
else
{
if(dy<0)
{
dy_sym = -1; // dy<0,设置dy_sym=-1
}
else
{
// dy==0,画水平线,或一点
GUI_HLine(x0, y0, x1, color);
return;
}
} // end of if(dy>0)...else...
// 将dx、dy取绝对值
dx = dx_sym * dx;
dy = dy_sym * dy;
// 计算2倍的dx及dy值
dx_x2 = dx*2;
dy_x2 = dy*2;
// 使用Bresenham法进行画直线
if(dx >= dy) // 对于dx>=dy,则使用x轴为基准
{
di = dy_x2 - dx;
while(x0 != x1)
{
GUI_Point(x0, y0, color);
x0 += dx_sym;
if(di<0)
{
di += dy_x2; // 计算出下一步的决策值
}
else
{
di += dy_x2 - dx_x2;
y0 += dy_sym;
}
} // end of while(x0 != x1)...
GUI_Point(x0, y0, color); // 显示最后一点
}
else // 对于dx<dy,则使用y轴为基准
{
di = dx_x2 - dy;
while(y0 != y1)
{
GUI_Point(x0, y0, color);
y0 += dy_sym;
if(di<0)
{
di += dx_x2;
}
else
{
di += dx_x2 - dy_x2;
x0 += dx_sym;
}
} // end of while(y0 != y1)...
GUI_Point(x0, y0, color); // 显示最后一点
} // end of if(dx >= dy)...else...
}
/*********************************************************************************************************
** Function name: GUI_DispPic
** Descriptions: 指定位置显示图片(图片大小为w、h)。
** 不能正确显示原因可能是指定的起始点不对,或高度、宽度超出液晶显示范围,或数据格式错误。
** Input: x,y 更新区域的起始点(左上角)
* w,h 区域宽度和高度
* buffer 显示数据缓冲区(uint16, 格式为 R:5, G:6, B:5)
** Output: 无
** Created by: 黄绍斌
** Created Date: 2005-12-31
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void GUI_DispPic( uint16 x, uint16 y,
uint16 w, uint16 h,
uint16 *buffer)
{
int i, j;
volatile uint16 *p_buffer;
// 需填充区域参数过滤
if( (x >= GUI_LCM_XMAX) ||
(y >= GUI_LCM_YMAX)
)
{ return;
}
if((x+w) > GUI_LCM_XMAX)
{ return;
}
if((y+h) > GUI_LCM_YMAX)
{ return;
}
// 更新显示数据
for(i=0; i<h; i++) // 输出h行数据
{
// 输出一行(w)数据
p_buffer = (uint16 *)FrameBuffer;
p_buffer = p_buffer + y*GUI_LCM_XMAX + x;
for(j=0; j<w; j++)
{
*p_buffer++ = *buffer++; // 输出数据
}
// 指向下一行
y++;
} // end of for(i=0; i<h; i++)...
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -