⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 t6963.lst

📁 LCD菜单的仿真及程序AVR_T6963.rar
💻 LST
📖 第 1 页 / 共 4 页
字号:
    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 + -