📄 gui_basic.lis
字号:
02A4 0B8A std y+19,R0
02A6 .dbline 166
02A6 ; }
02A6 L42:
02A6 .dbline 167
02A6 L39:
02A6 .dbline 157
02A6 0988 ldd R0,y+17
02A8 1A88 ldd R1,y+18
02AA 0D89 ldd R16,y+21
02AC 1E89 ldd R17,y+22
02AE 0016 cp R0,R16
02B0 1106 cpc R1,R17
02B2 81F6 brne L38
02B4 .dbline 168
02B4 ; }
02B4 ; GUI_Point(x0, y0, color); // 显示最后一点
02B4 098C ldd R0,y+25
02B6 0882 std y+0,R0
02B8 2B89 ldd R18,y+19
02BA 3C89 ldd R19,y+20
02BC 0989 ldd R16,y+17
02BE 1A89 ldd R17,y+18
02C0 0E940000 xcall _GUI_Point
02C4 .dbline 169
02C4 ; }
02C4 3EC0 xjmp L37
02C6 L36:
02C6 .dbline 171
02C6 ; else // 对于dx<dy,则使用y轴为基准
02C6 ; { di = dx_x2 - dy;
02C6 .dbline 171
02C6 2D80 ldd R2,y+5
02C8 3E80 ldd R3,y+6
02CA 7B01 movw R14,R22
02CC E218 sub R14,R2
02CE F308 sbc R15,R3
02D0 29C0 xjmp L44
02D2 L43:
02D2 .dbline 173
02D2 ; while(y0!=y1)
02D2 ; { GUI_Point(x0, y0, color);
02D2 .dbline 173
02D2 098C ldd R0,y+25
02D4 0882 std y+0,R0
02D6 2B89 ldd R18,y+19
02D8 3C89 ldd R19,y+20
02DA 0989 ldd R16,y+17
02DC 1A89 ldd R17,y+18
02DE 0E940000 xcall _GUI_Point
02E2 .dbline 174
02E2 ; y0 += dy_sym;
02E2 2A2C mov R2,R10
02E4 3324 clr R3
02E6 27FC sbrc R2,7
02E8 3094 com R3
02EA 0B88 ldd R0,y+19
02EC 1C88 ldd R1,y+20
02EE 020C add R0,R2
02F0 131C adc R1,R3
02F2 1C8A std y+20,R1
02F4 0B8A std y+19,R0
02F6 .dbline 175
02F6 ; if(di<0)
02F6 C701 movw R24,R14
02F8 8030 cpi R24,0
02FA E0E0 ldi R30,0
02FC 9E07 cpc R25,R30
02FE 1CF4 brge L46
0300 .dbline 176
0300 ; { di += dx_x2;
0300 .dbline 176
0300 E60E add R14,R22
0302 F71E adc R15,R23
0304 .dbline 177
0304 ; }
0304 0FC0 xjmp L47
0306 L46:
0306 .dbline 179
0306 ; else
0306 ; { di += dx_x2 - dy_x2;
0306 .dbline 179
0306 1B01 movw R2,R22
0308 241A sub R2,R20
030A 350A sbc R3,R21
030C E20C add R14,R2
030E F31C adc R15,R3
0310 .dbline 180
0310 ; x0 += dx_sym;
0310 2C2C mov R2,R12
0312 3324 clr R3
0314 27FC sbrc R2,7
0316 3094 com R3
0318 0988 ldd R0,y+17
031A 1A88 ldd R1,y+18
031C 020C add R0,R2
031E 131C adc R1,R3
0320 1A8A std y+18,R1
0322 098A std y+17,R0
0324 .dbline 181
0324 ; }
0324 L47:
0324 .dbline 182
0324 L44:
0324 .dbline 172
0324 0B88 ldd R0,y+19
0326 1C88 ldd R1,y+20
0328 0F89 ldd R16,y+23
032A 188D ldd R17,y+24
032C 0016 cp R0,R16
032E 1106 cpc R1,R17
0330 81F6 brne L43
0332 .dbline 183
0332 098C ldd R0,y+25
0334 0882 std y+0,R0
0336 2B89 ldd R18,y+19
0338 3C89 ldd R19,y+20
033A 0989 ldd R16,y+17
033C 1A89 ldd R17,y+18
033E 0E940000 xcall _GUI_Point
0342 .dbline 184
0342 L37:
0342 .dbline -2
0342 L27:
0342 2796 adiw R28,7
0344 0E940000 xcall pop_gset5
0348 2496 adiw R28,4
034A .dbline 0 ; func end
034A 0895 ret
034C .dbsym l dy 5 I
034C .dbsym l dx 3 I
034C .dbsym r dy_x2 20 I
034C .dbsym r dx_x2 22 I
034C .dbsym r dy_sym 10 C
034C .dbsym r dx_sym 12 C
034C .dbsym r di 14 I
034C .dbsym l color 25 c
034C .dbsym l y1 23 i
034C .dbsym l x1 21 i
034C .dbsym l y0 19 i
034C .dbsym l x0 17 i
034C .dbend
034C .dbfunc e GUI_LineWith _GUI_LineWith fV
034C ; dy -> y+11
034C ; dx -> y+9
034C ; dy_x2 -> y+7
034C ; dx_x2 -> y+5
034C ; dy_sym -> R14
034C ; dx_sym -> R22
034C ; wy -> y+3
034C ; di -> R12,R13
034C ; draw_b -> R10,R11
034C ; wx -> R6,R7
034C ; draw_a -> R20,R21
034C ; color -> y+33
034C ; with -> R20
034C ; y1 -> y+29
034C ; x1 -> y+27
034C ; y0 -> y+25
034C ; x0 -> y+23
.even
034C _GUI_LineWith::
034C 0E940000 xcall push_arg4
0350 0E940000 xcall push_gset5
0354 2D97 sbiw R28,13
0356 4F8D ldd R20,y+31
0358 .dbline -1
0358 .dbline 203
0358 ; }
0358 ; GUI_Point(x0, y0, color); // 显示最后一点
0358 ; }
0358 ;
0358 ; }
0358 ;
0358 ;
0358 ; #if GUI_LineWith_EN==1
0358 ; /****************************************************************************
0358 ; * 名称:GUI_LineWith()
0358 ; * 功能:画任意两点之间的直线,并且可设置线的宽度。
0358 ; * 入口参数: x0 直线起点的x坐标值
0358 ; * y0 直线起点的y坐标值
0358 ; * x1 直线终点的x坐标值
0358 ; * y1 直线终点的y坐标值
0358 ; * with 线宽(0-50)
0358 ; * color 显示颜色
0358 ; * 出口参数:无
0358 ; * 说明:操作失败原因是指定地址超出有效范围。
0358 ; ****************************************************************************/
0358 ; void GUI_LineWith(uint32 x0, uint32 y0, uint32 x1, uint32 y1, uint8 with, TCOLOR color)
0358 ; { int32 dx; // 直线x轴差值变量
0358 .dbline 215
0358 ; int32 dy; // 直线y轴差值变量
0358 ; int8 dx_sym; // x轴增长方向,为-1时减值方向,为1时增值方向
0358 ; int8 dy_sym; // y轴增长方向,为-1时减值方向,为1时增值方向
0358 ; int32 dx_x2; // dx*2值变量,用于加快运算速度
0358 ; int32 dy_x2; // dy*2值变量,用于加快运算速度
0358 ; int32 di; // 决策变量
0358 ;
0358 ; int32 wx, wy; // 线宽变量
0358 ; int32 draw_a, draw_b;
0358 ;
0358 ; /* 参数过滤 */
0358 ; if(with==0) return;
0358 4423 tst R20
035A 09F4 brne L49
035C .dbline 215
035C ACC1 xjmp L48
035E L49:
035E .dbline 216
035E ; if(with>50) with = 50;
035E 82E3 ldi R24,50
0360 8417 cp R24,R20
0362 08F4 brsh L51
0364 .dbline 216
0364 42E3 ldi R20,50
0366 L51:
0366 .dbline 218
0366 ;
0366 ; dx = x1-x0; // 求取两点之间的差值
0366 2B8C ldd R2,y+27
0368 3C8C ldd R3,y+28
036A 0F88 ldd R0,y+23
036C 188C ldd R1,y+24
036E 2018 sub R2,R0
0370 3108 sbc R3,R1
0372 3A86 std y+10,R3
0374 2986 std y+9,R2
0376 .dbline 219
0376 ; dy = y1-y0;
0376 2D8C ldd R2,y+29
0378 3E8C ldd R3,y+30
037A 098C ldd R0,y+25
037C 1A8C ldd R1,y+26
037E 2018 sub R2,R0
0380 3108 sbc R3,R1
0382 3C86 std y+12,R3
0384 2B86 std y+11,R2
0386 .dbline 221
0386 ;
0386 ; wx = with/2;
0386 22E0 ldi R18,2
0388 30E0 ldi R19,0
038A 042F mov R16,R20
038C 1127 clr R17
038E 0E940000 xcall div16s
0392 3801 movw R6,R16
0394 .dbline 222
0394 ; wy = with-wx-1;
0394 842F mov R24,R20
0396 9927 clr R25
0398 801B sub R24,R16
039A 910B sbc R25,R17
039C 0197 sbiw R24,1
039E 9C83 std y+4,R25
03A0 8B83 std y+3,R24
03A2 .dbline 225
03A2 ;
03A2 ; /* 判断增长方向,或是否为水平线、垂直线、点 */
03A2 ; if(dx>0) // 判断x轴方向
03A2 2224 clr R2
03A4 3324 clr R3
03A6 4984 ldd R4,y+9
03A8 5A84 ldd R5,y+10
03AA 2414 cp R2,R4
03AC 3504 cpc R3,R5
03AE 14F4 brge L53
03B0 .dbline 226
03B0 ; { dx_sym = 1; // dx>0,设置dx_sym=1
03B0 .dbline 226
03B0 61E0 ldi R22,1
03B2 .dbline 227
03B2 ; }
03B2 39C0 xjmp L54
03B4 L53:
03B4 .dbline 229
03B4 ; else
03B4 ; { if(dx<0)
03B4 .dbline 229
03B4 8985 ldd R24,y+9
03B6 9A85 ldd R25,y+10
03B8 8030 cpi R24,0
03BA E0E0 ldi R30,0
03BC 9E07 cpc R25,R30
03BE 14F4 brge L55
03C0 .dbline 230
03C0 ; { dx_sym = -1; // dx<0,设置dx_sym=-1
03C0 .dbline 230
03C0 6FEF ldi R22,255
03C2 .dbline 231
03C2 ; }
03C2 31C0 xjmp L56
03C4 L55:
03C4 .dbline 233
03C4 ; else
03C4 ; { /* dx==0,画垂直线,或一点 */
03C4 .dbline 234
03C4 ; wx = x0-wx;
03C4 2F88 ldd R2,y+23
03C6 388C ldd R3,y+24
03C8 2618 sub R2,R6
03CA 3708 sbc R3,R7
03CC 3101 movw R6,R2
03CE .dbline 235
03CE ; if(wx<0) wx = 0;
03CE C101 movw R24,R2
03D0 8030 cpi R24,0
03D2 E0E0 ldi R30,0
03D4 9E07 cpc R25,R30
03D6 14F4 brge L57
03D8 .dbline 235
03D8 6624 clr R6
03DA 7724 clr R7
03DC L57:
03DC .dbline 236
03DC ; wy = x0+wy;
03DC 2B80 ldd R2,y+3
03DE 3C80 ldd R3,y+4
03E0 4F88 ldd R4,y+23
03E2 588C ldd R5,y+24
03E4 420C add R4,R2
03E6 531C adc R5,R3
03E8 5C82 std y+4,R5
03EA 4B82 std y+3,R4
03EC 1AC0 xjmp L60
03EE L59:
03EE .dbline 239
03EE ;
03EE ; while(1)
03EE ; { x0 = wx;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -