📄 lcd_240128.lst
字号:
(0280) {
0170 850B LDD R16,Y+11
0171 DFB4 RCALL _Lcd_Point
0172 842D LDD R2,Y+13
(0281) if (x1 > x2) e=-1;
(0282) else e=1;
0173 2433 CLR R3
0174 0C2C ADD R2,R12
0175 1C3D ADC R3,R13
0176 862D STD Y+13,R2
0177 840D LDD R0,Y+13
0178 8909 LDD R16,Y+17
0179 1600 CP R0,R16
(0283) for (;x1 != x2; x1 += e) Lcd_Point(x1,y1,draw);
017A F799 BNE 0x016E
017B 82E8 STD Y+0,R14
017C 2D20 MOV R18,R0
(0284) Lcd_Point(x1,y1,draw);
017D 850B LDD R16,Y+11
017E DFA7 RCALL _Lcd_Point
017F C097 RJMP 0x0217
0180 840D LDD R0,Y+13
0181 8909 LDD R16,Y+17
0182 1600 CP R0,R16
0183 F4F1 BNE 0x01A2
0184 840F LDD R0,Y+15
0185 850B LDD R16,Y+11
0186 1600 CP R0,R16
0187 F420 BCC 0x018C
0188 EF8F LDI R24,0xFF
0189 EF9F LDI R25,0xFF
018A 016C MOVW R12,R24
018B C00D RJMP 0x0199
018C E081 LDI R24,1
018D E090 LDI R25,0
(0285) return;
018E 016C MOVW R12,R24
(0286) }
(0287)
(0288) dx=x2-x1;
018F C009 RJMP 0x0199
0190 82E8 STD Y+0,R14
0191 852D LDD R18,Y+13
0192 850B LDD R16,Y+11
0193 DF92 RCALL _Lcd_Point
0194 842B LDD R2,Y+11
(0289) if (dx<0) //将第2、3象限转为1、4象限
0195 2433 CLR R3
0196 0C2C ADD R2,R12
0197 1C3D ADC R3,R13
0198 862B STD Y+11,R2
0199 840B LDD R0,Y+11
(0290) {
(0291) t=x1;x1=x2;x2=t;
019A 850F LDD R16,Y+15
019B 1600 CP R0,R16
019C F799 BNE 0x0190
019D 82E8 STD Y+0,R14
(0292) t=y1;y1=y2;y2=t;
019E 852D LDD R18,Y+13
019F 2D00 MOV R16,R0
01A0 DF85 RCALL _Lcd_Point
01A1 C075 RJMP 0x0217
(0293) dx=-dx;
01A2 842B LDD R2,Y+11
01A3 2433 CLR R3
01A4 84AF LDD R10,Y+15
01A5 24BB CLR R11
01A6 18A2 SUB R10,R2
(0294) }
(0295)
(0296) dy=y2-y1;
01A7 08B3 SBC R11,R3
01A8 01C5 MOVW R24,R10
01A9 3080 CPI R24,0
01AA E0E0 LDI R30,0
01AB 079E CPC R25,R30
01AC F47C BGE 0x01BC
(0297) if (dy>0) //第4象限,步进为1
01AD 2D42 MOV R20,R2
01AE 2755 CLR R21
01AF 840F LDD R0,Y+15
01B0 860B STD Y+11,R0
(0298) {
(0299) t=1;
01B1 874F STD Y+15,R20
01B2 854D LDD R20,Y+13
(0300) }
01B3 2755 CLR R21
(0301) else //第1象限,步进为-1
(0302) {
(0303) t=-1;
01B4 8809 LDD R0,Y+17
01B5 860D STD Y+13,R0
(0304) dy=-dy;
01B6 8B49 STD Y+17,R20
01B7 9580 COM R24
01B8 9590 COM R25
01B9 5F8F SUBI R24,0xFF
(0305) }
(0306)
(0307) Lcd_Point(x1,y1,draw);
01BA 4F9F SBCI R25,0xFF
01BB 015C MOVW R10,R24
01BC 842D LDD R2,Y+13
01BD 2433 CLR R3
01BE 8969 LDD R22,Y+17
01BF 2777 CLR R23
01C0 1962 SUB R22,R2
01C1 0973 SBC R23,R3
(0308) if (dx>=dy) //斜率<1,x步进1,y由差值决定是否加t
01C2 2422 CLR R2
01C3 1626 CP R2,R22
01C4 0637 CPC R3,R23
(0309) {
(0310) e=dy-(dx>>1);
01C5 F41C BGE 0x01C9
01C6 E041 LDI R20,1
01C7 E050 LDI R21,0
01C8 C006 RJMP 0x01CF
01C9 EF4F LDI R20,0xFF
01CA EF5F LDI R21,0xFF
01CB 9560 COM R22
(0311) while (x1 != x2)
(0312) {
(0313) if (e>0)
01CC 9570 COM R23
01CD 5F6F SUBI R22,0xFF
01CE 4F7F SBCI R23,0xFF
01CF 82E8 STD Y+0,R14
01D0 852D LDD R18,Y+13
(0314) {
(0315) y1+=t;
01D1 850B LDD R16,Y+11
01D2 DF53 RCALL _Lcd_Point
01D3 16A6 CP R10,R22
01D4 06B7 CPC R11,R23
01D5 F10C BLT 0x01F7
(0316) e-=dx;
01D6 0115 MOVW R2,R10
01D7 9435 ASR R3
(0317) }
(0318) x1++;
01D8 9427 ROR R2
(0319) e+=dy;
01D9 016B MOVW R12,R22
01DA 18C2 SUB R12,R2
(0320) Lcd_Point(x1,y1,draw);
01DB 08D3 SBC R13,R3
01DC C015 RJMP 0x01F2
01DD 2422 CLR R2
01DE 2433 CLR R3
01DF 142C CP R2,R12
01E0 043D CPC R3,R13
01E1 F43C BGE 0x01E9
01E2 842D LDD R2,Y+13
01E3 2433 CLR R3
01E4 0E24 ADD R2,R20
01E5 1E35 ADC R3,R21
(0321) }
(0322) }
01E6 862D STD Y+13,R2
(0323) else //斜率>1,y步进t,x由差值决定是否加1
(0324) {
(0325) e=dx-(dy>>1);
01E7 18CA SUB R12,R10
01E8 08DB SBC R13,R11
01E9 840B LDD R0,Y+11
01EA 9403 INC R0
01EB 860B STD Y+11,R0
01EC 0EC6 ADD R12,R22
01ED 1ED7 ADC R13,R23
(0326) while (y1 != y2)
(0327) {
(0328) if (e>0)
01EE 82E8 STD Y+0,R14
01EF 852D LDD R18,Y+13
01F0 2D00 MOV R16,R0
01F1 DF34 RCALL _Lcd_Point
01F2 840B LDD R0,Y+11
(0329) {
(0330) x1++;
01F3 850F LDD R16,Y+15
(0331) e-=dy;
01F4 1600 CP R0,R16
01F5 F739 BNE 0x01DD
(0332) }
(0333) y1+=t;
01F6 C020 RJMP 0x0217
01F7 011B MOVW R2,R22
01F8 9435 ASR R3
01F9 9427 ROR R2
(0334) e+=dx;
01FA 0165 MOVW R12,R10
01FB 18C2 SUB R12,R2
(0335) Lcd_Point(x1,y1,draw);
01FC 08D3 SBC R13,R3
01FD C015 RJMP 0x0213
01FE 2422 CLR R2
01FF 2433 CLR R3
0200 142C CP R2,R12
0201 043D CPC R3,R13
0202 F42C BGE 0x0208
0203 840B LDD R0,Y+11
0204 9403 INC R0
0205 860B STD Y+11,R0
0206 1AC6 SUB R12,R22
(0336) }
(0337) }
0207 0AD7 SBC R13,R23
0208 842D LDD R2,Y+13
0209 2433 CLR R3
020A 0E24 ADD R2,R20
020B 1E35 ADC R3,R21
020C 862D STD Y+13,R2
020D 0CCA ADD R12,R10
020E 1CDB ADC R13,R11
020F 82E8 STD Y+0,R14
0210 2D22 MOV R18,R2
0211 850B LDD R16,Y+11
(0338) }
(0339)
(0340)
(0341) /***********************************************************************
(0342) 以x,y为圆心,以radius为半径画贺
(0343) (show=1画点,show=0清点)
(0344) ***********************************************************************/
(0345) void Lcd_Circle(unsigned char x, unsigned char y, unsigned char r, unsigned char draw)
(0346) {
(0347) int xc = 0;
0212 DF13 RCALL _Lcd_Point
0213 840D LDD R0,Y+13
(0348) int yc ;
(0349) int p ;
(0350) yc=r;
0214 8909 LDD R16,Y+17
0215 1600 CP R0,R16
(0351) p = 3 - (r<<1);
0216 F739 BNE 0x01FE
0217 9621 ADIW R28,1
0218 940E03E0 CALL pop_gset5
021A 9624 ADIW R28,4
021B 9508 RET
_Lcd_Circle:
p --> R20
yc --> R22
xc --> R10
draw --> R12
r --> Y+15
y --> R14
x --> Y+11
021C 940E03D5 CALL push_arg4
021E 940E03E3 CALL push_gset5
(0352) while (xc <= yc)
(0353) {
(0354) Lcd_Point(x + xc, y + yc, draw);
0220 2EE2 MOV R14,R18
0221 9721 SBIW R28,1
0222 88C9 LDD R12,Y+17
0223 24AA CLR R10
0224 24BB CLR R11
0225 856F LDD R22,Y+15
0226 2777 CLR R23
0227 2E26 MOV R2,R22
0228 2433 CLR R3
(0355) Lcd_Point(x + xc, y - yc, draw);
0229 0C22 LSL R2
022A 1C33 ROL R3
022B E043 LDI R20,3
022C E050 LDI R21,0
022D 1942 SUB R20,R2
022E 0953 SBC R21,R3
022F C072 RJMP 0x02A2
0230 82C8 STD Y+0,R12
0231 2D2E MOV R18,R14
0232 2733 CLR R19
(0356) Lcd_Point(x - xc, y + yc, draw);
0233 0F26 ADD R18,R22
0234 1F37 ADC R19,R23
0235 850B LDD R16,Y+11
0236 2711 CLR R17
0237 0D0A ADD R16,R10
0238 1D1B ADC R17,R11
0239 DEEC RCALL _Lcd_Point
023A 82C8 STD Y+0,R12
023B 2D2E MOV R18,R14
023C 2733 CLR R19
(0357) Lcd_Point(x - xc, y - yc, draw);
023D 1B26 SUB R18,R22
023E 0B37 SBC R19,R23
023F 850B LDD R16,Y+11
0240 2711 CLR R17
0241 0D0A ADD R16,R10
0242 1D1B ADC R17,R11
0243 DEE2 RCALL _Lcd_Point
0244 82C8 STD Y+0,R12
0245 2D2E MOV R18,R14
0246 2733 CLR R19
(0358) Lcd_Point(x + yc, y + xc, draw);
0247 0F26 ADD R18,R22
0248 1F37 ADC R19,R23
0249 850B LDD R16,Y+11
024A 2711 CLR R17
024B 190A SUB R16,R10
024C 091B SBC R17,R11
024D DED8 RCALL _Lcd_Point
024E 82C8 STD Y+0,R12
024F 2D2E MOV R18,R14
0250 2733 CLR R19
(0359) Lcd_Point(x + yc, y - xc, draw);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -