📄 gui_basic.s
字号:
.dbline 179
movw R2,R22
sub R2,R20
sbc R3,R21
add R14,R2
adc R15,R3
.dbline 180
; 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 181
; }
L47:
.dbline 182
L44:
.dbline 172
ldd R0,y+19
ldd R1,y+20
ldd R16,y+23
ldd R17,y+24
cp R0,R16
cpc R1,R17
brne L43
.dbline 183
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 184
L37:
.dbline -2
L27:
adiw R28,7
xcall pop_gset5
adiw R28,4
.dbline 0 ; func end
ret
.dbsym l dy 5 I
.dbsym l dx 3 I
.dbsym r dy_x2 20 I
.dbsym r dx_x2 22 I
.dbsym r dy_sym 10 C
.dbsym r dx_sym 12 C
.dbsym r di 14 I
.dbsym l color 25 c
.dbsym l y1 23 i
.dbsym l x1 21 i
.dbsym l y0 19 i
.dbsym l x0 17 i
.dbend
.dbfunc e GUI_LineWith _GUI_LineWith fV
; dy -> y+11
; dx -> y+9
; dy_x2 -> y+7
; dx_x2 -> y+5
; dy_sym -> R14
; dx_sym -> R22
; wy -> y+3
; di -> R12,R13
; draw_b -> R10,R11
; wx -> R6,R7
; draw_a -> R20,R21
; color -> y+33
; with -> R20
; y1 -> y+29
; x1 -> y+27
; y0 -> y+25
; x0 -> y+23
.even
_GUI_LineWith::
xcall push_arg4
xcall push_gset5
sbiw R28,13
ldd R20,y+31
.dbline -1
.dbline 203
; }
; 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轴差值变量
.dbline 215
; 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;
tst R20
brne L49
.dbline 215
xjmp L48
L49:
.dbline 216
; if(with>50) with = 50;
ldi R24,50
cp R24,R20
brsh L51
.dbline 216
ldi R20,50
L51:
.dbline 218
;
; dx = x1-x0; // 求取两点之间的差值
ldd R2,y+27
ldd R3,y+28
ldd R0,y+23
ldd R1,y+24
sub R2,R0
sbc R3,R1
std y+10,R3
std y+9,R2
.dbline 219
; dy = y1-y0;
ldd R2,y+29
ldd R3,y+30
ldd R0,y+25
ldd R1,y+26
sub R2,R0
sbc R3,R1
std y+12,R3
std y+11,R2
.dbline 221
;
; wx = with/2;
ldi R18,2
ldi R19,0
mov R16,R20
clr R17
xcall div16s
movw R6,R16
.dbline 222
; wy = with-wx-1;
mov R24,R20
clr R25
sub R24,R16
sbc R25,R17
sbiw R24,1
std y+4,R25
std y+3,R24
.dbline 225
;
; /* 判断增长方向,或是否为水平线、垂直线、点 */
; if(dx>0) // 判断x轴方向
clr R2
clr R3
ldd R4,y+9
ldd R5,y+10
cp R2,R4
cpc R3,R5
brge L53
.dbline 226
; { dx_sym = 1; // dx>0,设置dx_sym=1
.dbline 226
ldi R22,1
.dbline 227
; }
xjmp L54
L53:
.dbline 229
; else
; { if(dx<0)
.dbline 229
ldd R24,y+9
ldd R25,y+10
cpi R24,0
ldi R30,0
cpc R25,R30
brge L55
.dbline 230
; { dx_sym = -1; // dx<0,设置dx_sym=-1
.dbline 230
ldi R22,255
.dbline 231
; }
xjmp L56
L55:
.dbline 233
; else
; { /* dx==0,画垂直线,或一点 */
.dbline 234
; wx = x0-wx;
ldd R2,y+23
ldd R3,y+24
sub R2,R6
sbc R3,R7
movw R6,R2
.dbline 235
; if(wx<0) wx = 0;
movw R24,R2
cpi R24,0
ldi R30,0
cpc R25,R30
brge L57
.dbline 235
clr R6
clr R7
L57:
.dbline 236
; wy = x0+wy;
ldd R2,y+3
ldd R3,y+4
ldd R4,y+23
ldd R5,y+24
add R4,R2
adc R5,R3
std y+4,R5
std y+3,R4
xjmp L60
L59:
.dbline 239
;
; while(1)
; { x0 = wx;
.dbline 239
std y+24,R7
std y+23,R6
.dbline 240
; GUI_RLine(x0, y0, y1, color);
ldd R0,y+33
std y+2,R0
ldd R0,y+29
ldd R1,y+30
std y+1,R1
std y+0,R0
ldd R18,y+25
ldd R19,y+26
movw R16,R6
push R16
push R17
xcall _GUI_RLine
pop R7
pop R6
.dbline 241
; if(wx>=wy) break;
ldd R2,y+3
ldd R3,y+4
cp R6,R2
cpc R7,R3
brlt L62
.dbline 241
xjmp L48
L62:
.dbline 242
movw R24,R6
adiw R24,1
movw R6,R24
.dbline 243
L60:
.dbline 238
xjmp L59
X2:
.dbline 245
; wx++;
; }
;
; return;
xjmp L48
L56:
.dbline 247
; }
; }
L54:
.dbline 249
;
; if(dy>0) // 判断y轴方向
clr R2
clr R3
ldd R4,y+11
ldd R5,y+12
cp R2,R4
cpc R3,R5
brge L64
.dbline 250
; { dy_sym = 1; // dy>0,设置dy_sym=1
.dbline 250
clr R14
inc R14
.dbline 251
; }
xjmp L65
L64:
.dbline 253
; else
; { if(dy<0)
.dbline 253
ldd R24,y+11
ldd R25,y+12
cpi R24,0
ldi R30,0
cpc R25,R30
brge L66
.dbline 254
; { dy_sym = -1; // dy<0,设置dy_sym=-1
.dbline 254
ldi R24,255
mov R14,R24
.dbline 255
; }
xjmp L67
L66:
.dbline 257
; else
; { /* dy==0,画水平线,或一点 */
.dbline 258
; wx = y0-wx;
ldd R2,y+25
ldd R3,y+26
sub R2,R6
sbc R3,R7
movw R6,R2
.dbline 259
; if(wx<0) wx = 0;
movw R24,R2
cpi R24,0
ldi R30,0
cpc R25,R30
brge L68
.dbline 259
clr R6
clr R7
L68:
.dbline 260
; wy = y0+wy;
ldd R2,y+3
ldd R3,y+4
ldd R4,y+25
ldd R5,y+26
add R4,R2
adc R5,R3
std y+4,R5
std y+3,R4
xjmp L71
L70:
.dbline 263
;
; while(1)
; { y0 = wx;
.dbline 263
std y+26,R7
std y+25,R6
.dbline 264
; GUI_HLine(x0, y0, x1, color);
ldd R0,y+33
std y+2,R0
ldd R0,y+27
ldd R1,y+28
std y+1,R1
std y+0,R0
movw R18,R6
ldd R16,y+23
ldd R17,y+24
push R18
push R19
xcall _GUI_HLine
pop R7
pop R6
.dbline 265
; if(wx>=wy) break;
ldd R2,y+3
ldd R3,y+4
cp R6,R2
cpc R7,R3
brlt L73
.dbline 265
xjmp L48
L73:
.dbline 266
movw R24,R6
adiw R24,1
movw R6,R24
.dbline 267
L71:
.dbline 262
xjmp L70
X3:
.dbline 268
; wx++;
; }
; return;
xjmp L48
L67:
.dbline 270
; }
; }
L65:
.dbline 273
;
; /* 将dx、dy取绝对值 */
; dx = dx_sym * dx;
ldd R18,y+9
ldd R19,y+10
mov R16,R22
clr R17
sbrc R16,7
com R17
xcall empy16s
std y+10,R17
std y+9,R16
.dbline 274
; dy = dy_sym * dy;
ldd R18,y+11
ldd R19,y+12
mov R16,R14
clr R17
sbrc R16,7
com R17
xcall empy16s
std y+12,R17
std y+11,R16
.dbline 277
;
; /* 计算2倍的dx及dy值 */
; dx_x2 = dx*2;
ldd R18,y+9
ldd R19,y+10
ldi R16,2
ldi R17,0
xcall empy16s
std y+6,R17
std y+5,R16
.dbline 278
; dy_x2 = dy*2;
ldd R18,y+11
ldd R19,y+12
ldi R16,2
ldi R17,0
xcall empy16s
std y+8,R17
std y+7,R16
.dbline 281
;
; /* 使用Bresenham法进行画直线 */
; if(dx>=dy) // 对于dx>=dy,则使用x轴为基准
ldd R2,y+11
ldd R3,y+12
ldd R4,y+9
ldd R5,y+10
cp R4,R2
cpc R5,R3
brge X4
xjmp L75
X4:
.dbline 282
; { di = dy_x2 - dx;
.dbline 282
movw R12,R16
sub R12,R4
sbc R13,R5
xjmp L78
L77:
.dbline 284
; while(x0!=x1)
; { /* x轴向增长,则宽度在y方向,即画垂直线 */
.dbline 285
; draw_a = y0-wx;
ldd R20,y+25
ldd R21,y+26
sub R20,R6
sbc R21,R7
.dbline 286
; if(draw_a<0) draw_a = 0;
cpi R20,0
ldi R30,0
cpc R21,R30
brge L80
.dbline 286
clr R20
clr R21
L80:
.dbline 287
; draw_b = y0+wy;
ldd R2,y+3
ldd R3,y+4
ldd R10,y+25
ldd R11,y+26
add R10,R2
adc R11,R3
.dbline 288
; GUI_RLine(x0, draw_a, draw_b, color);
ldd R0,y+33
std y+2,R0
std y+1,R11
std y+0,R10
movw R18,R20
ldd R16,y+23
ldd R17,y+24
push R6
push R7
xcall _GUI_RLine
pop R7
pop R6
.dbline 290
;
; x0 += dx_sym;
mov R2,R22
clr R3
sbrc R2,7
com R3
ldd R0,y+23
ldd R1,y+24
add R0,R2
adc R1,R3
std y+24,R1
std y+23,R0
.dbline 291
; if(di<0)
movw R24,R12
cpi R24,0
ldi R30,0
cpc R25,R30
brge L82
.dbline 292
; { di += dy_x2; // 计算出下一步的决策值
.dbline 292
ldd R2,y+7
ldd R3,y+8
add R12,R2
adc R13,R3
.dbline 293
; }
xjmp L83
L82:
.dbline 295
; else
; { di += dy_x2 - dx_x2;
.dbline 295
ldd R2,y+5
ldd R3,y+6
ldd R4,y+7
ldd R5,y+8
sub R4,R2
sbc R5,R3
add R12,R4
adc R13,R5
.dbline 296
; y0 += dy_sym;
mov R2,R14
clr R3
sbrc R2,7
com R3
ldd R0,y+25
ldd R1,y+26
add R0,R2
adc R1,R3
std y+26,R1
std y+25,R0
.dbline 297
; }
L83:
.dbline 298
L78:
.dbline 283
ldd R0,y+23
ldd R1,y+24
ldd R16,y+27
ldd R17,y+28
cp R0,R16
cpc R1,R17
breq X5
xjmp L77
X5:
.dbline 299
; }
; draw_a = y0-wx;
ldd R20,y+25
ldd R21,y+26
sub R20,R6
sbc R21,R7
.dbline 300
; if(draw_a<0) draw_a = 0;
cpi R20,0
ldi R30,0
cpc R21,R30
brge L84
.dbline 300
clr R20
clr R21
L84:
.dbline 301
; draw_b = y0+wy;
ldd R2,y+3
ldd R3,y+4
ldd R10,y+25
ldd R11,y+26
add R10,R2
adc R11,R3
.dbline 302
; GUI_RLine(x0, draw_a, draw_b, color);
ldd R0,y+33
std y+2,R0
std y+1,R11
std y+0,R10
movw R18,R20
ldd R16,y+23
ldd R17,y+24
push R6
push R7
xcall _GUI_RLine
pop R7
pop R6
.dbline 303
; }
xjmp L76
L75:
.dbline 305
; else // 对于dx<dy,则使用y轴为基准
; { di = dx_x2 - dy;
.dbline 305
ldd R2,y+11
ldd R3,y+12
ldd R12,y+5
ldd R13,y+6
sub R12,R2
sbc R13,R3
xjmp L87
L86:
.dbline 307
; while(y0!=y1)
; { /* y轴向增长,则宽度在x方向,即画水平线 */
.dbline 308
; draw_a = x0-wx;
ldd R20,y+23
ldd R21,y+24
sub R20,R6
sbc R21,R7
.dbline 309
; if(draw_a<0) draw_a = 0;
cpi R20,0
ldi R30,0
cpc R21,R30
brge L89
.dbline 309
clr R20
clr R21
L89:
.dbline 310
; draw_b = x0+wy;
ldd R2,y+3
ldd R3,y+4
ldd R10,y+23
ldd R11,y+24
add R10,R2
adc R11,R3
.dbline 311
; GUI_HLine(draw_a, y0, draw_b, color);
ldd R0,y+33
std y+2,R0
std y+1,R11
std y+0,R10
ldd R18,y+25
ldd R19,y+26
movw R16,R20
push R6
push R7
xcall _GUI_HLine
pop R7
pop R6
.dbline 313
;
; y0 += dy_sym;
mov R2,R14
clr R3
sbrc R2,7
com R3
ldd R0,y+25
ldd R1,y+26
add R0,R2
adc R1,R3
std y+26,R1
std y+25,R0
.dbline 314
; if(di<0)
movw R24,R12
cpi R24,0
ldi R30,0
cpc R25,R30
brge L91
.dbline 315
; { di += dx_x2;
.dbline 315
ldd R2,y+5
ldd R3,y+6
add R12,R2
adc R13,R3
.dbline 316
; }
xjmp L92
L91:
.dbline 318
; else
; { di += dx_x2 - dy_x2;
.dbline 318
ldd R2,y+7
ldd R3,y+8
ldd R4,y+5
ldd R5,y+6
sub R4,R2
sbc R5,R3
add R12,R4
adc R13,R5
.dbline 319
; x0 += dx_sym;
mov R2,R22
clr R3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -