📄 gui.s
字号:
; /* 将dx、dy取绝对值 */
; dx = dx_sym * dx;
; dy = dy_sym * dy;
;
; /* 计算2倍的dx及dy值 */
; dx_x2 = dx*2;
; dy_x2 = dy*2;
;
; /* 使用Bresenham法进行画直线 */
; if(dx>=dy) // 对于dx>=dy,则使用x轴为基准
; {
; di = dy_x2 - dx;
; while(x0!=x1)
; { /* x轴向增长,则宽度在y方向,即画垂直线 */
; draw_a = y0-wx;
; if(draw_a<0) draw_a = 0;
; draw_b = y0+wy;
; GUI_RLine(x0, draw_a, draw_b, color);
;
; x0 += dx_sym;
; if(di<0)
; {
; di += dy_x2; // 计算出下一步的决策值
; }
; else
; {
; di += dy_x2 - dx_x2;
; y0 += dy_sym;
; }
; }
; draw_a = y0-wx;
; if(draw_a<0)
; draw_a = 0;
; draw_b = y0+wy;
; GUI_RLine(x0, draw_a, draw_b, color);
; }
; else // 对于dx<dy,则使用y轴为基准
; {
; di = dx_x2 - dy;
; while(y0!=y1)
; { /* y轴向增长,则宽度在x方向,即画水平线 */
; draw_a = x0-wx;
; if(draw_a<0)
; draw_a = 0;
; draw_b = x0+wy;
; GUI_HLine(draw_a, y0, draw_b, color);
;
; y0 += dy_sym;
; if(di<0)
; {
; di += dx_x2;
; }
; else
; {
; di += dx_x2 - dy_x2;
; x0 += dx_sym;
; }
; }
; draw_a = x0-wx;
; if(draw_a<0)
; draw_a = 0;
; 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)
; {
.dbline 444
; uint32 x0, y0;
; uint32 x1, y1;
; uint8 i;
;
; /* 入口参数过滤 */
; if(0==no)
tst R10
brne L56
.dbline 445
; return;
xjmp L55
L56:
.dbline 446
; if(1==no) // 单点
mov R24,R10
cpi R24,1
brne L58
.dbline 447
; {
.dbline 448
; x0 = *points++;
movw R2,R12
movw R24,R2
adiw R24,4
movw R12,R24
movw R16,R2
xcall lpm32
movw R30,R28
std z+21,R16
std z+22,R17
std z+23,R18
std z+24,R19
.dbline 449
; y0 = *points;
movw R16,R12
xcall lpm32
movw R30,R28
std z+25,R16
std z+26,R17
std z+27,R18
std z+28,R19
.dbline 450
; GUI_Point(x0, y0, color);
std y+0,R22
movw R30,R28
ldd R2,z+25
ldd R3,z+26
ldd R4,z+27
ldd R5,z+28
mov R18,R2
movw R30,R28
ldd R16,z+21
xcall _GUI_Point
.dbline 451
; }
L58:
.dbline 454
;
; /* 画多条线条 */
; x0 = *points++; // 取出第一点坐标值,作为原起点坐标值
movw R2,R12
movw R24,R2
adiw R24,4
movw R12,R24
movw R16,R2
xcall lpm32
movw R30,R28
std z+21,R16
std z+22,R17
std z+23,R18
std z+24,R19
.dbline 455
; y0 = *points++;
movw R2,R12
movw R24,R2
adiw R24,4
movw R12,R24
movw R16,R2
xcall lpm32
movw R30,R28
std z+25,R16
std z+26,R17
std z+27,R18
std z+28,R19
.dbline 456
; for(i=1; i<no; i++)
ldi R20,1
xjmp L63
L60:
.dbline 457
.dbline 458
movw R2,R12
movw R24,R2
adiw R24,4
movw R12,R24
movw R16,R2
xcall lpm32
movw R30,R28
std z+13,R16
std z+14,R17
std z+15,R18
std z+16,R19
.dbline 459
movw R2,R12
movw R24,R2
adiw R24,4
movw R12,R24
movw R16,R2
xcall lpm32
movw R30,R28
std z+17,R16
std z+18,R17
std z+19,R18
std z+20,R19
.dbline 460
std y+12,R22
movw R30,R28
ldd R2,z+17
ldd R3,z+18
ldd R4,z+19
ldd R5,z+20
std y+8,R2
std y+9,R3
std y+10,R4
std y+11,R5
movw R30,R28
ldd R2,z+13
ldd R3,z+14
ldd R4,z+15
ldd R5,z+16
std y+4,R2
std y+5,R3
std y+6,R4
std y+7,R5
movw R30,R28
ldd R2,z+25
ldd R3,z+26
ldd R4,z+27
ldd R5,z+28
std y+0,R2
std y+1,R3
std y+2,R4
std y+3,R5
movw R30,R28
ldd R16,z+21
ldd R17,z+22
ldd R18,z+23
ldd R19,z+24
xcall _GUI_Line
.dbline 461
movw R30,R28
ldd R2,z+13
ldd R3,z+14
ldd R4,z+15
ldd R5,z+16
movw R30,R28
std z+21,R2
std z+22,R3
std z+23,R4
std z+24,R5
.dbline 462
movw R30,R28
ldd R2,z+17
ldd R3,z+18
ldd R4,z+19
ldd R5,z+20
movw R30,R28
std z+25,R2
std z+26,R3
std z+27,R4
std z+28,R5
.dbline 463
L61:
.dbline 456
inc R20
L63:
.dbline 456
cp R20,R10
brsh X3
xjmp L60
X3:
.dbline -2
L55:
adiw R28,29
xcall pop_gset4
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym l y0 25 l
.dbsym l x0 21 l
.dbsym l y1 17 l
.dbsym l x1 13 l
.dbsym r color 22 c
.dbsym r no 10 c
.dbsym r points 12 pkl
.dbend
.dbfunc e GUI_Circle _GUI_Circle fV
; di -> y+73
; yy -> y+69
; draw_x7 -> y+65
; draw_x6 -> y+61
; draw_y3 -> y+57
; draw_y1 -> y+53
; draw_x5 -> y+49
; draw_x4 -> y+45
; draw_y2 -> y+41
; draw_y0 -> y+37
; draw_y7 -> y+33
; draw_y6 -> y+29
; draw_x3 -> y+25
; draw_x1 -> y+21
; draw_y5 -> y+17
; draw_y4 -> y+13
; draw_x2 -> y+9
; draw_x0 -> y+5
; xx -> y+1
; color -> R10
; r -> y+107
; y0 -> y+103
; x0 -> y+99
.even
_GUI_Circle::
xcall push_arg4
xcall push_gset3
sbiw R28,63
sbiw R28,30 ; offset = 93
movw R30,R28
subi R30,145 ; addi 111
sbci R31,255
ldd R10,z+0
.dbline -1
.dbline 478
; {
; 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)
; {
.dbline 492
; int32 draw_x0, draw_y0; // 刽图点坐标变量
; 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)
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
subi R30,149 ; addi 107
sbci R31,255
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brne L65
.dbline 493
; return;
xjmp L64
L65:
.dbline 496
;
; /* 计算出8个特殊点(0、45、90、135、180、225、270度),进行显示 */
; draw_x0 = draw_x1 = x0;
movw R30,R28
subi R30,157 ; addi 99
sbci R31,255
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
movw R30,R28
std z+21,R2
std z+22,R3
std z+23,R4
std z+24,R5
movw R30,R28
subi R30,157 ; addi 99
sbci R31,255
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
movw R30,R28
std z+5,R2
std z+6,R3
std z+7,R4
std z+8,R5
.dbline 497
; draw_y0 = draw_y1 = y0 + r;
movw R30,R28
subi R30,149 ; addi 107
sbci R31,255
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
movw R30,R28
subi R30,153 ; addi 103
sbci R31,255
ldd R6,z+0
ldd R7,z+1
ldd R8,z+2
ldd R9,z+3
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
movw R30,R28
subi R30,179 ; addi 77
sbci R31,255
std z+0,R6
std z+1,R7
std z+2,R8
std z+3,R9
movw R30,R28
subi R30,179 ; addi 77
sbci R31,255
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
movw R30,R28
std z+53,R2
std z+54,R3
std z+55,R4
std z+56,R5
movw R30,R28
subi R30,179 ; addi 77
sbci R31,255
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
movw R30,R28
std z+37,R2
std z+38,R3
std z+39,R4
std z+40,R5
.dbline 498
; if(draw_y0<GUI_LCM_YMAX)
ldi R20,64
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+37
ldd R3,z+38
ldd R4,z+39
ldd R5,z+40
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brge L67
.dbline 499
; GUI_Point(draw_x0, draw_y0, color); // 90度
std y+0,R10
movw R30,R28
ldd R18,z+37
movw R30,R28
ldd R16,z+5
xcall _GUI_Point
L67:
.dbline 501
;
; draw_x2 = draw_x3 = x0;
movw R30,R28
subi R30,157 ; addi 99
sbci R31,255
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
movw R30,R28
std z+25,R2
std z+26,R3
std z+27,R4
std z+28,R5
movw R30,R28
subi R30,157 ; addi 99
sbci R31,255
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
movw R30,R28
std z+9,R2
std z+10,R3
std z+11,R4
std z+12,R5
.dbline 502
; draw_y2 = draw_y3 = y0 - r;
movw R30,R28
subi R30,149 ; addi 107
sbci R31,255
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
movw R30,R28
subi R30,153 ; addi 103
sbci R31,255
ldd R6,z+0
ldd R7,z+1
ldd R8,z+2
ldd R9,z+3
sub R6,R2
sbc R7,R3
sbc R8,R4
sbc R9,R5
movw R30,R28
subi R30,175 ; addi 81
sbci R31,255
std z+0,R6
std z+1,R7
std z+2,R8
std z+3,R9
movw R30,R28
subi R30,175 ; addi 81
sbci R31,255
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
movw R30,R28
std z+57,R2
std z+58,R3
std z+59,R4
std z+60,R5
movw R30,R28
subi R30,175 ; addi 81
sbci R31,255
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
movw R30,R28
std z+41,R2
std z+42,R3
std z+43,R4
std z+44,R5
.dbline 503
; if(draw_y2>=0)
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+41
ldd R3,z+42
ldd R4,z+43
ldd R5,z+44
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brlt L69
.dbline 504
; GUI_Point(draw_x2, draw_y2, color); // 270度
std y+0,R10
movw R30,R28
ldd R18,z+41
movw R30,R28
ldd R16,z+9
xcall _GUI_Point
L69:
.dbline 506
;
; draw_x4 = draw_x6 = x0 + r;
movw R30,R28
subi R30,149 ; addi 107
sbci R31,255
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
movw R30,R28
subi R30,157 ; addi 99
sbci R31,255
ldd R6,z+0
ldd R7,z+1
ldd R8,z+2
ldd R9,z+3
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
movw R30,R28
subi R30,171 ; addi 85
sbci R31,255
std z+0,R6
std z+1,R7
std z+2,R8
std z+3,R9
movw R30,R28
subi R30,171 ; addi 85
sbci R31,255
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
movw R30,R28
adiw R30,61
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
movw R30,R28
subi R30,171 ; addi 85
sbci R31,255
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
movw R30,R28
std z+45,R2
std z+46,R3
std z+47,R4
std z+48,R5
.dbline 507
; draw_y4 = draw_y6 = y0;
movw R30,R28
subi R30,153 ; addi 103
sbci R31,255
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
movw R30,R28
std z+29,R2
std z+30,R3
std z+31,R4
std z+32,R5
movw R30,R28
subi R30,153 ; addi 103
sbci R31,255
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
movw R30,R28
std z+13,R2
std z+14,R3
std z+15,R4
std z+16,R5
.dbline 508
; if(draw_x4<GUI_LCM_XMAX)
ldi R20,128
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+45
ldd R3,z+46
ldd R4,z+47
ldd R5,z+48
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brge L71
.dbline 509
; GUI_Point(draw_x4, draw_y4, color); // 0度
std y+0,R10
movw R30,R28
ldd R18,z+13
movw R30,R28
ldd R16,z+45
xcall _GUI_Point
L71:
.dbline 511
;
; draw_x5 = draw_x7 = x0 - r;
movw R30,R28
subi R30,149 ; addi 107
sbci R31,255
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
movw R30,R28
subi R30,157 ; addi 99
sbci R31,255
ldd R6,z+0
ldd R7,z+1
ldd R8,z+2
ldd R9,z+3
sub R6,R2
sbc R7,R3
sbc R8,R4
sbc R9,R5
movw R30,R28
subi R30,167 ; addi 89
sbci R31,255
std z+0,R6
std z+1,R7
std z+2,R8
std z+3,R9
movw R30,R28
subi R30,167 ; addi 89
sbci R31,255
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
movw R30,R28
subi R30,191 ; addi 65
sbci R31,255
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
movw R30,R28
subi R30,167 ; addi 89
sbci R31,255
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
movw R30,R28
std z+49,R2
std z+50,R3
std z+51,R4
std z+52,R5
.dbline 512
; draw_y5 = draw_y7 = y0;
movw R30,R28
subi R30,153 ; addi 103
sbci R31,255
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
movw R30,R28
std z+33,R2
std z+34,R3
std z+35,R4
std z+36,R5
movw R30,R28
subi R30,153 ; addi 103
sbci R31,255
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
movw R30,R28
std z+17,R2
std z+18,R3
std z+19,R4
std z+20,R5
.dbline 513
; if(draw_x5>=0)
ldi R20,0
ldi R21,0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -