📄 gui_basic.s
字号:
.module GUI_BASIC.C
.area text(rom, con, rel)
.dbfile G:\IccPro\mega128_lcd\ZLG_GUI\GUI_BASIC.C
.dbfunc e GUI_Rectangle _GUI_Rectangle fV
; color -> R22
; y1 -> y+11
; x1 -> y+9
; y0 -> R20,R21
; x0 -> R10,R11
.even
_GUI_Rectangle::
xcall push_gset3
movw R20,R18
movw R10,R16
sbiw R28,3
ldd R22,y+13
.dbline -1
.dbline 24
; /****************************************************************************************
; * 文件名:GUI_BASIC.C
; * 功能:GUI基本绘图函数。进行基本绘图运算,并调用相应的刷新程序更新LCD显示。
; * 作者:黄绍斌
; * 日期:2004.02.26
; * 备注:图形操作层,进行各种图形运算操作。
; ****************************************************************************************/
; #include "config.h"
; #include <math.h>
;
;
; /****************************************************************************
; * 名称:GUI_Rectangle()
; * 功能:画矩形。
; * 入口参数: x0 矩形左上角的x坐标值
; * y0 矩形左上角的y坐标值
; * x1 矩形右下角的x坐标值
; * y1 矩形右下角的y坐标值
; * color 显示颜色
; * 出口参数:无
; * 说明:操作失败原因是指定地址超出有效范围。
; ****************************************************************************/
; void GUI_Rectangle(uint32 x0, uint32 y0, uint32 x1, uint32 y1, TCOLOR color)
; { GUI_HLine(x0, y0, x1, color);
.dbline 24
std y+2,R22
ldd R0,y+9
ldd R1,y+10
std y+1,R1
std y+0,R0
movw R18,R20
movw R16,R10
xcall _GUI_HLine
.dbline 25
; GUI_HLine(x0, y1, x1, color);
std y+2,R22
ldd R0,y+9
ldd R1,y+10
std y+1,R1
std y+0,R0
ldd R18,y+11
ldd R19,y+12
movw R16,R10
xcall _GUI_HLine
.dbline 26
; GUI_RLine(x0, y0, y1, color);
std y+2,R22
ldd R0,y+11
ldd R1,y+12
std y+1,R1
std y+0,R0
movw R18,R20
movw R16,R10
xcall _GUI_RLine
.dbline 27
; GUI_RLine(x1, y0, y1, color);
std y+2,R22
ldd R0,y+11
ldd R1,y+12
std y+1,R1
std y+0,R0
movw R18,R20
ldd R16,y+9
ldd R17,y+10
xcall _GUI_RLine
.dbline -2
L7:
adiw R28,3
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r color 22 c
.dbsym l y1 11 i
.dbsym l x1 9 i
.dbsym r y0 20 i
.dbsym r x0 10 i
.dbend
.dbfunc e GUI_RectangleFill _GUI_RectangleFill fV
; i -> R14,R15
; color -> R20
; y1 -> R22,R23
; x1 -> R10,R11
; y0 -> R12,R13
; x0 -> y+13
.even
_GUI_RectangleFill::
xcall push_arg4
xcall push_gset5
movw R12,R18
sbiw R28,3
ldd R10,y+17
ldd R11,y+18
ldd R22,y+19
ldd R23,y+20
ldd R20,y+21
.dbline -1
.dbline 43
; }
;
;
; /****************************************************************************
; * 名称:GUI_RectangleFill()
; * 功能:填充矩形。画一个填充的矩形,填充色与边框色一样。
; * 入口参数: x0 矩形左上角的x坐标值
; * y0 矩形左上角的y坐标值
; * x1 矩形右下角的x坐标值
; * y1 矩形右下角的y坐标值
; * color 填充颜色
; * 出口参数:无
; * 说明:操作失败原因是指定地址超出有效范围。
; ****************************************************************************/
; void GUI_RectangleFill(uint32 x0, uint32 y0, uint32 x1, uint32 y1, TCOLOR color)
; { uint32 i;
.dbline 46
;
; /* 先找出矩形左上角与右下角的两个点,保存在(x0,y0),(x1,y1) */
; if(x0>x1) // 若x0>x1,则x0与x1交换
ldd R0,y+13
ldd R1,y+14
cp R10,R0
cpc R11,R1
brsh L9
.dbline 47
; { i = x0;
.dbline 47
movw R14,R0
.dbline 48
; x0 = x1;
std y+14,R11
std y+13,R10
.dbline 49
; x1 = i;
movw R10,R14
.dbline 50
; }
L9:
.dbline 51
; if(y0>y1) // 若y0>y1,则y0与y1交换
cp R22,R12
cpc R23,R13
brsh L11
.dbline 52
; { i = y0;
.dbline 52
movw R14,R12
.dbline 53
; y0 = y1;
movw R12,R22
.dbline 54
; y1 = i;
movw R22,R14
.dbline 55
; }
L11:
.dbline 58
;
; /* 判断是否只是直线 */
; if(y0==y1)
cp R12,R22
cpc R13,R23
brne L13
.dbline 59
; { GUI_HLine(x0, y0, x1, color);
.dbline 59
std y+2,R20
std y+1,R11
std y+0,R10
movw R18,R12
ldd R16,y+13
ldd R17,y+14
xcall _GUI_HLine
.dbline 60
; return;
xjmp L8
L13:
.dbline 62
; }
; if(x0==x1)
ldd R0,y+13
ldd R1,y+14
cp R0,R10
cpc R1,R11
brne L18
.dbline 63
; { GUI_RLine(x0, y0, y1, color);
.dbline 63
std y+2,R20
std y+1,R23
std y+0,R22
movw R18,R12
movw R16,R0
xcall _GUI_RLine
.dbline 64
; return;
xjmp L8
L17:
.dbline 68
.dbline 68
std y+2,R20
std y+1,R11
std y+0,R10
movw R18,R12
ldd R16,y+13
ldd R17,y+14
xcall _GUI_HLine
.dbline 69
movw R24,R12
adiw R24,1
movw R12,R24
.dbline 70
L18:
.dbline 67
; }
;
; while(y0<=y1)
cp R22,R12
cpc R23,R13
brsh L17
.dbline -2
L8:
adiw R28,3
xcall pop_gset5
adiw R28,4
.dbline 0 ; func end
ret
.dbsym r i 14 i
.dbsym r color 20 c
.dbsym r y1 22 i
.dbsym r x1 10 i
.dbsym r y0 12 i
.dbsym l x0 13 i
.dbend
.dbfunc e GUI_Square _GUI_Square fV
; color -> y+13
; with -> R10,R11
; y0 -> R22,R23
; x0 -> R20,R21
.even
_GUI_Square::
xcall push_gset3
movw R22,R18
movw R20,R16
sbiw R28,5
ldd R10,y+11
ldd R11,y+12
.dbline -1
.dbline 85
; { GUI_HLine(x0, y0, x1, color); // 当前画水平线
; y0++; // 下一行
; }
; }
;
;
; /****************************************************************************
; * 名称:GUI_Square()
; * 功能:画正方形。
; * 入口参数: x0 正方形左上角的x坐标值
; * y0 正方形左上角的y坐标值
; * with 正方形的边长
; * color 显示颜色
; * 出口参数:无
; * 说明:操作失败原因是指定地址超出有效范围。
; ****************************************************************************/
; void GUI_Square(uint32 x0, uint32 y0, uint32 with, TCOLOR color)
; { if(with==0) return;
.dbline 85
tst R10
brne L21
tst R11
brne L21
X0:
.dbline 85
xjmp L20
L21:
.dbline 86
; if( (x0+with) > GUI_LCM_XMAX ) return;
movw R2,R20
add R2,R10
adc R3,R11
ldi R24,240
ldi R25,0
cp R24,R2
cpc R25,R3
brsh L23
.dbline 86
xjmp L20
L23:
.dbline 87
; if( (y0+with) > GUI_LCM_YMAX ) return;
movw R2,R22
add R2,R10
adc R3,R11
ldi R24,128
ldi R25,0
cp R24,R2
cpc R25,R3
brsh L25
.dbline 87
xjmp L20
L25:
.dbline 88
; GUI_Rectangle(x0, y0, x0+with, y0+with, color);
ldd R0,y+13
std y+4,R0
movw R2,R22
add R2,R10
adc R3,R11
std y+3,R3
std y+2,R2
movw R2,R20
add R2,R10
adc R3,R11
std y+1,R3
std y+0,R2
movw R18,R22
movw R16,R20
xcall _GUI_Rectangle
.dbline -2
L20:
adiw R28,5
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym l color 13 c
.dbsym r with 10 i
.dbsym r y0 22 i
.dbsym r x0 20 i
.dbend
.dbfunc e GUI_Line _GUI_Line fV
; dy -> y+5
; dx -> y+3
; dy_x2 -> R20,R21
; dx_x2 -> R22,R23
; dy_sym -> R10
; dx_sym -> R12
; di -> R14,R15
; color -> y+25
; y1 -> y+23
; x1 -> y+21
; y0 -> y+19
; x0 -> y+17
.even
_GUI_Line::
xcall push_arg4
xcall push_gset5
sbiw R28,7
.dbline -1
.dbline 105
; }
;
;
;
; /****************************************************************************
; * 名称:GUI_Line()
; * 功能:画任意两点之间的直线。
; * 入口参数: x0 直线起点的x坐标值
; * y0 直线起点的y坐标值
; * x1 直线终点的x坐标值
; * y1 直线终点的y坐标值
; * color 显示颜色(对于黑白色LCM,为0时灭,为1时显示)
; * 出口参数:无
; * 说明:操作失败原因是指定地址超出有效范围。
; ****************************************************************************/
; void GUI_Line(uint32 x0, uint32 y0, uint32 x1, uint32 y1, TCOLOR color)
; { int32 dx; // 直线x轴差值变量
.dbline 114
; 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; // 求取两点之间的差值
ldd R2,y+21
ldd R3,y+22
ldd R0,y+17
ldd R1,y+18
sub R2,R0
sbc R3,R1
std y+4,R3
std y+3,R2
.dbline 115
; dy = y1-y0;
ldd R2,y+23
ldd R3,y+24
ldd R0,y+19
ldd R1,y+20
sub R2,R0
sbc R3,R1
std y+6,R3
std y+5,R2
.dbline 118
;
; /* 判断增长方向,或是否为水平线、垂直线、点 */
; if(dx>0) // 判断x轴方向
clr R2
clr R3
ldd R4,y+3
ldd R5,y+4
cp R2,R4
cpc R3,R5
brge L28
.dbline 119
; { dx_sym = 1; // dx>0,设置dx_sym=1
.dbline 119
clr R12
inc R12
.dbline 120
; }
xjmp L29
L28:
.dbline 122
; else
; { if(dx<0)
.dbline 122
ldd R24,y+3
ldd R25,y+4
cpi R24,0
ldi R30,0
cpc R25,R30
brge L30
.dbline 123
; { dx_sym = -1; // dx<0,设置dx_sym=-1
.dbline 123
ldi R24,255
mov R12,R24
.dbline 124
; }
xjmp L31
L30:
.dbline 126
; else
; { // dx==0,画垂直线,或一点
.dbline 127
; GUI_RLine(x0, y0, y1, color);
ldd R0,y+25
std y+2,R0
ldd R0,y+23
ldd R1,y+24
std y+1,R1
std y+0,R0
ldd R18,y+19
ldd R19,y+20
ldd R16,y+17
ldd R17,y+18
xcall _GUI_RLine
.dbline 128
; return;
xjmp L27
L31:
.dbline 130
; }
; }
L29:
.dbline 132
;
; if(dy>0) // 判断y轴方向
clr R2
clr R3
ldd R4,y+5
ldd R5,y+6
cp R2,R4
cpc R3,R5
brge L32
.dbline 133
; { dy_sym = 1; // dy>0,设置dy_sym=1
.dbline 133
clr R10
inc R10
.dbline 134
; }
xjmp L33
L32:
.dbline 136
; else
; { if(dy<0)
.dbline 136
ldd R24,y+5
ldd R25,y+6
cpi R24,0
ldi R30,0
cpc R25,R30
brge L34
.dbline 137
; { dy_sym = -1; // dy<0,设置dy_sym=-1
.dbline 137
ldi R24,255
mov R10,R24
.dbline 138
; }
xjmp L35
L34:
.dbline 140
; else
; { // dy==0,画水平线,或一点
.dbline 141
; GUI_HLine(x0, y0, x1, color);
ldd R0,y+25
std y+2,R0
ldd R0,y+21
ldd R1,y+22
std y+1,R1
std y+0,R0
ldd R18,y+19
ldd R19,y+20
ldd R16,y+17
ldd R17,y+18
xcall _GUI_HLine
.dbline 142
; return;
xjmp L27
L35:
.dbline 144
; }
; }
L33:
.dbline 147
;
; /* 将dx、dy取绝对值 */
; dx = dx_sym * dx;
ldd R18,y+3
ldd R19,y+4
mov R16,R12
clr R17
sbrc R16,7
com R17
xcall empy16s
std y+4,R17
std y+3,R16
.dbline 148
; dy = dy_sym * dy;
ldd R18,y+5
ldd R19,y+6
mov R16,R10
clr R17
sbrc R16,7
com R17
xcall empy16s
std y+6,R17
std y+5,R16
.dbline 151
;
; /* 计算2倍的dx及dy值 */
; dx_x2 = dx*2;
ldd R18,y+3
ldd R19,y+4
ldi R16,2
ldi R17,0
xcall empy16s
movw R22,R16
.dbline 152
; dy_x2 = dy*2;
ldd R18,y+5
ldd R19,y+6
ldi R16,2
ldi R17,0
xcall empy16s
movw R20,R16
.dbline 155
;
; /* 使用Bresenham法进行画直线 */
; if(dx>=dy) // 对于dx>=dy,则使用x轴为基准
ldd R2,y+5
ldd R3,y+6
ldd R4,y+3
ldd R5,y+4
cp R4,R2
cpc R5,R3
brge X1
xjmp L36
X1:
.dbline 156
; { di = dy_x2 - dx;
.dbline 156
movw R14,R20
sub R14,R4
sbc R15,R5
xjmp L39
L38:
.dbline 158
; while(x0!=x1)
; { GUI_Point(x0, y0, color);
.dbline 158
ldd R0,y+25
std y+0,R0
ldd R18,y+19
ldd R19,y+20
ldd R16,y+17
ldd R17,y+18
xcall _GUI_Point
.dbline 159
; x0 += dx_sym;
mov R2,R12
clr R3
sbrc R2,7
com R3
ldd R0,y+17
ldd R1,y+18
add R0,R2
adc R1,R3
std y+18,R1
std y+17,R0
.dbline 160
; if(di<0)
movw R24,R14
cpi R24,0
ldi R30,0
cpc R25,R30
brge L41
.dbline 161
; { di += dy_x2; // 计算出下一步的决策值
.dbline 161
add R14,R20
adc R15,R21
.dbline 162
; }
xjmp L42
L41:
.dbline 164
; else
; { di += dy_x2 - dx_x2;
.dbline 164
movw R2,R20
sub R2,R22
sbc R3,R23
add R14,R2
adc R15,R3
.dbline 165
; y0 += dy_sym;
mov R2,R10
clr R3
sbrc R2,7
com R3
ldd R0,y+19
ldd R1,y+20
add R0,R2
adc R1,R3
std y+20,R1
std y+19,R0
.dbline 166
; }
L42:
.dbline 167
L39:
.dbline 157
ldd R0,y+17
ldd R1,y+18
ldd R16,y+21
ldd R17,y+22
cp R0,R16
cpc R1,R17
brne L38
.dbline 168
; }
; GUI_Point(x0, y0, color); // 显示最后一点
ldd R0,y+25
std y+0,R0
ldd R18,y+19
ldd R19,y+20
ldd R16,y+17
ldd R17,y+18
xcall _GUI_Point
.dbline 169
; }
xjmp L37
L36:
.dbline 171
; else // 对于dx<dy,则使用y轴为基准
; { di = dx_x2 - dy;
.dbline 171
ldd R2,y+5
ldd R3,y+6
movw R14,R22
sub R14,R2
sbc R15,R3
xjmp L44
L43:
.dbline 173
; while(y0!=y1)
; { GUI_Point(x0, y0, color);
.dbline 173
ldd R0,y+25
std y+0,R0
ldd R18,y+19
ldd R19,y+20
ldd R16,y+17
ldd R17,y+18
xcall _GUI_Point
.dbline 174
; y0 += dy_sym;
mov R2,R10
clr R3
sbrc R2,7
com R3
ldd R0,y+19
ldd R1,y+20
add R0,R2
adc R1,R3
std y+20,R1
std y+19,R0
.dbline 175
; if(di<0)
movw R24,R14
cpi R24,0
ldi R30,0
cpc R25,R30
brge L46
.dbline 176
; { di += dx_x2;
.dbline 176
add R14,R22
adc R15,R23
.dbline 177
; }
xjmp L47
L46:
.dbline 179
; else
; { di += dx_x2 - dy_x2;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -