📄 gui_basic.s
字号:
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 320
; }
L92:
.dbline 321
L87:
.dbline 306
ldd R0,y+25
ldd R1,y+26
ldd R16,y+29
ldd R17,y+30
cp R0,R16
cpc R1,R17
breq X6
xjmp L86
X6:
.dbline 322
; }
; draw_a = x0-wx;
ldd R20,y+23
ldd R21,y+24
sub R20,R6
sbc R21,R7
.dbline 323
; if(draw_a<0) draw_a = 0;
cpi R20,0
ldi R30,0
cpc R21,R30
brge L93
.dbline 323
clr R20
clr R21
L93:
.dbline 324
ldd R2,y+3
ldd R3,y+4
ldd R10,y+23
ldd R11,y+24
add R10,R2
adc R11,R3
.dbline 325
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
xcall _GUI_HLine
.dbline 326
L76:
.dbline -2
L48:
adiw R28,13
xcall pop_gset5
adiw R28,4
.dbline 0 ; func end
ret
.dbsym l dy 11 I
.dbsym l dx 9 I
.dbsym l dy_x2 7 I
.dbsym l dx_x2 5 I
.dbsym r dy_sym 14 C
.dbsym r dx_sym 22 C
.dbsym l wy 3 I
.dbsym r di 12 I
.dbsym r draw_b 10 I
.dbsym r wx 6 I
.dbsym r draw_a 20 I
.dbsym l color 33 c
.dbsym r with 20 c
.dbsym l y1 29 i
.dbsym l x1 27 i
.dbsym l y0 25 i
.dbsym l x0 23 i
.dbend
.dbfunc e GUI_LineS _GUI_LineS fV
; i -> R20
; y0 -> R22,R23
; x0 -> R10,R11
; y1 -> R12,R13
; x1 -> R14,R15
; color -> y+17
; no -> y+15
; points -> R4,R5
.even
_GUI_LineS::
st -y,r19
st -y,r18
xcall push_gset5
movw R4,R16
sbiw R28,5
.dbline -1
.dbline 343
; draw_b = x0+wy;
; GUI_HLine(draw_a, y0, draw_b, color);
; }
;
; }
; #endif
;
;
;
; /****************************************************************************
; * 名称: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;
.dbline 348
; uint32 x1, y1;
; uint8 i;
;
; /* 入口参数过滤 */
; if(0==no) return;
ldd R0,y+15
tst R0
brne L96
.dbline 348
xjmp L95
L96:
.dbline 349
; if(1==no) // 单点
ldd R24,y+15
cpi R24,1
brne L98
.dbline 350
; { x0 = *points++;
.dbline 350
movw R2,R4
movw R24,R2
adiw R24,2
movw R30,R2
lpm R10,Z+
lpm R11,Z
.dbline 351
; y0 = *points;
movw R30,R24
lpm R22,Z+
lpm R23,Z
.dbline 352
; GUI_Point(x0, y0, color);
ldd R0,y+17
std y+0,R0
movw R18,R22
movw R16,R10
push R24
push R25
xcall _GUI_Point
pop R5
pop R4
.dbline 353
; }
L98:
.dbline 356
;
; /* 画多条线条 */
; x0 = *points++; // 取出第一点坐标值,作为原起点坐标值
movw R2,R4
movw R24,R2
adiw R24,2
movw R30,R2
lpm R10,Z+
lpm R11,Z
.dbline 357
; y0 = *points++;
movw R2,R24
adiw R24,2
movw R4,R24
movw R30,R2
lpm R22,Z+
lpm R23,Z
.dbline 358
; for(i=1; i<no; i++)
ldi R20,1
xjmp L103
L100:
.dbline 359
.dbline 359
movw R2,R4
movw R24,R2
adiw R24,2
movw R30,R2
lpm R14,Z+
lpm R15,Z
.dbline 360
movw R2,R24
adiw R24,2
movw R30,R2
lpm R12,Z+
lpm R13,Z
.dbline 361
ldd R0,y+17
std y+4,R0
std y+3,R13
std y+2,R12
std y+1,R15
std y+0,R14
movw R18,R22
movw R16,R10
push R24
push R25
xcall _GUI_Line
pop R5
pop R4
.dbline 362
movw R10,R14
.dbline 363
movw R22,R12
.dbline 364
L101:
.dbline 358
inc R20
L103:
.dbline 358
ldd R0,y+15
cp R20,R0
brlo L100
.dbline -2
L95:
adiw R28,5
xcall pop_gset5
adiw R28,2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r y0 22 i
.dbsym r x0 10 i
.dbsym r y1 12 i
.dbsym r x1 14 i
.dbsym l color 17 c
.dbsym l no 15 c
.dbsym r points 4 pki
.dbend
.dbfunc e GUI_Circle _GUI_Circle fV
; di -> y+25
; yy -> y+23
; draw_x7 -> y+21
; draw_x6 -> y+19
; draw_y3 -> y+17
; draw_y1 -> y+15
; draw_x5 -> y+13
; draw_x4 -> y+11
; draw_y2 -> y+9
; draw_y0 -> y+7
; draw_y7 -> y+5
; draw_y6 -> y+3
; draw_x3 -> y+1
; draw_x1 -> y+27
; draw_y5 -> R22,R23
; draw_y4 -> R10,R11
; draw_x2 -> R12,R13
; draw_x0 -> R14,R15
; xx -> R20,R21
; color -> y+41
; r -> y+39
; y0 -> R20,R21
; x0 -> R22,R23
.even
_GUI_Circle::
xcall push_gset5
movw R20,R18
movw R22,R16
sbiw R28,29
.dbline -1
.dbline 381
; { x1 = *points++; // 取出下一点坐标值
; y1 = *points++;
; GUI_Line(x0, y0, x1, y1, color);
; x0 = x1; // 更新原起点坐标
; y0 = y1;
; }
; }
;
;
;
; #if GUI_CircleX_EN==1
; /****************************************************************************
; * 名称:GUI_Circle()
; * 功能:指定圆心位置及半径,画圆。
; * 入口参数: x0 圆心的x坐标值
; * y0 圆心的y坐标值
; * r 圆的半径
; * color 显示颜色
; * 出口参数:无
; * 说明:操作失败原因是指定地址超出有效范围。
; ****************************************************************************/
; void GUI_Circle(uint32 x0, uint32 y0, uint32 r, TCOLOR color)
; { int32 draw_x0, draw_y0; // 刽图点坐标变量
.dbline 394
; int32 draw_x1, draw_y1;
; int32 draw_x2, draw_y2;
; int32 draw_x3, draw_y3;
; int32 draw_x4, draw_y4;
; int32 draw_x5, draw_y5;
; int32 draw_x6, draw_y6;
; int32 draw_x7, draw_y7;
; int32 xx, yy; // 画圆控制变量
;
; int32 di; // 决策变量
;
; /* 参数过滤 */
; if(0==r) return;
ldd R0,y+39
ldd R1,y+40
tst R0
brne L105
tst R1
brne L105
X7:
.dbline 394
xjmp L104
L105:
.dbline 397
;
; /* 计算出8个特殊点(0、45、90、135、180、225、270度),进行显示 */
; draw_x0 = draw_x1 = x0;
std y+28,R23
std y+27,R22
movw R14,R22
.dbline 398
; draw_y0 = draw_y1 = y0 + r;
movw R2,R20
ldd R0,y+39
ldd R1,y+40
add R2,R0
adc R3,R1
std y+16,R3
std y+15,R2
std y+8,R3
std y+7,R2
.dbline 399
; if(draw_y0<GUI_LCM_YMAX) GUI_Point(draw_x0, draw_y0, color); // 90度
movw R24,R2
cpi R24,128
ldi R30,0
cpc R25,R30
brge L107
.dbline 399
ldd R0,y+41
std y+0,R0
movw R18,R24
movw R16,R14
xcall _GUI_Point
L107:
.dbline 401
;
; draw_x2 = draw_x3 = x0;
std y+2,R23
std y+1,R22
movw R12,R22
.dbline 402
; draw_y2 = draw_y3 = y0 - r;
movw R2,R20
ldd R0,y+39
ldd R1,y+40
sub R2,R0
sbc R3,R1
std y+18,R3
std y+17,R2
std y+10,R3
std y+9,R2
.dbline 403
; if(draw_y2>=0) GUI_Point(draw_x2, draw_y2, color); // 270度
movw R24,R2
cpi R24,0
ldi R30,0
cpc R25,R30
brlt L109
.dbline 403
ldd R0,y+41
std y+0,R0
movw R18,R24
movw R16,R12
xcall _GUI_Point
L109:
.dbline 406
;
;
; draw_x4 = draw_x6 = x0 + r;
movw R2,R22
ldd R0,y+39
ldd R1,y+40
add R2,R0
adc R3,R1
std y+20,R3
std y+19,R2
std y+12,R3
std y+11,R2
.dbline 407
; draw_y4 = draw_y6 = y0;
std y+4,R21
std y+3,R20
movw R10,R20
.dbline 408
; if(draw_x4<GUI_LCM_XMAX) GUI_Point(draw_x4, draw_y4, color); // 0度
ldd R24,y+11
ldd R25,y+12
cpi R24,240
ldi R30,0
cpc R25,R30
brge L111
.dbline 408
ldd R0,y+41
std y+0,R0
movw R18,R10
movw R16,R24
xcall _GUI_Point
L111:
.dbline 410
;
; draw_x5 = draw_x7 = x0 - r;
movw R2,R22
ldd R0,y+39
ldd R1,y+40
sub R2,R0
sbc R3,R1
std y+22,R3
std y+21,R2
std y+14,R3
std y+13,R2
.dbline 411
; draw_y5 = draw_y7 = y0;
std y+6,R21
std y+5,R20
movw R22,R20
.dbline 412
; if(draw_x5>=0) GUI_Point(draw_x5, draw_y5, color); // 180度
ldd R24,y+13
ldd R25,y+14
cpi R24,0
ldi R30,0
cpc R25,R30
brlt L113
.dbline 412
ldd R0,y+41
std y+0,R0
movw R18,R22
movw R16,R24
xcall _GUI_Point
L113:
.dbline 413
; if(1==r) return; // 若半径为1,则已圆画完
ldd R24,y+39
ldd R25,y+40
cpi R24,1
ldi R30,0
cpc R25,R30
brne L115
.dbline 413
xjmp L104
L115:
.dbline 417
;
;
; /* 使用Bresenham法进行画圆 */
; di = 3 - 2*r; // 初始化决策变量
ldi R16,2
ldi R17,0
ldd R18,y+39
ldd R19,y+40
xcall empy16s
ldi R24,3
ldi R25,0
sub R24,R16
sbc R25,R17
std y+26,R25
std y+25,R24
.dbline 419
;
; xx = 0;
clr R20
clr R21
.dbline 420
; yy = r;
ldd R0,y+39
ldd R1,y+40
std y+24,R1
std y+23,R0
xjmp L118
L117:
.dbline 422
; while(xx<yy)
; { if(di<0)
.dbline 422
ldd R24,y+25
ldd R25,y+26
cpi R24,0
ldi R30,0
cpc R25,R30
brge L120
.dbline 423
; { di += 4*xx + 6;
.dbline 423
ldi R16,4
ldi R17,0
movw R18,R20
xcall empy16s
movw R24,R16
adiw R24,6
ldd R2,y+25
ldd R3,y+26
add R2,R24
adc R3,R25
std y+26,R3
std y+25,R2
.dbline 424
; }
xjmp L121
L120:
.dbline 426
; else
; { di += 4*(xx - yy) + 10;
.dbline 426
ldd R2,y+23
ldd R3,y+24
movw R18,R20
sub R18,R2
sbc R19,R3
ldi R16,4
ldi R17,0
xcall empy16s
movw R24,R16
adiw R24,10
ldd R2,y+25
ldd R3,y+26
add R2,R24
adc R3,R25
std y+26,R3
std y+25,R2
.dbline 428
;
; yy--;
ldd R24,y+23
ldd R25,y+24
sbiw R24,1
std y+24,R25
std y+23,R24
.dbline 429
; draw_y0--;
ldd R24,y+7
ldd R25,y+8
sbiw R24,1
std y+8,R25
std y+7,R24
.dbline 430
; draw_y1--;
ldd R24,y+15
ldd R25,y+16
sbiw R24,1
std y+16,R25
std y+15,R24
.dbline 431
; draw_y2++;
ldd R24,y+9
ldd R25,y+10
adiw R24,1
std y+10,R25
std y+9,R24
.dbline 432
; draw_y3++;
ldd R24,y+17
ldd R25,y+18
adiw R24,1
std y+18,R25
std y+17,R24
.dbline 433
; draw_x4--;
ldd R24,y+11
ldd R25,y+12
sbiw R24,1
std y+12,R25
std y+11,R24
.dbline 434
; draw_x5++;
ldd R24,y+13
ldd R25,y+14
adiw R24,1
std y+14,R25
std y+13,R24
.dbline 435
; draw_x6--;
ldd R24,y+19
ldd R25,y+20
sbiw R24,1
std y+20,R25
std y+19,R24
.dbline 436
; draw_x7++;
ldd R24,y+21
ldd R25,y+22
adiw R24,1
std y+22,R25
std y+21,R24
.dbline 437
; }
L121:
.dbline 439
;
; xx++;
subi R20,255 ; offset = 1
sbci R21,255
.dbline 440
; draw_x0++;
movw R24,R14
adiw R24,1
movw R14,R24
.dbline 441
; draw_x1--;
ldd R24,y+27
ldd R25,y+28
sbiw R24,1
std y+28,R25
std y+27,R24
.dbline 442
; draw_x2++;
movw R24,R12
adiw R24,1
movw R12,R24
.dbline 443
; draw_x3--;
ldd R24,y+1
ldd R25,y+2
sbiw R24,1
std y+2,R25
std y+1,R24
.dbline 444
; draw_y4++;
movw R24,R10
adiw R24,1
movw R10,R24
.dbline 445
; draw_y5++;
subi R22,255 ; offset = 1
sbci R23,255
.dbline 446
; draw_y6--;
ldd R24,y+3
ldd R25,y+4
sbiw R24,1
std y+4,R25
std y+3,R24
.dbline 447
; draw_y7--;
ldd R24,y+5
ldd R25,y+6
sbiw R24,1
std y+6,R25
std y+5,R24
.dbline 451
;
;
; /* 要判断当前点是否在有效范围内 */
; if( (draw_x0<=GUI_LCM_XMAX)&&(draw_y0>=0) )
ldi R24,240
ldi R25,0
cp R24,R14
cpc R25,R15
brlt L122
ldd R24,y+7
ldd R25,y+8
cpi R24,0
ldi R30,0
cpc R25,R30
brlt L122
.dbline 452
; { GUI_Point(draw_x0, draw_y0, color);
.dbline 452
ldd R0,y+41
std y+0,R0
movw R18,R24
movw R16,R14
xcall _GUI_Point
.dbline 453
; }
L122:
.dbline 454
; if( (draw_x1>=0)&&(draw_y1>=0) )
ldd R24,y+27
ldd R25,y+28
cpi R24,0
ldi R30,0
cpc R25,R30
brlt L124
ldd R24,y+15
ldd R25,y+16
cpi R24,0
ldi R30,0
cpc R25,R30
brlt L124
.dbline 455
; { GUI_Point(draw_x1, draw_y1, color);
.dbline 455
ldd R0,y+41
std y+0,R0
movw R18,R24
ldd R16,y+27
ldd R17,y+28
xcall _GUI_Point
.dbline 456
; }
L124:
.dbline 457
; if( (draw_x2<=GUI_LCM_XMAX)&&(draw_y2<=GUI_LCM_YMAX) )
ldi R24,240
ldi R25,0
cp R24,R12
cpc R25,R13
brlt L126
ldi R24,128
ldd R2,y+9
ldd R3,y+10
cp R24,R2
cpc R25,R3
brlt L126
.dbline 458
; { GUI_Point(draw_x2, draw_y2, color);
.dbline 458
ldd R0,y+41
std y+0,R0
movw R18,R2
movw R16,R12
xcall _GUI_Point
.dbline 459
; }
L126:
.dbline 460
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -