📄 t6963.lst
字号:
0571 5F8E SUBI R24,0xFE
0572 2EE8 MOV R14,R24
(0346) i++;
0573 8009 LDD R0,Y+1
0574 9403 INC R0
0575 8209 STD Y+1,R0
(0347) };
(0348) if(uCol >= 30) // 光标后移
0576 2D8E MOV R24,R14
0577 318E CPI R24,0x1E
0578 F060 BCS 0x0585
(0349) {
(0350) uRow += 16;
0579 8188 LDD R24,Y+0
057A 5F80 SUBI R24,0xF0
057B 8388 STD Y+0,R24
(0351) if(uRow < 0x80)
057C 3880 CPI R24,0x80
057D F420 BCC 0x0582
(0352) {
(0353) uCol -= 30;
057E 2D8E MOV R24,R14
057F 518E SUBI R24,0x1E
0580 2EE8 MOV R14,R24
(0354) }
0581 C003 RJMP 0x0585
(0355) else
(0356) {
(0357) uRow = 0;
0582 2400 CLR R0
0583 8208 STD Y+0,R0
(0358) uCol = 0;
0584 24EE CLR R14
(0359) }
(0360) }
(0361) fnSetPos(uRow,uCol);
0585 2D2E MOV R18,R14
0586 8108 LDD R16,Y+0
0587 DEE3 RCALL _fnSetPos
(0362) i++;
0588 8009 LDD R0,Y+1
0589 9403 INC R0
058A 8209 STD Y+1,R0
058B 8009 LDD R0,Y+1
058C 810A LDD R16,Y+2
058D 1600 CP R0,R16
058E F408 BCC 0x0590
058F CF5B RJMP 0x04EB
(0363) }
(0364) return uLen; //返回字串长度,汉字按2字节计算
0590 9624 ADIW R28,4
0591 D1DA RCALL pop_gset5
0592 9508 RET
_shortdelay:
i --> R20
tt --> R16
0593 D1DA RCALL push_gset1
(0365) }
(0366) /*======================*/
(0367) /* 延时*/
(0368) /*======================*/
(0369) void shortdelay(unsigned int tt)
(0370) {
0594 C007 RJMP 0x059C
(0371) unsigned char i;
(0372) while (tt)
(0373) {
(0374) i=100;
0595 E644 LDI R20,0x64
0596 C001 RJMP 0x0598
(0375) while (i)
(0376) {
(0377) i--;
0597 954A DEC R20
0598 2344 TST R20
0599 F7E9 BNE 0x0597
(0378) }
(0379) tt--;
059A 5001 SUBI R16,1
059B 4010 SBCI R17,0
059C 3000 CPI R16,0
059D 0701 CPC R16,R17
059E F7B1 BNE 0x0595
(0380) }
(0381) }
059F D1D1 RCALL pop_gset1
05A0 9508 RET
_point:
x1 --> R20
s --> Y+6
y --> R10
x --> R22
05A1 D1E6 RCALL push_gset3
05A2 2EA2 MOV R10,R18
05A3 2F60 MOV R22,R16
(0382) /*************************/
(0383) /* 画点*/
(0384) /*************************/
(0385) void point(unsigned char x,unsigned char y,unsigned char s)
(0386) {
(0387) unsigned char x1;
(0388) x1 = x >> 3; // 取Y方向分页地址
05A4 2F46 MOV R20,R22
05A5 9546 LSR R20
05A6 9546 LSR R20
05A7 9546 LSR R20
(0389) fnSetPos(y,x1); // 起点定位
05A8 2F24 MOV R18,R20
05A9 2D0A MOV R16,R10
05AA DEC0 RCALL _fnSetPos
(0390) x1 = turnf[ x & 0x07 ];
05AB EE84 LDI R24,0xE4
05AC E096 LDI R25,6
05AD 2FE6 MOV R30,R22
05AE 27FF CLR R31
05AF 70E7 ANDI R30,7
05B0 70F0 ANDI R31,0
05B1 0FE8 ADD R30,R24
05B2 1FF9 ADC R31,R25
05B3 9144 LPM R20,0(Z)
(0391) x1 = 0xF0 | x1 | s; // 字节内位置计算
05B4 6F40 ORI R20,0xF0
05B5 800E LDD R0,Y+6
05B6 2940 OR R20,R0
(0392) fnPR12(x1); // 画上屏幕S显示属性8 画点0 擦除点
05B7 2F04 MOV R16,R20
05B8 DE90 RCALL _fnPR12
(0393) }
05B9 D1B0 RCALL pop_gset3
05BA 9508 RET
_Linexy:
incy --> Y+9
incx --> Y+7
delta_y --> Y+5
delta_x --> Y+3
uCol --> Y+1
uRow --> R20
yerr --> R22
xerr --> R10
distance --> R12
t --> R14
s --> Y+25
yt --> Y+23
xt --> Y+21
y0 --> R12
x0 --> R20
05BB D1D2 RCALL push_gset5
05BC 2EC2 MOV R12,R18
05BD 2F40 MOV R20,R16
05BE 972B SBIW R28,0xB
(0394) /************************************************/
(0395) /* 画线任意方向的斜线,直线数学方程aX+bY=1 */
(0396) /************************************************/
(0397) void Linexy(unsigned char x0,unsigned char y0,unsigned char xt,unsigned char yt,unsigned char s)
(0398) {
(0399) register unsigned char t;
(0400) int xerr = 0,yerr = 0;
05BF 24AA CLR R10
05C0 24BB CLR R11
05C1 2766 CLR R22
05C2 2777 CLR R23
(0401) int delta_x,delta_y,distance;
(0402) int incx,incy,uRow,uCol;
(0403) delta_x = xt-x0; // 计算坐标增量
05C3 2E24 MOV R2,R20
05C4 2433 CLR R3
05C5 884D LDD R4,Y+21
05C6 2455 CLR R5
05C7 1842 SUB R4,R2
05C8 0853 SBC R5,R3
05C9 825C STD Y+4,R5
05CA 824B STD Y+3,R4
(0404) delta_y = yt-y0;
05CB 2C2C MOV R2,R12
05CC 2433 CLR R3
05CD 884F LDD R4,Y+23
05CE 2455 CLR R5
05CF 1842 SUB R4,R2
05D0 0853 SBC R5,R3
05D1 825E STD Y+6,R5
05D2 824D STD Y+5,R4
(0405) uRow = x0;
05D3 2755 CLR R21
(0406) uCol = y0;
05D4 2433 CLR R3
05D5 823A STD Y+2,R3
05D6 8229 STD Y+1,R2
(0407) if(delta_x>0)
05D7 2422 CLR R2
05D8 940E07D7 CALL 0x7D7
05DA F42C BGE 0x05E0
(0408) {
(0409) incx = 1; // 设置单步方向
05DB E081 LDI R24,1
05DC E090 LDI R25,0
05DD 8798 STD Y+8,R25
05DE 838F STD Y+7,R24
(0410) }
05DF C015 RJMP 0x05F5
(0411) else if( delta_x==0 )
05E0 802B LDD R2,Y+3
05E1 803C LDD R3,Y+4
05E2 2022 TST R2
05E3 F439 BNE 0x05EB
05E4 2033 TST R3
05E5 F429 BNE 0x05EB
(0412) {
(0413) incx=0; // 垂直线
05E6 2422 CLR R2
05E7 2433 CLR R3
05E8 8638 STD Y+8,R3
05E9 822F STD Y+7,R2
(0414) }
05EA C00A RJMP 0x05F5
(0415) else
(0416) {
(0417) incx = -1;
05EB EF8F LDI R24,0xFF
05EC EF9F LDI R25,0xFF
05ED 8798 STD Y+8,R25
05EE 838F STD Y+7,R24
(0418) delta_x = -delta_x;
05EF 818B LDD R24,Y+3
05F0 819C LDD R25,Y+4
05F1 940E07DC CALL 0x7DC
05F3 839C STD Y+4,R25
05F4 838B STD Y+3,R24
(0419)
(0420) }
(0421) if(delta_y>0)
05F5 2422 CLR R2
05F6 2433 CLR R3
05F7 804D LDD R4,Y+5
05F8 805E LDD R5,Y+6
05F9 1424 CP R2,R4
05FA 0435 CPC R3,R5
05FB F42C BGE 0x0601
(0422) {
(0423) incy=1;
05FC E081 LDI R24,1
05FD E090 LDI R25,0
05FE 879A STD Y+10,R25
05FF 8789 STD Y+9,R24
(0424) }
0600 C015 RJMP 0x0616
(0425) else if( delta_y==0 )
0601 802D LDD R2,Y+5
0602 803E LDD R3,Y+6
0603 2022 TST R2
0604 F439 BNE 0x060C
0605 2033 TST R3
0606 F429 BNE 0x060C
(0426) {
(0427) incy=0; // 水平线
0607 2422 CLR R2
0608 2433 CLR R3
0609 863A STD Y+10,R3
060A 8629 STD Y+9,R2
(0428) }
060B C00A RJMP 0x0616
(0429) else
(0430) {
(0431) incy=-1;
060C EF8F LDI R24,0xFF
060D EF9F LDI R25,0xFF
060E 879A STD Y+10,R25
060F 8789 STD Y+9,R24
(0432) delta_y=-delta_y;
0610 818D LDD R24,Y+5
0611 819E LDD R25,Y+6
0612 940E07DC CALL 0x7DC
0614 839E STD Y+6,R25
0615 838D STD Y+5,R24
(0433) }
(0434) if( delta_x > delta_y )
0616 802D LDD R2,Y+5
0617 803E LDD R3,Y+6
0618 940E07D7 CALL 0x7D7
061A F414 BGE 0x061D
(0435) {
(0436) distance=delta_x; // 选取基本增量坐标轴
061B 0162 MOVW R12,R4
(0437) }
061C C002 RJMP 0x061F
(0438) else
(0439) {
(0440) distance=delta_y;
061D 80CD LDD R12,Y+5
061E 80DE LDD R13,Y+6
(0441) }
(0442) for( t=0;t <= distance+1; t++ ) // 画线输出
061F 24EE CLR R14
0620 C024 RJMP 0x0645
(0443) {
(0444) point(uRow,uCol,s); // 画点
0621 8C09 LDD R0,Y+25
0622 8208 STD Y+0,R0
0623 8129 LDD R18,Y+1
0624 2F04 MOV R16,R20
0625 DF7B RCALL _point
(0445) xerr += delta_x;
0626 802B LDD R2,Y+3
0627 803C LDD R3,Y+4
0628 0CA2 ADD R10,R2
0629 1CB3 ADC R11,R3
(0446) yerr += delta_y;
062A 802D LDD R2,Y+5
062B 803E LDD R3,Y+6
062C 0D62 ADD R22,R2
062D 1D73 ADC R23,R3
(0447) if( xerr > distance )
062E 14CA CP R12,R10
062F 04DB CPC R13,R11
0630 F434 BGE 0x0637
(0448) {
(0449) xerr -= distance;
0631 18AC SUB R10,R12
0632 08BD SBC R11,R13
(0450) uRow += incx;
0633 802F LDD R2,Y+7
0634 8438 LDD R3,Y+8
0635 0D42 ADD R20,R2
0636 1D53 ADC R21,R3
(0451) }
(0452) if( yerr > distance )
0637 16C6 CP R12,R22
0638 06D7 CPC R13,R23
0639 F454 BGE 0x0644
(0453) {
(0454) yerr -= distance;
063A 196C SUB R22,R12
063B 097D SBC R23,R13
(0455) uCol += incy;
063C 8429 LDD R2,Y+9
063D 843A LDD R3,Y+10
063E 8049 LDD R4,Y+1
063F 805A LDD R5,Y+2
0640 0C42 ADD R4,R2
0641 1C53 ADC R5,R3
0642 825A STD Y+2,R5
0643 8249 STD Y+1,R4
0644 94E3 INC R14
0645 01C6 MOVW R24,R12
0646 9601 ADIW R24,1
0647 2C2E MOV R2,R14
0648 2433 CLR R3
0649 1582 CP R24,R2
064A 0593 CPC R25,R3
064B F6AC BGE 0x0621
(0456) }
(0457) }
(0458) }
064C 962B ADIW R28,0xB
064D D11E RCALL pop_gset5
064E 9508 RET
_circle:
rs --> Y+1
xt --> R20
rr --> R22
xx --> R14
col --> R12
row --> R10
yt --> Y+3
s --> Y+21
Rx --> Y+19
Oy --> Y+17
Ox --> Y+15
064F D103 RCALL push_arg4
0650 D13D RCALL push_gset5
0651 9725 SBIW R28,5
(0459) /********************************************/
(0460) /* 画圆数学方程(X-Ox)^2+(Y-Oy)^2=Rx^2 */
(0461) /********************************************/
(0462) void circle(unsigned char Ox,unsigned char Oy,unsigned char Rx,unsigned char s)
(0463) {
(0464) unsigned int xx,rr;
(0465) unsigned int xt,yt;
(0466) unsigned int rs,row,col;
(0467) yt = Rx;
0652 882B LDD R2,Y+19
0653 2433 CLR R3
0654 823C STD Y+4,R3
0655 822B STD Y+3,R2
(0468) rr = (unsigned int)Rx*Rx+1; // 补偿1 修正方形
0656 882B LDD R2,Y+19
0657 2433 CLR R3
0658 0191 MOVW R18,R2
0659 0181 MOVW R16,R2
065A D0FD RCALL empy16s
065B 01B8 MOVW R22,R16
065C 5F6F SUBI R22,0xFF
065D 4F7F SBCI R23,0xFF
(0469) rs = (yt+(yt>>1))>>1; // (*0.75)分开1/8圆弧来画
065E 802B LDD R2,Y+3
065F 803C LDD R3,Y+4
0660 9436 LSR R3
0661 9427 ROR R2
0662 804B LDD R4,Y+3
0663 805C LDD R5,Y+4
0664 0C42 ADD R4,R2
0665 1C53 ADC R5,R3
0666 9456 LSR R5
0667 9447 ROR R4
0668 825A STD Y+2,R5
0669 8249 STD Y+1,R4
(0470) for (xt=0;xt<=rs;xt++)
066A 2744 CLR R20
066B 2755 CLR R21
066C C050 RJMP 0x06BD
(0471) {
(0472) xx = xt*xt;
066D 019A MOVW R18,R20
066E 018A MOVW R16,R20
066F D0E8 RCALL empy16s
0670 0178 MOVW R14,R16
0671 C005 RJMP 0x0677
(0473) while ((yt*yt)>(rr-xx))
(0474) {
(0475) yt--;
0672 818B LDD R24,Y+3
0673 819C LDD R25,Y+4
0674 9701 SBIW R24,1
0675 839C STD Y+4,R25
0676 838B STD Y+3,R24
0677 011B MOVW R2,R22
0678 182E SUB R2,R14
0679 083F SBC R3,R15
067A 812B LDD R18,Y+3
067B 813C LDD R19,Y+4
067C 0189 MOVW R16,R18
067D D0DA RCALL empy16s
067E 1620 CP R2,R16
067F 0631 CPC R3,R17
0680 F388 BCS 0x0672
0681 940E07D2 CALL 0x7D2
0683 940E07CD CALL 0x7CD
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -