📄 gui.s
字号:
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+19
ldd R3,z+20
ldd R4,z+21
ldd R5,z+22
cp R20,R2
cpc R21,R3
cpc R22,R4
cpc R23,R5
brge L39
.dbline 199
; {
.dbline 200
; dy_sym = 1; // dy>0,设置dy_sym=1
clr R10
inc R10
.dbline 201
; }
xjmp L40
L39:
.dbline 203
; else
; {
.dbline 204
; if(dy<0)
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+19
ldd R3,z+20
ldd R4,z+21
ldd R5,z+22
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brge L41
.dbline 205
; {
.dbline 206
; dy_sym = -1; // dy<0,设置dy_sym=-1
ldi R24,255
mov R10,R24
.dbline 207
; }
xjmp L42
L41:
.dbline 209
; else
; { // dy==0,画水平线,或一点
.dbline 210
; GUI_HLine(x0, y0, x1, color);
std y+2,R14
movw R30,R28
ldd R2,z+41
ldd R3,z+42
std y+1,R3
std y+0,R2
movw R30,R28
ldd R2,z+37
ldd R3,z+38
ldd R4,z+39
ldd R5,z+40
mov R18,R2
movw R30,R28
ldd R16,z+33
ldd R17,z+34
xcall _GUI_HLine
.dbline 211
; return;
xjmp L34
L42:
.dbline 213
; }
; }
L40:
.dbline 216
;
; /* 将dx、dy取绝对值 */
; dx = dx_sym * dx;
movw R30,R28
ldd R2,z+15
ldd R3,z+16
ldd R4,z+17
ldd R5,z+18
mov R6,R12
clr R7
sbrc R6,7
com R7
clr R8
sbrc R7,7
com R8
clr R9
sbrc R8,7
com R9
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R6
movw R18,R8
xcall empy32s
movw R30,R28
std z+15,R16
std z+16,R17
std z+17,R18
std z+18,R19
.dbline 217
; dy = dy_sym * dy;
movw R30,R28
ldd R2,z+19
ldd R3,z+20
ldd R4,z+21
ldd R5,z+22
mov R6,R10
clr R7
sbrc R6,7
com R7
clr R8
sbrc R7,7
com R8
clr R9
sbrc R8,7
com R9
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R6
movw R18,R8
xcall empy32s
movw R30,R28
std z+19,R16
std z+20,R17
std z+21,R18
std z+22,R19
.dbline 220
;
; /* 计算2倍的dx及dy值 */
; dx_x2 = dx*2;
movw R30,R28
ldd R2,z+15
ldd R3,z+16
ldd R4,z+17
ldd R5,z+18
ldi R20,2
ldi R21,0
ldi R22,0
ldi R23,0
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R20
movw R18,R22
xcall empy32s
movw R30,R28
std z+7,R16
std z+8,R17
std z+9,R18
std z+10,R19
.dbline 221
; dy_x2 = dy*2;
movw R30,R28
ldd R2,z+19
ldd R3,z+20
ldd R4,z+21
ldd R5,z+22
ldi R20,2
ldi R21,0
ldi R22,0
ldi R23,0
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R20
movw R18,R22
xcall empy32s
movw R30,R28
std z+11,R16
std z+12,R17
std z+13,R18
std z+14,R19
.dbline 224
;
; /* 使用Bresenham法进行画直线 */
; if(dx>=dy) // 对于dx>=dy,则使用x轴为基准
movw R30,R28
ldd R2,z+19
ldd R3,z+20
ldd R4,z+21
ldd R5,z+22
movw R30,R28
ldd R6,z+15
ldd R7,z+16
ldd R8,z+17
ldd R9,z+18
cp R6,R2
cpc R7,R3
cpc R8,R4
cpc R9,R5
brge X0
xjmp L43
X0:
.dbline 225
; {
.dbline 226
; di = dy_x2 - dx;
movw R30,R28
ldd R2,z+15
ldd R3,z+16
ldd R4,z+17
ldd R5,z+18
movw R30,R28
ldd R6,z+11
ldd R7,z+12
ldd R8,z+13
ldd R9,z+14
sub R6,R2
sbc R7,R3
sbc R8,R4
sbc R9,R5
movw R30,R28
std z+3,R6
std z+4,R7
std z+5,R8
std z+6,R9
xjmp L46
L45:
.dbline 228
; while(x0!=x1)
; {
.dbline 229
; GUI_Point(x0, y0, color);
std y+0,R14
movw R30,R28
ldd R2,z+37
ldd R3,z+38
ldd R4,z+39
ldd R5,z+40
mov R18,R2
movw R30,R28
ldd R16,z+33
xcall _GUI_Point
.dbline 230
; x0 += dx_sym;
mov R2,R12
clr R3
sbrc R2,7
com R3
clr R4
sbrc R3,7
com R4
clr R5
sbrc R4,7
com R5
movw R30,R28
ldd R6,z+33
ldd R7,z+34
ldd R8,z+35
ldd R9,z+36
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
movw R30,R28
std z+33,R6
std z+34,R7
std z+35,R8
std z+36,R9
.dbline 231
; if(di<0)
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+3
ldd R3,z+4
ldd R4,z+5
ldd R5,z+6
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brge L48
.dbline 232
; {
.dbline 233
; di += dy_x2; // 计算出下一步的决策值
movw R30,R28
ldd R2,z+11
ldd R3,z+12
ldd R4,z+13
ldd R5,z+14
movw R30,R28
ldd R6,z+3
ldd R7,z+4
ldd R8,z+5
ldd R9,z+6
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
movw R30,R28
std z+3,R6
std z+4,R7
std z+5,R8
std z+6,R9
.dbline 234
; }
xjmp L49
L48:
.dbline 236
; else
; {
.dbline 237
; di += dy_x2 - dx_x2;
movw R30,R28
ldd R2,z+7
ldd R3,z+8
ldd R4,z+9
ldd R5,z+10
movw R30,R28
ldd R6,z+11
ldd R7,z+12
ldd R8,z+13
ldd R9,z+14
sub R6,R2
sbc R7,R3
sbc R8,R4
sbc R9,R5
movw R30,R28
ldd R2,z+3
ldd R3,z+4
ldd R4,z+5
ldd R5,z+6
add R2,R6
adc R3,R7
adc R4,R8
adc R5,R9
movw R30,R28
std z+3,R2
std z+4,R3
std z+5,R4
std z+6,R5
.dbline 238
; y0 += dy_sym;
mov R2,R10
clr R3
sbrc R2,7
com R3
clr R4
sbrc R3,7
com R4
clr R5
sbrc R4,7
com R5
movw R30,R28
ldd R6,z+37
ldd R7,z+38
ldd R8,z+39
ldd R9,z+40
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
movw R30,R28
std z+37,R6
std z+38,R7
std z+39,R8
std z+40,R9
.dbline 239
; }
L49:
.dbline 240
L46:
.dbline 227
movw R30,R28
ldd R2,z+41
ldd R3,z+42
ldd R4,z+43
ldd R5,z+44
movw R30,R28
ldd R6,z+33
ldd R7,z+34
ldd R8,z+35
ldd R9,z+36
cp R6,R2
cpc R7,R3
cpc R8,R4
cpc R9,R5
breq X1
xjmp L45
X1:
.dbline 241
; }
; GUI_Point(x0, y0, color); // 显示最后一点
std y+0,R14
movw R30,R28
ldd R2,z+37
ldd R3,z+38
ldd R4,z+39
ldd R5,z+40
mov R18,R2
movw R30,R28
ldd R16,z+33
xcall _GUI_Point
.dbline 242
; }
xjmp L44
L43:
.dbline 244
; else // 对于dx<dy,则使用y轴为基准
; {
.dbline 245
; di = dx_x2 - dy;
movw R30,R28
ldd R2,z+19
ldd R3,z+20
ldd R4,z+21
ldd R5,z+22
movw R30,R28
ldd R6,z+7
ldd R7,z+8
ldd R8,z+9
ldd R9,z+10
sub R6,R2
sbc R7,R3
sbc R8,R4
sbc R9,R5
movw R30,R28
std z+3,R6
std z+4,R7
std z+5,R8
std z+6,R9
xjmp L51
L50:
.dbline 247
; while(y0!=y1)
; {
.dbline 248
; GUI_Point(x0, y0, color);
std y+0,R14
movw R30,R28
ldd R2,z+37
ldd R3,z+38
ldd R4,z+39
ldd R5,z+40
mov R18,R2
movw R30,R28
ldd R16,z+33
xcall _GUI_Point
.dbline 249
; y0 += dy_sym;
mov R2,R10
clr R3
sbrc R2,7
com R3
clr R4
sbrc R3,7
com R4
clr R5
sbrc R4,7
com R5
movw R30,R28
ldd R6,z+37
ldd R7,z+38
ldd R8,z+39
ldd R9,z+40
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
movw R30,R28
std z+37,R6
std z+38,R7
std z+39,R8
std z+40,R9
.dbline 250
; if(di<0)
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+3
ldd R3,z+4
ldd R4,z+5
ldd R5,z+6
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brge L53
.dbline 251
; {
.dbline 252
; di += dx_x2;
movw R30,R28
ldd R2,z+7
ldd R3,z+8
ldd R4,z+9
ldd R5,z+10
movw R30,R28
ldd R6,z+3
ldd R7,z+4
ldd R8,z+5
ldd R9,z+6
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
movw R30,R28
std z+3,R6
std z+4,R7
std z+5,R8
std z+6,R9
.dbline 253
; }
xjmp L54
L53:
.dbline 255
; else
; {
.dbline 256
; di += dx_x2 - dy_x2;
movw R30,R28
ldd R2,z+11
ldd R3,z+12
ldd R4,z+13
ldd R5,z+14
movw R30,R28
ldd R6,z+7
ldd R7,z+8
ldd R8,z+9
ldd R9,z+10
sub R6,R2
sbc R7,R3
sbc R8,R4
sbc R9,R5
movw R30,R28
ldd R2,z+3
ldd R3,z+4
ldd R4,z+5
ldd R5,z+6
add R2,R6
adc R3,R7
adc R4,R8
adc R5,R9
movw R30,R28
std z+3,R2
std z+4,R3
std z+5,R4
std z+6,R5
.dbline 257
; x0 += dx_sym;
mov R2,R12
clr R3
sbrc R2,7
com R3
clr R4
sbrc R3,7
com R4
clr R5
sbrc R4,7
com R5
movw R30,R28
ldd R6,z+33
ldd R7,z+34
ldd R8,z+35
ldd R9,z+36
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
movw R30,R28
std z+33,R6
std z+34,R7
std z+35,R8
std z+36,R9
.dbline 258
; }
L54:
.dbline 259
L51:
.dbline 246
movw R30,R28
ldd R2,z+45
ldd R3,z+46
ldd R4,z+47
ldd R5,z+48
movw R30,R28
ldd R6,z+37
ldd R7,z+38
ldd R8,z+39
ldd R9,z+40
cp R6,R2
cpc R7,R3
cpc R8,R4
cpc R9,R5
breq X2
xjmp L50
X2:
.dbline 260
std y+0,R14
movw R30,R28
ldd R2,z+37
ldd R3,z+38
ldd R4,z+39
ldd R5,z+40
mov R18,R2
movw R30,R28
ldd R16,z+33
xcall _GUI_Point
.dbline 261
L44:
.dbline -2
L34:
adiw R28,23
xcall pop_gset5
adiw R28,4
.dbline 0 ; func end
ret
.dbsym l dy 19 L
.dbsym l dx 15 L
.dbsym l dy_x2 11 L
.dbsym l dx_x2 7 L
.dbsym r dy_sym 10 C
.dbsym r dx_sym 12 C
.dbsym l di 3 L
.dbsym r color 14 c
.dbsym l y1 45 l
.dbsym l x1 41 l
.dbsym l y0 37 l
.dbsym l x0 33 l
.dbend
.dbfunc e GUI_LineS _GUI_LineS fV
; i -> R20
; y0 -> y+25
; x0 -> y+21
; y1 -> y+17
; x1 -> y+13
; color -> R22
; no -> R10
; points -> R12,R13
.even
_GUI_LineS::
xcall push_gset4
mov R10,R18
movw R12,R16
sbiw R28,29
ldd R22,y+37
.dbline -1
.dbline 438
; }
; GUI_Point(x0, y0, color); // 显示最后一点
; }
; }
;
;
; #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)
; {
; 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; // 决策变量
;
; int32 wx, wy; // 线宽变量
; int32 draw_a, draw_b;
;
; /* 参数过滤 */
; if(with==0)
; return;
; if(with>50)
; with = 50;
;
; dx = x1-x0; // 求取两点之间的差值
; dy = y1-y0;
;
; wx = with/2;
; wy = with-wx-1;
;
; /* 判断增长方向,或是否为水平线、垂直线、点 */
; 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,画垂直线,或一点 */
; wx = x0-wx;
; if(wx<0)
; wx = 0;
; wy = x0+wy;
;
; while(1)
; {
; x0 = wx;
; GUI_RLine(x0, y0, y1, color);
; if(wx>=wy)
; break;
; wx++;
; }
; return;
; }
; }
;
; 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,画水平线,或一点 */
; wx = y0-wx;
; if(wx<0) wx = 0;
; wy = y0+wy;
;
; while(1)
; {
; y0 = wx;
; GUI_HLine(x0, y0, x1, color);
; if(wx>=wy)
; break;
; wx++;
; }
; return;
; }
; }
;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -