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

📄 m128.lst

📁 ewts avr驱动程序 角速度传感器 104为秒
💻 LST
📖 第 1 页 / 共 4 页
字号:
    041B 2EA0      MOV	R10,R16
    041C 814E      LDD	R20,Y+6
    041D 815F      LDD	R21,Y+7
(0239) 		 }
(0240) 	 }	 
(0241) /*       传送LCD内部汉字数据到LCD         */
(0242) /*       x:0x00~0x07 y:0x00~0x03          */
(0243) void hz_tran(unsigned char x,unsigned char y,unsigned char *hz_p)
(0244)     {
(0245) 	 x+=2;
    041E 2D8A      MOV	R24,R10
    041F 5F8E      SUBI	R24,0xFE
    0420 2EA8      MOV	R10,R24
    0421 C01A      RJMP	0x043C
(0246)      while((*hz_p)!=0)
(0247) 	    {
(0248) 		 ocmj_write(0xf0);
    0422 EF00      LDI	R16,0xF0
    0423 DF97      RCALL	_ocmj_write
(0249) 		 ocmj_write(x);
    0424 2D0A      MOV	R16,R10
    0425 DF95      RCALL	_ocmj_write
(0250) 		 ocmj_write(y);
    0426 2F06      MOV	R16,R22
    0427 DF93      RCALL	_ocmj_write
(0251) 		 ocmj_write(*hz_p-0xa0);
    0428 01FA      MOVW	R30,R20
    0429 8100      LDD	R16,Z+0
    042A 5A00      SUBI	R16,0xA0
    042B DF8F      RCALL	_ocmj_write
(0252) 		 hz_p++;
    042C 5F4F      SUBI	R20,0xFF
    042D 4F5F      SBCI	R21,0xFF
(0253) 		 ocmj_write(*hz_p-0xa0);
    042E 01FA      MOVW	R30,R20
    042F 8100      LDD	R16,Z+0
    0430 5A00      SUBI	R16,0xA0
    0431 DF89      RCALL	_ocmj_write
(0254) 		 hz_p++;
    0432 5F4F      SUBI	R20,0xFF
    0433 4F5F      SBCI	R21,0xFF
(0255) 		 if(x<0x09)
    0434 2D8A      MOV	R24,R10
    0435 3089      CPI	R24,0x9
    0436 F410      BCC	0x0439
(0256)  		    x++;
    0437 94A3      INC	R10
    0438 C003      RJMP	0x043C
(0257) 		 else
(0258) 		    {
(0259) 			 x=0x02;
    0439 E082      LDI	R24,2
    043A 2EA8      MOV	R10,R24
(0260) 			 y++;
    043B 9563      INC	R22
    043C 01FA      MOVW	R30,R20
    043D 8020      LDD	R2,Z+0
    043E 2022      TST	R2
    043F F711      BNE	0x0422
    0440 940E072D  CALL	pop_gset3
    0442 9508      RET
_asc_tran:
  asc_p                --> R20
  y                    --> R22
  x                    --> R10
    0443 940E0737  CALL	push_gset3
    0445 2F62      MOV	R22,R18
    0446 2EA0      MOV	R10,R16
    0447 814E      LDD	R20,Y+6
    0448 815F      LDD	R21,Y+7
(0261) 			}	
(0262) 		}
(0263) 	}
(0264) /*          传送ASCII字母到LCD            */
(0265) /*          x:0x00~0x0f y:0~64            */	
(0266) void asc_tran(unsigned char x,unsigned char y,unsigned char *asc_p)
(0267)     {
(0268) 	 x+=4;
    0449 2D8A      MOV	R24,R10
    044A 5F8C      SUBI	R24,0xFC
    044B 2EA8      MOV	R10,R24
    044C C013      RJMP	0x0460
(0269) 	 while((*asc_p)!=0)
(0270) 	    {
(0271) 		 ocmj_write(0xf1);
    044D EF01      LDI	R16,0xF1
    044E DF6C      RCALL	_ocmj_write
(0272) 		 ocmj_write(x);
    044F 2D0A      MOV	R16,R10
    0450 DF6A      RCALL	_ocmj_write
(0273) 		 ocmj_write(y);
    0451 2F06      MOV	R16,R22
    0452 DF68      RCALL	_ocmj_write
(0274) 		 ocmj_write(*asc_p);
    0453 01FA      MOVW	R30,R20
    0454 8100      LDD	R16,Z+0
    0455 DF65      RCALL	_ocmj_write
(0275) 		 asc_p++;
    0456 5F4F      SUBI	R20,0xFF
    0457 4F5F      SBCI	R21,0xFF
(0276) 		 if (x<0x13) 
    0458 2D8A      MOV	R24,R10
    0459 3183      CPI	R24,0x13
    045A F410      BCC	0x045D
(0277) 		    x++;
    045B 94A3      INC	R10
    045C C003      RJMP	0x0460
(0278) 		 else
(0279) 		   {
(0280) 		    x=0x04;
    045D E084      LDI	R24,4
    045E 2EA8      MOV	R10,R24
(0281) 			y+=8;		    
    045F 5F68      SUBI	R22,0xF8
    0460 01FA      MOVW	R30,R20
    0461 8020      LDD	R2,Z+0
    0462 2022      TST	R2
    0463 F749      BNE	0x044D
    0464 940E072D  CALL	pop_gset3
    0466 9508      RET
_pset:
  y                    --> R20
  x                    --> R22
    0467 940E0739  CALL	push_gset2
    0469 2F42      MOV	R20,R18
    046A 2F60      MOV	R22,R16
(0282) 		   }	
(0283) 		}	
(0284) 	 }
(0285) /*            画点函数              */
(0286) void pset(unsigned char x,unsigned char y)
(0287)      {
(0288) 	  ocmj_write(0xf2);
    046B EF02      LDI	R16,0xF2
    046C DF4E      RCALL	_ocmj_write
(0289) 	  ocmj_write(x+32);
    046D 2F06      MOV	R16,R22
    046E 5E00      SUBI	R16,0xE0
    046F DF4B      RCALL	_ocmj_write
(0290) 	  ocmj_write(y);
    0470 2F04      MOV	R16,R20
    0471 DF49      RCALL	_ocmj_write
    0472 940E072A  CALL	pop_gset2
    0474 9508      RET
_line:
  incy                 --> R20
  incx                 --> R22
  delta_y              --> R10
  delta_x              --> Y+4
  t                    --> R14
  yerr                 --> Y+2
  xerr                 --> Y+0
  distance             --> R12
  y2                   --> Y+22
  x2                   --> Y+20
  y1                   --> Y+18
  x1                   --> Y+16
    0475 940E06DB  CALL	push_arg4
    0477 940E0733  CALL	push_gset5
    0479 9726      SBIW	R28,6
(0291) 	 }	
(0292) /*             画线函数          */	 
(0293) void line(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2)
(0294) {
(0295)     unsigned char t;
(0296) 	signed int xerr=0,yerr=0;
    047A 2400      CLR	R0
    047B 2411      CLR	R1
    047C 8219      STD	Y+1,R1
    047D 8208      STD	Y+0,R0
    047E 821B      STD	Y+3,R1
    047F 820A      STD	Y+2,R0
(0297) 	signed int delta_x,delta_y,distance;
(0298) 	signed char incx,incy;
(0299) 
(0300) /* 	计算两个方向的长度 */
(0301) 	delta_x=x2-x1;
    0480 8828      LDD	R2,Y+16
    0481 2433      CLR	R3
    0482 884C      LDD	R4,Y+20
    0483 2455      CLR	R5
    0484 1842      SUB	R4,R2
    0485 0853      SBC	R5,R3
    0486 825D      STD	Y+5,R5
    0487 824C      STD	Y+4,R4
(0302) 	delta_y=y2-y1;
    0488 882A      LDD	R2,Y+18
    0489 2433      CLR	R3
    048A 88AE      LDD	R10,Y+22
    048B 24BB      CLR	R11
    048C 18A2      SUB	R10,R2
    048D 08B3      SBC	R11,R3
(0303) 
(0304) /* 计算增量的方向,增量为"0"表示为垂直或水平线 */
(0305) 	if(delta_x>0) 
    048E 2422      CLR	R2
    048F 0102      MOVW	R0,R4
    0490 1424      CP	R2,R4
    0491 0435      CPC	R3,R5
    0492 F414      BGE	0x0495
(0306) 	     incx=1;
    0493 E061      LDI	R22,1
    0494 C011      RJMP	0x04A6
(0307) 	else 
(0308) 	    {
(0309) 		 if( delta_x==0 )
    0495 800C      LDD	R0,Y+4
    0496 801D      LDD	R1,Y+5
    0497 2000      TST	R0
    0498 F421      BNE	0x049D
    0499 2011      TST	R1
    049A F411      BNE	0x049D
(0310) 		      incx=0;
    049B 2766      CLR	R22
    049C C009      RJMP	0x04A6
(0311) 		 else 
(0312) 		      {
(0313) 			   incx=-1;
    049D EF6F      LDI	R22,0xFF
(0314) 			   delta_x =-delta_x;
    049E 818C      LDD	R24,Y+4
    049F 819D      LDD	R25,Y+5
    04A0 9580      COM	R24
    04A1 9590      COM	R25
    04A2 5F8F      SUBI	R24,0xFF
    04A3 4F9F      SBCI	R25,0xFF
    04A4 839D      STD	Y+5,R25
    04A5 838C      STD	Y+4,R24
(0315) 			  }
(0316) 		}
(0317) 	if(delta_y>0) 
    04A6 2422      CLR	R2
    04A7 2433      CLR	R3
    04A8 142A      CP	R2,R10
    04A9 043B      CPC	R3,R11
    04AA F414      BGE	0x04AD
(0318) 	      incy=1;
    04AB E041      LDI	R20,1
    04AC C00D      RJMP	0x04BA
(0319) 	else 
(0320) 	    {
(0321) 		 if( delta_y==0 )
    04AD 20AA      TST	R10
    04AE F421      BNE	0x04B3
    04AF 20BB      TST	R11
    04B0 F411      BNE	0x04B3
(0322) 		     incy=0;
    04B1 2744      CLR	R20
    04B2 C007      RJMP	0x04BA
(0323) 		 else 
(0324) 		     {
(0325) 			  incy=-1;
    04B3 EF4F      LDI	R20,0xFF
(0326) 			  delta_y =-delta_y;
    04B4 01C5      MOVW	R24,R10
    04B5 9580      COM	R24
    04B6 9590      COM	R25
    04B7 5F8F      SUBI	R24,0xFF
    04B8 4F9F      SBCI	R25,0xFF
    04B9 015C      MOVW	R10,R24
(0327) 			 }
(0328) 		}
(0329) /*  确定画线的范围 */
(0330) 	if( delta_x > delta_y ) distance=delta_x;
    04BA 800C      LDD	R0,Y+4
    04BB 801D      LDD	R1,Y+5
    04BC 14A0      CP	R10,R0
    04BD 04B1      CPC	R11,R1
    04BE F414      BGE	0x04C1
    04BF 0160      MOVW	R12,R0
    04C0 C001      RJMP	0x04C2
(0331) 	else distance=delta_y;
    04C1 0165      MOVW	R12,R10
(0332) 
(0333) /* 画线 */
(0334) 	for(t=0;t<= distance+1;t++) 
    04C2 24EE      CLR	R14
    04C3 C02E      RJMP	0x04F2
(0335) 	   {
(0336) 		ocmj_write(0xf2);
    04C4 EF02      LDI	R16,0xF2
    04C5 DEF5      RCALL	_ocmj_write
(0337) 	    ocmj_write(x1+32);
    04C6 8908      LDD	R16,Y+16
    04C7 5E00      SUBI	R16,0xE0
    04C8 DEF2      RCALL	_ocmj_write
(0338) 	    ocmj_write(y1);
    04C9 890A      LDD	R16,Y+18
    04CA DEF0      RCALL	_ocmj_write
(0339)  	    xerr += delta_x ;
    04CB 8008      LDD	R0,Y+0
    04CC 8019      LDD	R1,Y+1
    04CD 810C      LDD	R16,Y+4
    04CE 811D      LDD	R17,Y+5
    04CF 0E00      ADD	R0,R16
    04D0 1E11      ADC	R1,R17
    04D1 8219      STD	Y+1,R1
    04D2 8208      STD	Y+0,R0
(0340) 		yerr += delta_y ;
    04D3 800A      LDD	R0,Y+2
    04D4 801B      LDD	R1,Y+3
    04D5 0C0A      ADD	R0,R10
    04D6 1C1B      ADC	R1,R11
    04D7 821B      STD	Y+3,R1
    04D8 820A      STD	Y+2,R0
(0341) 		if( xerr > distance ) 
    04D9 8008      LDD	R0,Y+0
    04DA 8019      LDD	R1,Y+1
    04DB 14C0      CP	R12,R0
    04DC 04D1      CPC	R13,R1
    04DD F43C      BGE	0x04E5
(0342) 		    {
(0343) 			xerr-=distance;
    04DE 180C      SUB	R0,R12
    04DF 081D      SBC	R1,R13
    04E0 8219      STD	Y+1,R1
    04E1 8208      STD	Y+0,R0
(0344)  		    x1+=incx;
    04E2 8808      LDD	R0,Y+16
    04E3 0E06      ADD	R0,R22
    04E4 8A08      STD	Y+16,R0
(0345) 		    }
(0346) 		if( yerr > distance ) 
    04E5 800A      LDD	R0,Y+2
    04E6 801B      LDD	R1,Y+3
    04E7 14C0      CP	R12,R0
    04E8 04D1      CPC	R13,R1
    04E9 F43C      BGE	0x04F1
(0347) 		    {
(0348) 			yerr-=distance;
    04EA 180C      SUB	R0,R12
    04EB 081D      SBC	R1,R13
    04EC 821B      STD	Y+3,R1
    04ED 820A      STD	Y+2,R0
(0349)  		    y1+=incy;
    04EE 880A      LDD	R0,Y+18
    04EF 0E04      ADD	R0,R20
    04F0 8A0A      STD	Y+18,R0
    04F1 94E3      INC	R14
    04F2 01C6      MOVW	R24,R12
    04F3 9601      ADIW	R24,1
    04F4 2C2E      MOV	R2,R14
    04F5 2433      CLR	R3
    04F6 1582      CP	R24,R2
    04F7 0593      CPC	R25,R3
    04F8 F65C      BGE	0x04C4
    04F9 9626      ADIW	R28,6
    04FA 940E0730  CALL	pop_gset5
    04FC 9624      ADIW	R28,4
    04FD 9508      RET
_circle:
  rs                   --> R20
  xt                   --> R22
  rr                   --> Y+2
  xx                   --> R14
  y                    --> R12
  x                    --> R10
  yt                   --> Y+0
  r                    --> Y+18
  y0                   --> Y+16
  x0                   --> Y+14
    04FE 940E06DB  CALL	push_arg4
    0500 940E0733  CALL	push_gset5
    0502 9724      SBIW	R28,4
(0350)     		}
(0351)   	  }
(0352) }	 
(0353) /*            画圆函数             */
(0354) void circle(unsigned char x0,unsigned char y0,unsigned char r)
(0355)    {
(0356) 	unsigned char x,y;
(0357) 	unsigned int xx,rr,xt,yt,rs;
(0358) 	yt=r;
    0503 882A      LDD	R2,Y+18
    0504 2433      CLR	R3
    0505 8239      STD	Y+1,R3
    0506 8228      STD	Y+0,R2
(0359) 	rr=r*r+1;			//补偿 1 修正方形
    0507 880A      LDD	R0,Y+18
    0508 2D00      MOV	R16,R0
    0509 9E00      MUL	R0,R16
    050A 01C0      MOVW	R24,R0
    050B 9601      ADIW	R24,1
    050C 839B      STD	Y+3,R25
    050D 838A      STD	Y+2,R24
(0360) 	rs=yt*3/4;      //画8分之一圆弧
    050E E003      LDI	R16,3
    050F E010      LDI	R17,0
    0510 8128      LDD	R18,Y+0
    0511 8139      LDD	R19,Y+1
    0512 940E071A  CALL	empy16s
    0514 01A8      MOVW	R20,R16
    0515 9556      LSR	R21
    0516 9547      ROR	R20
    0517 9556      LSR	R21
    0518 9547      ROR	R20
(0361) 	for (xt=0;xt<=rs;xt++)
    0519 2766      CLR	R22
    051A 2777      CLR	R23
    051B C063      RJMP	0x057F
(0362) 	{
(0363) 		xx=xt*xt;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -