📄 lcd_dis.c
字号:
// 2006/10/16 First version
//========================================================================
void Circle(unsigned int x,unsigned int y,int r,int mode)
{
int arx1=0,ary1,arx2,ary2=0;
Pos_Switch(&x,&y); //坐标变换
x += 4;
ary1=r;
arx2=r;
while(1)
{
W_Red_Dot(x,y,arx1,ary1,mode);
W_Red_Err(&arx1,&ary1,&r);
if(arx1 == arx2)
{
W_Red_Dot(x,y,arx1,ary1,mode);
break;
}
W_Red_Dot(x,y,arx2,ary2,mode);
W_Red_Err(&ary2,&arx2,&r);
if(arx1 == arx2)
{
W_Red_Dot(x,y,arx2,ary2,mode);
break;
}
}
}
//========================================================================
// 函数: void Rectangle(unsigned left, unsigned top, unsigned right,
// unsigned bottom, unsigned Mode)
// 描述: 以x,y为圆心R为半径画一个圆(mode = 0) or 圆面(mode = 1)
// 参数: left - 矩形的左上角横坐标,范围0到118
// top - 矩形的左上角纵坐标,范围0到50
// right - 矩形的右下角横坐标,范围1到119
// bottom - 矩形的右下角纵坐标,范围1到51
// Mode - 绘制模式,可以是下列数值之一:
// 0: 矩形框(空心矩形)
// 1: 矩形面(实心矩形)
// 返回: 无
// 备注: 画圆函数执行较慢,如果MCU有看门狗,请作好清狗的操作
// 版本:
// 2005/05/21 First version
//========================================================================
void Rectangle(unsigned left, unsigned top, unsigned right, unsigned bottom, unsigned Mode)
{
unsigned uiTemp;
Pos_Switch(&left,&top); // 坐标变换
Pos_Switch(&right,&bottom); //坐标变换
if(left>right)
{
uiTemp = left;
left = right;
right = uiTemp;
}
if(top>bottom)
{
uiTemp = top;
top = bottom;
bottom = uiTemp;
}
if(Mode==0)
{
Line(left,top,left,bottom);
Line(left,top,right,top);
Line(right,bottom,left+1,bottom);
Line(right,bottom,right,top+1);
}
else
{
for(uiTemp=top;uiTemp<=bottom;uiTemp++)
{
Line_f(left,uiTemp,right);//,uiTemp);
}
}
}
//========================================================================
// 函数: void Writ_Dot(int x,int y,unsigned int Color)
// 描述: 填充以x,y为坐标的象素
// 参数: x X轴坐标 y Y轴坐标 Color 像素颜色
// 返回: 无
// 备注: 这里以及之前的所有x和y坐标系都是用户层的,并不是实际LCD的坐标体系
// 本函数提供可进行坐标变换的接口
// 版本:
// 2006/10/15 First version
//========================================================================
void Writ_Dot(int x,int y,unsigned int Color)
{
#if LCD_XY_Switch == 0
#if (LCD_X_Rev == 0)&&(LCD_Y_Rev == 0)
Write_Dot_LCD(x,y,Color);
#endif
#if (LCD_X_Rev == 1)&&(LCD_Y_Rev == 0)
Write_Dot_LCD(LCD_X_MAX - x,y,Color);
#endif
#if (LCD_X_Rev == 0)&&(LCD_Y_Rev == 1)
Write_Dot_LCD(x,LCD_Y_MAX - y,Color);
#endif
#if (LCD_X_Rev == 1)&&(LCD_Y_Rev == 1)
Write_Dot_LCD(LCD_X_MAX - x,LCD_Y_MAX - y,Color);
#endif
#endif
#if LCD_XY_Switch == 1
#if (LCD_X_Rev == 0)&&(LCD_Y_Rev == 0)
Write_Dot_LCD(y,x,Color);
#endif
#if (LCD_X_Rev == 1)&&(LCD_Y_Rev == 0)
Write_Dot_LCD(y,LCD_Y_MAX - x,Color);
#endif
#if (LCD_X_Rev == 0)&&(LCD_Y_Rev == 1)
Write_Dot_LCD(LCD_X_MAX - y,x,Color);
#endif
#if (LCD_X_Rev == 1)&&(LCD_Y_Rev == 1)
Write_Dot_LCD(LCD_X_MAX - y,LCD_Y_MAX - x,Color);
#endif
#endif
}
//========================================================================
// 函数: unsigned int Get_Dot(int x,int y)
// 描述: 获取x,y为坐标的象素
// 参数: x X轴坐标 y Y轴坐标
// 返回: Color 像素颜色
// 备注: 这里以及之前的所有x和y坐标系都是用户层的,并不是实际LCD的坐标体系
// 本函数提供可进行坐标变换的接口
// 版本:
// 2006/10/15 First version
//========================================================================
unsigned int Get_Dot(int x,int y)
{
#if LCD_XY_Switch == 0
#if (LCD_X_Rev == 0)&&(LCD_Y_Rev == 0)
return Get_Dot_LCD(x,y);
#endif
#if (LCD_X_Rev == 1)&&(LCD_Y_Rev == 0)
return Get_Dot_LCD(LCD_X_MAX - x,y);
#endif
#if (LCD_X_Rev == 0)&&(LCD_Y_Rev == 1)
return Get_Dot_LCD(x,LCD_Y_MAX - y);
#endif
#if (LCD_X_Rev == 1)&&(LCD_Y_Rev == 1)
return Get_Dot_LCD(LCD_X_MAX - x,LCD_Y_MAX - y);
#endif
#endif
#if LCD_XY_Switch == 1
#if (LCD_X_Rev == 0)&&(LCD_Y_Rev == 0)
return Get_Dot_LCD(y,x);
#endif
#if (LCD_X_Rev == 1)&&(LCD_Y_Rev == 0)
return Get_Dot_LCD(y,LCD_Y_MAX - x);
#endif
#if (LCD_X_Rev == 0)&&(LCD_Y_Rev == 1)
return Get_Dot_LCD(LCD_X_MAX - y,x);
#endif
#if (LCD_X_Rev == 1)&&(LCD_Y_Rev == 1)
return Get_Dot_LCD(LCD_X_MAX - y,LCD_Y_MAX - x);
#endif
#endif
}
//========================================================================
// 函数: void Clear_Dot(int x,int y)
// 描述: 清除以x,y为坐标的象素
// 参数: x X轴坐标 y Y轴坐标
// 返回: 无
// 备注: 这里以及之前的所有x和y坐标系都是用户层的,并不是实际LCD的坐标体系
// 本函数提供可进行坐标变换的接口
// 版本:
// 2006/10/15 First version
//========================================================================
void Clear_Dot(int x,int y)
{
#if LCD_XY_Switch == 0
#if (LCD_X_Rev == 0)&&(LCD_Y_Rev == 0)
Clear_Dot_LCD(x,y);
#endif
#if (LCD_X_Rev == 1)&&(LCD_Y_Rev == 0)
Clear_Dot_LCD(LCD_X_MAX - x,y);
#endif
#if (LCD_X_Rev == 0)&&(LCD_Y_Rev == 1)
Clear_Dot_LCD(x,LCD_Y_MAX - y);
#endif
#if (LCD_X_Rev == 1)&&(LCD_Y_Rev == 1)
Clear_Dot_LCD(LCD_X_MAX - x,LCD_Y_MAX - y);
#endif
#endif
#if LCD_XY_Switch == 1
#if (LCD_X_Rev == 0)&&(LCD_Y_Rev == 0)
Clear_Dot_LCD(y,x);
#endif
#if (LCD_X_Rev == 1)&&(LCD_Y_Rev == 0)
Clear_Dot_LCD(y,LCD_Y_MAX - x);
#endif
#if (LCD_X_Rev == 0)&&(LCD_Y_Rev == 1)
Clear_Dot_LCD(LCD_X_MAX - y,x);
#endif
#if (LCD_X_Rev == 1)&&(LCD_Y_Rev == 1)
Clear_Dot_LCD(LCD_X_MAX - y,LCD_Y_MAX - x);
#endif
#endif
}
//========================================================================
// 函数: void Set_Dot_Addr(int x,int y)
// 描述: 设置当前需要操作的象素地址
// 参数: x X轴坐标 y Y轴坐标
// 返回: 无
// 备注: 这里以及之前的所有x和y坐标系都是用户层的,并不是实际LCD的坐标体系
// 本函数提供可进行坐标变换的接口
// 版本:
// 2006/10/15 First version
//========================================================================
void Set_Dot_Addr(int x,int y)
{
#if LCD_XY_Switch == 0
#if (LCD_X_Rev == 0)&&(LCD_Y_Rev == 0)
Set_Dot_Addr_LCD(x,y);
#endif
#if (LCD_X_Rev == 1)&&(LCD_Y_Rev == 0)
Set_Dot_Addr_LCD(LCD_X_MAX - x,y);
#endif
#if (LCD_X_Rev == 0)&&(LCD_Y_Rev == 1)
Set_Dot_Addr_LCD(x,LCD_Y_MAX - y);
#endif
#if (LCD_X_Rev == 1)&&(LCD_Y_Rev == 1)
Set_Dot_Addr_LCD(LCD_X_MAX - x,LCD_Y_MAX - y);
#endif
#endif
#if LCD_XY_Switch == 1
#if (LCD_X_Rev == 0)&&(LCD_Y_Rev == 0)
Set_Dot_Addr_LCD(y,x);
#endif
#if (LCD_X_Rev == 1)&&(LCD_Y_Rev == 0)
Set_Dot_Addr_LCD(y,LCD_Y_MAX - x);
#endif
#if (LCD_X_Rev == 0)&&(LCD_Y_Rev == 1)
Set_Dot_Addr_LCD(LCD_X_MAX - y,x);
#endif
#if (LCD_X_Rev == 1)&&(LCD_Y_Rev == 1)
Set_Dot_Addr_LCD(LCD_X_MAX - y,LCD_Y_MAX - x);
#endif
#endif
}
//========================================================================
// 函数: void Pos_Switch(unsigned int * x,unsigned int * y)
// 描述: 将画面的坐标变换为实际LCD的坐标体系,以便于快速画圆形以及矩形
// 参数: x X轴坐标 y Y轴坐标
// 返回: 无
// 备注: 这里以及之前的所有x和y坐标系都是用户层的,并不是实际LCD的坐标体系
// 本函数提供可进行坐标变换的接口
// 版本:
// 2006/10/15 First version
//========================================================================
void Pos_Switch(unsigned int * x,unsigned int * y)
{
*x = *x;
*y = *y;
#if LCD_XY_Switch == 0
#if (LCD_X_Rev == 0)&&(LCD_Y_Rev == 0)
#endif
#if (LCD_X_Rev == 1)&&(LCD_Y_Rev == 0)
*x = LCD_X_MAX-*x;
#endif
#if (LCD_X_Rev == 0)&&(LCD_Y_Rev == 1)
*y = LCD_Y_MAX-*y;
#endif
#if (LCD_X_Rev == 1)&&(LCD_Y_Rev == 1)
*x = LCD_X_MAX-*x;
*y = LCD_Y_MAX-*y;
#endif
#endif
#if LCD_XY_Switch == 1
unsigned int uiTemp;
#if (LCD_X_Rev == 0)&&(LCD_Y_Rev == 0)
uiTemp = *x;
*x = y;
*y = uiTemp;
#endif
#if (LCD_X_Rev == 1)&&(LCD_Y_Rev == 0)
uiTemp = LCD_Y_MAX-*x;
*x = *y;
*y = uiTemp;
#endif
#if (LCD_X_Rev == 0)&&(LCD_Y_Rev == 1)
uiTemp = *x;
*x = LCD_X_MAX-*y;
*y = uiTemp;
#endif
#if (LCD_X_Rev == 1)&&(LCD_Y_Rev == 1)
uiTemp = LCD_Y_MAX - *x;
*x = LCD_X_MAX-*y;
*y = uiTemp;
#endif
#endif
}
//========================================================================
// 函数: void W_Line_f(int s_x,int s_y,int e_x,int e_y,int Mode)
// 描述: 以s_x,s_y为起点,e_x,e_y为终点连续填充一条直线上的点.用于画矩形、圆
// 参数: x X轴坐标 y Y轴坐标
// 返回: 无
// 备注: 以实际的LCD坐标体系为准
// 版本:
// 2006/10/16 First version
//========================================================================
void Line_f(int s_x,int s_y,int e_x)//,int e_y)
{
unsigned int uiTemp;
if(s_x>e_x)
{
uiTemp = s_x;
s_x = e_x;
e_x = uiTemp;
}
Write_Dot_LCD(s_x++,s_y,BMP_Color);
for(;s_x<=e_x;s_x++)
Fill_Dot_LCD(BMP_Color);
}
//========================================================================
// 函数: void ClrScreen(void)
// 描述: 全屏以初始化屏幕色的颜色进行清屏
// 参数: 无
// 返回: 无
// 备注: 无
// 版本:
// 2007/01/16 First version
//========================================================================
void ClrScreen(void)
{
Set_Dot_Addr_LCD(0,0);
LCD_Fill(LCD_INITIAL_COLOR);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -