📄 gui_basic.lis
字号:
013A 3B1C adc R3,R11
013C 3982 std y+1,R3
013E 2882 std y+0,R2
0140 9B01 movw R18,R22
0142 8A01 movw R16,R20
0144 5DDF xcall _GUI_Rectangle
0146 .dbline -2
0146 L20:
0146 2596 adiw R28,5
0148 0E940000 xcall pop_gset3
014C .dbline 0 ; func end
014C 0895 ret
014E .dbsym l color 13 c
014E .dbsym r with 10 i
014E .dbsym r y0 22 i
014E .dbsym r x0 20 i
014E .dbend
014E .dbfunc e GUI_Line _GUI_Line fV
014E ; dy -> y+5
014E ; dx -> y+3
014E ; dy_x2 -> R20,R21
014E ; dx_x2 -> R22,R23
014E ; dy_sym -> R10
014E ; dx_sym -> R12
014E ; di -> R14,R15
014E ; color -> y+25
014E ; y1 -> y+23
014E ; x1 -> y+21
014E ; y0 -> y+19
014E ; x0 -> y+17
.even
014E _GUI_Line::
014E 0E940000 xcall push_arg4
0152 0E940000 xcall push_gset5
0156 2797 sbiw R28,7
0158 .dbline -1
0158 .dbline 105
0158 ; }
0158 ;
0158 ;
0158 ;
0158 ; /****************************************************************************
0158 ; * 名称:GUI_Line()
0158 ; * 功能:画任意两点之间的直线。
0158 ; * 入口参数: x0 直线起点的x坐标值
0158 ; * y0 直线起点的y坐标值
0158 ; * x1 直线终点的x坐标值
0158 ; * y1 直线终点的y坐标值
0158 ; * color 显示颜色(对于黑白色LCM,为0时灭,为1时显示)
0158 ; * 出口参数:无
0158 ; * 说明:操作失败原因是指定地址超出有效范围。
0158 ; ****************************************************************************/
0158 ; void GUI_Line(uint32 x0, uint32 y0, uint32 x1, uint32 y1, TCOLOR color)
0158 ; { int32 dx; // 直线x轴差值变量
0158 .dbline 114
0158 ; int32 dy; // 直线y轴差值变量
0158 ; int8 dx_sym; // x轴增长方向,为-1时减值方向,为1时增值方向
0158 ; int8 dy_sym; // y轴增长方向,为-1时减值方向,为1时增值方向
0158 ; int32 dx_x2; // dx*2值变量,用于加快运算速度
0158 ; int32 dy_x2; // dy*2值变量,用于加快运算速度
0158 ; int32 di; // 决策变量
0158 ;
0158 ;
0158 ; dx = x1-x0; // 求取两点之间的差值
0158 2D88 ldd R2,y+21
015A 3E88 ldd R3,y+22
015C 0988 ldd R0,y+17
015E 1A88 ldd R1,y+18
0160 2018 sub R2,R0
0162 3108 sbc R3,R1
0164 3C82 std y+4,R3
0166 2B82 std y+3,R2
0168 .dbline 115
0168 ; dy = y1-y0;
0168 2F88 ldd R2,y+23
016A 388C ldd R3,y+24
016C 0B88 ldd R0,y+19
016E 1C88 ldd R1,y+20
0170 2018 sub R2,R0
0172 3108 sbc R3,R1
0174 3E82 std y+6,R3
0176 2D82 std y+5,R2
0178 .dbline 118
0178 ;
0178 ; /* 判断增长方向,或是否为水平线、垂直线、点 */
0178 ; if(dx>0) // 判断x轴方向
0178 2224 clr R2
017A 3324 clr R3
017C 4B80 ldd R4,y+3
017E 5C80 ldd R5,y+4
0180 2414 cp R2,R4
0182 3504 cpc R3,R5
0184 1CF4 brge L28
0186 .dbline 119
0186 ; { dx_sym = 1; // dx>0,设置dx_sym=1
0186 .dbline 119
0186 CC24 clr R12
0188 C394 inc R12
018A .dbline 120
018A ; }
018A 16C0 xjmp L29
018C L28:
018C .dbline 122
018C ; else
018C ; { if(dx<0)
018C .dbline 122
018C 8B81 ldd R24,y+3
018E 9C81 ldd R25,y+4
0190 8030 cpi R24,0
0192 E0E0 ldi R30,0
0194 9E07 cpc R25,R30
0196 1CF4 brge L30
0198 .dbline 123
0198 ; { dx_sym = -1; // dx<0,设置dx_sym=-1
0198 .dbline 123
0198 8FEF ldi R24,255
019A C82E mov R12,R24
019C .dbline 124
019C ; }
019C 0DC0 xjmp L31
019E L30:
019E .dbline 126
019E ; else
019E ; { // dx==0,画垂直线,或一点
019E .dbline 127
019E ; GUI_RLine(x0, y0, y1, color);
019E 098C ldd R0,y+25
01A0 0A82 std y+2,R0
01A2 0F88 ldd R0,y+23
01A4 188C ldd R1,y+24
01A6 1982 std y+1,R1
01A8 0882 std y+0,R0
01AA 2B89 ldd R18,y+19
01AC 3C89 ldd R19,y+20
01AE 0989 ldd R16,y+17
01B0 1A89 ldd R17,y+18
01B2 0E940000 xcall _GUI_RLine
01B6 .dbline 128
01B6 ; return;
01B6 C5C0 xjmp L27
01B8 L31:
01B8 .dbline 130
01B8 ; }
01B8 ; }
01B8 L29:
01B8 .dbline 132
01B8 ;
01B8 ; if(dy>0) // 判断y轴方向
01B8 2224 clr R2
01BA 3324 clr R3
01BC 4D80 ldd R4,y+5
01BE 5E80 ldd R5,y+6
01C0 2414 cp R2,R4
01C2 3504 cpc R3,R5
01C4 1CF4 brge L32
01C6 .dbline 133
01C6 ; { dy_sym = 1; // dy>0,设置dy_sym=1
01C6 .dbline 133
01C6 AA24 clr R10
01C8 A394 inc R10
01CA .dbline 134
01CA ; }
01CA 16C0 xjmp L33
01CC L32:
01CC .dbline 136
01CC ; else
01CC ; { if(dy<0)
01CC .dbline 136
01CC 8D81 ldd R24,y+5
01CE 9E81 ldd R25,y+6
01D0 8030 cpi R24,0
01D2 E0E0 ldi R30,0
01D4 9E07 cpc R25,R30
01D6 1CF4 brge L34
01D8 .dbline 137
01D8 ; { dy_sym = -1; // dy<0,设置dy_sym=-1
01D8 .dbline 137
01D8 8FEF ldi R24,255
01DA A82E mov R10,R24
01DC .dbline 138
01DC ; }
01DC 0DC0 xjmp L35
01DE L34:
01DE .dbline 140
01DE ; else
01DE ; { // dy==0,画水平线,或一点
01DE .dbline 141
01DE ; GUI_HLine(x0, y0, x1, color);
01DE 098C ldd R0,y+25
01E0 0A82 std y+2,R0
01E2 0D88 ldd R0,y+21
01E4 1E88 ldd R1,y+22
01E6 1982 std y+1,R1
01E8 0882 std y+0,R0
01EA 2B89 ldd R18,y+19
01EC 3C89 ldd R19,y+20
01EE 0989 ldd R16,y+17
01F0 1A89 ldd R17,y+18
01F2 0E940000 xcall _GUI_HLine
01F6 .dbline 142
01F6 ; return;
01F6 A5C0 xjmp L27
01F8 L35:
01F8 .dbline 144
01F8 ; }
01F8 ; }
01F8 L33:
01F8 .dbline 147
01F8 ;
01F8 ; /* 将dx、dy取绝对值 */
01F8 ; dx = dx_sym * dx;
01F8 2B81 ldd R18,y+3
01FA 3C81 ldd R19,y+4
01FC 0C2D mov R16,R12
01FE 1127 clr R17
0200 07FD sbrc R16,7
0202 1095 com R17
0204 0E940000 xcall empy16s
0208 1C83 std y+4,R17
020A 0B83 std y+3,R16
020C .dbline 148
020C ; dy = dy_sym * dy;
020C 2D81 ldd R18,y+5
020E 3E81 ldd R19,y+6
0210 0A2D mov R16,R10
0212 1127 clr R17
0214 07FD sbrc R16,7
0216 1095 com R17
0218 0E940000 xcall empy16s
021C 1E83 std y+6,R17
021E 0D83 std y+5,R16
0220 .dbline 151
0220 ;
0220 ; /* 计算2倍的dx及dy值 */
0220 ; dx_x2 = dx*2;
0220 2B81 ldd R18,y+3
0222 3C81 ldd R19,y+4
0224 02E0 ldi R16,2
0226 10E0 ldi R17,0
0228 0E940000 xcall empy16s
022C B801 movw R22,R16
022E .dbline 152
022E ; dy_x2 = dy*2;
022E 2D81 ldd R18,y+5
0230 3E81 ldd R19,y+6
0232 02E0 ldi R16,2
0234 10E0 ldi R17,0
0236 0E940000 xcall empy16s
023A A801 movw R20,R16
023C .dbline 155
023C ;
023C ; /* 使用Bresenham法进行画直线 */
023C ; if(dx>=dy) // 对于dx>=dy,则使用x轴为基准
023C 2D80 ldd R2,y+5
023E 3E80 ldd R3,y+6
0240 4B80 ldd R4,y+3
0242 5C80 ldd R5,y+4
0244 4214 cp R4,R2
0246 5304 cpc R5,R3
0248 0CF4 brge X1
024A 3DC0 xjmp L36
024C X1:
024C .dbline 156
024C ; { di = dy_x2 - dx;
024C .dbline 156
024C 7A01 movw R14,R20
024E E418 sub R14,R4
0250 F508 sbc R15,R5
0252 29C0 xjmp L39
0254 L38:
0254 .dbline 158
0254 ; while(x0!=x1)
0254 ; { GUI_Point(x0, y0, color);
0254 .dbline 158
0254 098C ldd R0,y+25
0256 0882 std y+0,R0
0258 2B89 ldd R18,y+19
025A 3C89 ldd R19,y+20
025C 0989 ldd R16,y+17
025E 1A89 ldd R17,y+18
0260 0E940000 xcall _GUI_Point
0264 .dbline 159
0264 ; x0 += dx_sym;
0264 2C2C mov R2,R12
0266 3324 clr R3
0268 27FC sbrc R2,7
026A 3094 com R3
026C 0988 ldd R0,y+17
026E 1A88 ldd R1,y+18
0270 020C add R0,R2
0272 131C adc R1,R3
0274 1A8A std y+18,R1
0276 098A std y+17,R0
0278 .dbline 160
0278 ; if(di<0)
0278 C701 movw R24,R14
027A 8030 cpi R24,0
027C E0E0 ldi R30,0
027E 9E07 cpc R25,R30
0280 1CF4 brge L41
0282 .dbline 161
0282 ; { di += dy_x2; // 计算出下一步的决策值
0282 .dbline 161
0282 E40E add R14,R20
0284 F51E adc R15,R21
0286 .dbline 162
0286 ; }
0286 0FC0 xjmp L42
0288 L41:
0288 .dbline 164
0288 ; else
0288 ; { di += dy_x2 - dx_x2;
0288 .dbline 164
0288 1A01 movw R2,R20
028A 261A sub R2,R22
028C 370A sbc R3,R23
028E E20C add R14,R2
0290 F31C adc R15,R3
0292 .dbline 165
0292 ; y0 += dy_sym;
0292 2A2C mov R2,R10
0294 3324 clr R3
0296 27FC sbrc R2,7
0298 3094 com R3
029A 0B88 ldd R0,y+19
029C 1C88 ldd R1,y+20
029E 020C add R0,R2
02A0 131C adc R1,R3
02A2 1C8A std y+20,R1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -