📄 gui_basic.lst
字号:
C51 COMPILER V7.50 GUI_BASIC 09/11/2007 21:56:45 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE GUI_BASIC
OBJECT MODULE PLACED IN .\OBJ\GUI_BASIC.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE GUI_BASIC.C LARGE BROWSE DEBUG OBJECTEXTEND PRINT(.\LST\GUI_BASIC.lst) OBJE
-CT(.\OBJ\GUI_BASIC.obj)
line level source
1 /****************************************************************************************
2 * 文件名:GUI_BASIC.C
3 * 功能:GUI基本绘图函数。进行基本绘图运算,并调用相应的刷新程序更新LCD显示。
4 * 作者:黄绍斌
5 * 日期:2004.02.26
6 * 备注:图形操作层,进行各种图形运算操作。
7 ****************************************************************************************/
8 #include "config.h"
9 #include <math.h>
10
11 #if GUI_Basic_EN==1
12 /****************************************************************************
13 * 名称:GUI_Rectangle()
14 * 功能:画矩形。
15 * 入口参数: x0 矩形左上角的x坐标值
16 * y0 矩形左上角的y坐标值
17 * x1 矩形右下角的x坐标值
18 * y1 矩形右下角的y坐标值
19 * color 显示颜色
20 * 出口参数:无
21 * 说明:操作失败原因是指定地址超出有效范围。
22 ****************************************************************************/
23 void GUI_Rectangle(uint32 x0, uint32 y0, uint32 x1, uint32 y1, TCOLOR color)
24 { GUI_HLine(x0, y0, x1, color);
25 1 GUI_HLine(x0, y1, x1, color);
26 1 GUI_RLine(x0, y0, y1, color);
27 1 GUI_RLine(x1, y0, y1, color);
28 1 }
29
30
31 /****************************************************************************
32 * 名称:GUI_RectangleFill()
33 * 功能:填充矩形。画一个填充的矩形,填充色与边框色一样。
34 * 入口参数: x0 矩形左上角的x坐标值
35 * y0 矩形左上角的y坐标值
36 * x1 矩形右下角的x坐标值
37 * y1 矩形右下角的y坐标值
38 * color 填充颜色
39 * 出口参数:无
40 * 说明:操作失败原因是指定地址超出有效范围。
41 ****************************************************************************/
42 void GUI_RectangleFill(uint32 x0, uint32 y0, uint32 x1, uint32 y1, TCOLOR color)
43 { uint32 i;
44 1
45 1 /* 先找出矩形左上角与右下角的两个点,保存在(x0,y0),(x1,y1) */
46 1 if(x0>x1) // 若x0>x1,则x0与x1交换
47 1 { i = x0;
48 2 x0 = x1;
49 2 x1 = i;
50 2 }
51 1 if(y0>y1) // 若y0>y1,则y0与y1交换
52 1 { i = y0;
53 2 y0 = y1;
54 2 y1 = i;
C51 COMPILER V7.50 GUI_BASIC 09/11/2007 21:56:45 PAGE 2
55 2 }
56 1
57 1 /* 判断是否只是直线 */
58 1 if(y0==y1)
59 1 { GUI_HLine(x0, y0, x1, color);
60 2 return;
61 2 }
62 1 if(x0==x1)
63 1 { GUI_RLine(x0, y0, y1, color);
64 2 return;
65 2 }
66 1
67 1 while(y0<=y1)
68 1 { GUI_HLine(x0, y0, x1, color); // 当前画水平线
69 2 y0++; // 下一行
70 2 }
71 1 }
72
73
74 /****************************************************************************
75 * 名称:GUI_Square()
76 * 功能:画正方形。
77 * 入口参数: x0 正方形左上角的x坐标值
78 * y0 正方形左上角的y坐标值
79 * with 正方形的边长
80 * color 显示颜色
81 * 出口参数:无
82 * 说明:操作失败原因是指定地址超出有效范围。
83 ****************************************************************************/
84 void GUI_Square(uint32 x0, uint32 y0, uint32 with, TCOLOR color)
85 { if(with==0) return;
86 1 if( (x0+with) > GUI_LCM_XMAX ) return;
87 1 if( (y0+with) > GUI_LCM_YMAX ) return;
88 1 GUI_Rectangle(x0, y0, x0+with, y0+with, color);
89 1 }
90
91
92
93 /****************************************************************************
94 * 名称:GUI_Line()
95 * 功能:画任意两点之间的直线。
96 * 入口参数: x0 直线起点的x坐标值
97 * y0 直线起点的y坐标值
98 * x1 直线终点的x坐标值
99 * y1 直线终点的y坐标值
100 * color 显示颜色(对于黑白色LCM,为0时灭,为1时显示)
101 * 出口参数:无
102 * 说明:操作失败原因是指定地址超出有效范围。
103 ****************************************************************************/
104 void GUI_Line(uint32 x0, uint32 y0, uint32 x1, uint32 y1, TCOLOR color)
105 { int32 dx; // 直线x轴差值变量
106 1 int32 dy; // 直线y轴差值变量
107 1 int8 dx_sym; // x轴增长方向,为-1时减值方向,为1时增值方向
108 1 int8 dy_sym; // y轴增长方向,为-1时减值方向,为1时增值方向
109 1 int32 dx_x2; // dx*2值变量,用于加快运算速度
110 1 int32 dy_x2; // dy*2值变量,用于加快运算速度
111 1 int32 di; // 决策变量
112 1
113 1
114 1 dx = x1-x0; // 求取两点之间的差值
115 1 dy = y1-y0;
116 1
C51 COMPILER V7.50 GUI_BASIC 09/11/2007 21:56:45 PAGE 3
117 1 /* 判断增长方向,或是否为水平线、垂直线、点 */
118 1 if(dx>0) // 判断x轴方向
119 1 { dx_sym = 1; // dx>0,设置dx_sym=1
120 2 }
121 1 else
122 1 { if(dx<0)
123 2 { dx_sym = -1; // dx<0,设置dx_sym=-1
124 3 }
125 2 else
126 2 { // dx==0,画垂直线,或一点
127 3 GUI_RLine(x0, y0, y1, color);
128 3 return;
129 3 }
130 2 }
131 1
132 1 if(dy>0) // 判断y轴方向
133 1 { dy_sym = 1; // dy>0,设置dy_sym=1
134 2 }
135 1 else
136 1 { if(dy<0)
137 2 { dy_sym = -1; // dy<0,设置dy_sym=-1
138 3 }
139 2 else
140 2 { // dy==0,画水平线,或一点
141 3 GUI_HLine(x0, y0, x1, color);
142 3 return;
143 3 }
144 2 }
145 1
146 1 /* 将dx、dy取绝对值 */
147 1 dx = dx_sym * dx;
148 1 dy = dy_sym * dy;
149 1
150 1 /* 计算2倍的dx及dy值 */
151 1 dx_x2 = dx*2;
152 1 dy_x2 = dy*2;
153 1
154 1 /* 使用Bresenham法进行画直线 */
155 1 if(dx>=dy) // 对于dx>=dy,则使用x轴为基准
156 1 { di = dy_x2 - dx;
157 2 while(x0!=x1)
158 2 { GUI_Point(x0, y0, color);
159 3 x0 += dx_sym;
160 3 if(di<0)
161 3 { di += dy_x2; // 计算出下一步的决策值
162 4 }
163 3 else
164 3 { di += dy_x2 - dx_x2;
165 4 y0 += dy_sym;
166 4 }
167 3 }
168 2 GUI_Point(x0, y0, color); // 显示最后一点
169 2 }
170 1 else // 对于dx<dy,则使用y轴为基准
171 1 { di = dx_x2 - dy;
172 2 while(y0!=y1)
173 2 { GUI_Point(x0, y0, color);
174 3 y0 += dy_sym;
175 3 if(di<0)
176 3 { di += dx_x2;
177 4 }
178 3 else
C51 COMPILER V7.50 GUI_BASIC 09/11/2007 21:56:45 PAGE 4
179 3 { di += dx_x2 - dy_x2;
180 4 x0 += dx_sym;
181 4 }
182 3 }
183 2 GUI_Point(x0, y0, color); // 显示最后一点
184 2 }
185 1
186 1 }
187
188 #endif
189
190 #if GUI_LineSX_EN==1
/****************************************************************************
* 名称:GUI_LineS()
* 功能:多个点之间的连续连线。从第一点连到第二点,再连到第三点...
* 入口参数: points 多个点坐标数据的指针,数据排列为(x0,y0)、(x1,y1)、(x2,y2)...
* no 点数目,至少要大于1
* color 显示颜色
* 出口参数:无
* 说明:操作失败原因是指定地址超出有效范围。
****************************************************************************/
void GUI_LineS(uint32 const *points, uint8 no, TCOLOR color)
{ uint32 x0, y0;
uint32 x1, y1;
uint8 i;
/* 入口参数过滤 */
if(0==no) return;
if(1==no) // 单点
{ x0 = *points++;
y0 = *points;
GUI_Point(x0, y0, color);
}
/* 画多条线条 */
x0 = *points++; // 取出第一点坐标值,作为原起点坐标值
y0 = *points++;
for(i=1; i<no; i++)
{ x1 = *points++; // 取出下一点坐标值
y1 = *points++;
GUI_Line(x0, y0, x1, y1, color);
x0 = x1; // 更新原起点坐标
y0 = y1;
}
}
#endif
225
226
227 #if GUI_LineWith_EN==1
/****************************************************************************
* 名称:GUI_LineWith()
* 功能:画任意两点之间的直线,并且可设置线的宽度。
* 入口参数: x0 直线起点的x坐标值
* y0 直线起点的y坐标值
* x1 直线终点的x坐标值
* y1 直线终点的y坐标值
* with 线宽(0-50)
* color 显示颜色
* 出口参数:无
* 说明:操作失败原因是指定地址超出有效范围。
****************************************************************************/
void GUI_LineWith(uint32 x0, uint32 y0, uint32 x1, uint32 y1, uint8 with, TCOLOR color)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -