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

📄 avrstudy.lst

📁 AVR学习开发 板
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0060) 	#define SIZE 0x7fff
(0061) #elif e2prom==512
(0062) 	#define PAGE_SIZE 128
(0063) 	#define SIZE 0xffff
(0064) #endif//========读取一个字节============
(0065) uchar Readbyte(void)  
(0066) {
(0067)     TWCR=BIT(TWINT)|BIT(TWEA)|BIT(TWEN);
_Readbyte:
    0483 EC84      LDI	R24,0xC4
    0484 BF86      OUT	0x36,R24
(0068) 	while(!(TWCR&(1<<TWINT)));
    0485 B626      IN	R2,0x36
    0486 FE27      SBRS	R2,7
    0487 CFFD      RJMP	0x0485
(0069) 	return(TWDR);
    0488 B103      IN	R16,0x03
    0489 9508      RET
(0070) }	
(0071) //==========TWI初始化==========
(0072) void twi_init()
(0073) {
(0074)     TWBR=0X20; 			       			//设置波特率
_twi_init:
    048A E280      LDI	R24,0x20
    048B B980      OUT	0x00,R24
(0075) 	TWSR=0;				   				//设置波特率预分频
    048C 2422      CLR	R2
    048D B821      OUT	0x01,R2
(0076) 	TWCR=0X44;			   				//初始化TWI控制寄存器
    048E E484      LDI	R24,0x44
    048F BF86      OUT	0x36,R24
    0490 9508      RET
_twi_writeBtye:
  rdata                --> R20
  dataddr              --> R22
    0491 D67D      RCALL	push_gset2
    0492 2F42      MOV	R20,R18
    0493 01B8      MOVW	R22,R16
(0077) }
(0078) //=========写一个字节数据=============
(0079) uchar twi_writeBtye(uint dataddr,uchar rdata)//存储地址,数据
(0080) {
(0081)     Start();               			   	//启动IIC
    0494 EA84      LDI	R24,0xA4
    0495 BF86      OUT	0x36,R24
(0082) 	Wait();					   		  	//等待操作完成
    0496 B626      IN	R2,0x36
    0497 FE27      SBRS	R2,7
    0498 CFFD      RJMP	0x0496
(0083) 	if(TestACK()!=START){return 0;}
    0499 B181      IN	R24,0x01
    049A 7F88      ANDI	R24,0xF8
    049B 3088      CPI	R24,0x8
    049C F011      BEQ	0x049F
    049D 2700      CLR	R16
    049E C03B      RJMP	0x04DA
(0084) 	Writebyte(W_ADD_COM);	   	   	  	//写器件地址
    049F EA80      LDI	R24,0xA0
    04A0 B983      OUT	0x03,R24
    04A1 E884      LDI	R24,0x84
    04A2 BF86      OUT	0x36,R24
(0085) 	Wait();					   		  	//等待操作完成
    04A3 B626      IN	R2,0x36
    04A4 FE27      SBRS	R2,7
    04A5 CFFD      RJMP	0x04A3
(0086) 	if(TestACK()!=MT_SLA_ACK){return 0;}
    04A6 B181      IN	R24,0x01
    04A7 7F88      ANDI	R24,0xF8
    04A8 3188      CPI	R24,0x18
    04A9 F011      BEQ	0x04AC
    04AA 2700      CLR	R16
    04AB C02E      RJMP	0x04DA
(0087) 	Writebyte(((dataddr&0xff00)>>8)); 	//写数据存储地址高八位
    04AC 01CB      MOVW	R24,R22
    04AD 7080      ANDI	R24,0
    04AE 2F89      MOV	R24,R25
    04AF 2799      CLR	R25
    04B0 B983      OUT	0x03,R24
    04B1 E884      LDI	R24,0x84
    04B2 BF86      OUT	0x36,R24
(0088) 	Wait();					   		  	//等待操作完成
    04B3 B626      IN	R2,0x36
    04B4 FE27      SBRS	R2,7
    04B5 CFFD      RJMP	0x04B3
(0089) 	if(TestACK()!=MT_DATA_ACK){return 0;}
    04B6 B181      IN	R24,0x01
    04B7 7F88      ANDI	R24,0xF8
    04B8 3288      CPI	R24,0x28
    04B9 F011      BEQ	0x04BC
    04BA 2700      CLR	R16
    04BB C01E      RJMP	0x04DA
(0090) 	Writebyte(dataddr);	       		  	//写数据存储地址低八位
    04BC B963      OUT	0x03,R22
    04BD E884      LDI	R24,0x84
    04BE BF86      OUT	0x36,R24
(0091) 	Wait();					   		  	//等待操作完成
    04BF B626      IN	R2,0x36
    04C0 FE27      SBRS	R2,7
    04C1 CFFD      RJMP	0x04BF
(0092) 	if(TestACK()!=MT_DATA_ACK){return 0;}
    04C2 B181      IN	R24,0x01
    04C3 7F88      ANDI	R24,0xF8
    04C4 3288      CPI	R24,0x28
    04C5 F011      BEQ	0x04C8
    04C6 2700      CLR	R16
    04C7 C012      RJMP	0x04DA
(0093) 	Writebyte(rdata);		   		  	//写一字节数据
    04C8 B943      OUT	0x03,R20
    04C9 E884      LDI	R24,0x84
    04CA BF86      OUT	0x36,R24
(0094) 	Wait();					   			//等待操作完成
    04CB B626      IN	R2,0x36
    04CC FE27      SBRS	R2,7
    04CD CFFD      RJMP	0x04CB
(0095) 	if(TestACK()!=MT_DATA_ACK){return 0;}
    04CE B181      IN	R24,0x01
    04CF 7F88      ANDI	R24,0xF8
    04D0 3288      CPI	R24,0x28
    04D1 F011      BEQ	0x04D4
    04D2 2700      CLR	R16
    04D3 C006      RJMP	0x04DA
(0096) 	Stop();	  				  		    //停止
    04D4 E984      LDI	R24,0x94
    04D5 BF86      OUT	0x36,R24
(0097) 	delay(10);
    04D6 E00A      LDI	R16,0xA
    04D7 E010      LDI	R17,0
    04D8 D3B7      RCALL	_delay
(0098) 	return 1;
    04D9 E001      LDI	R16,1
    04DA D626      RCALL	pop_gset2
    04DB 9508      RET
_twi_writeNBtye:
  i                    --> R20
  j                    --> R14
  n                    --> R10
  rdata                --> R12
  dataddr              --> R22
    04DC D62C      RCALL	push_gset5
    04DD 0169      MOVW	R12,R18
    04DE 01B8      MOVW	R22,R16
    04DF 84AA      LDD	R10,Y+10
    04E0 84BB      LDD	R11,Y+11
(0099) }
(0100) //=========写N个字节数据=============
(0101) uchar twi_writeNBtye(uint dataddr,uchar rdata[],uint n)//存储地址,数据,数据个数
(0102) {
(0103)  	uchar i,j;
(0104) 	for(i=0;i<(n/PAGE_SIZE+1);i++)		//page_spase
    04E1 2744      CLR	R20
    04E2 C083      RJMP	0x0566
(0105) 	{
(0106)   	    Start();                   		//启动IIC
    04E3 EA84      LDI	R24,0xA4
    04E4 BF86      OUT	0x36,R24
(0107) 		Wait();					   		//等待操作完成
    04E5 B626      IN	R2,0x36
    04E6 FE27      SBRS	R2,7
    04E7 CFFD      RJMP	0x04E5
(0108) 		if(TestACK()!=START){return 0;}
    04E8 B181      IN	R24,0x01
    04E9 7F88      ANDI	R24,0xF8
    04EA 3088      CPI	R24,0x8
    04EB F011      BEQ	0x04EE
    04EC 2700      CLR	R16
    04ED C085      RJMP	0x0573
(0109) 		Writebyte(W_ADD_COM);	   	    //写器件地址
    04EE EA80      LDI	R24,0xA0
    04EF B983      OUT	0x03,R24
    04F0 E884      LDI	R24,0x84
    04F1 BF86      OUT	0x36,R24
(0110) 		Wait();					   		//等待操作完成
    04F2 B626      IN	R2,0x36
    04F3 FE27      SBRS	R2,7
    04F4 CFFD      RJMP	0x04F2
(0111) 		if(TestACK()!=MT_SLA_ACK){return 0;}
    04F5 B181      IN	R24,0x01
    04F6 7F88      ANDI	R24,0xF8
    04F7 3188      CPI	R24,0x18
    04F8 F011      BEQ	0x04FB
    04F9 2700      CLR	R16
    04FA C078      RJMP	0x0573
(0112) 		#if e2prom>=32
(0113) 		Writebyte(((dataddr&0xff00)>>8));//写数据存储地址高八位
    04FB 01CB      MOVW	R24,R22
    04FC 7080      ANDI	R24,0
    04FD 2F89      MOV	R24,R25
    04FE 2799      CLR	R25
    04FF B983      OUT	0x03,R24
    0500 E884      LDI	R24,0x84
    0501 BF86      OUT	0x36,R24
(0114) 		Wait();					   		//等待操作完成
    0502 B626      IN	R2,0x36
    0503 FE27      SBRS	R2,7
    0504 CFFD      RJMP	0x0502
(0115) 		if(TestACK()!=MT_DATA_ACK){return 0;}
    0505 B181      IN	R24,0x01
    0506 7F88      ANDI	R24,0xF8
    0507 3288      CPI	R24,0x28
    0508 F011      BEQ	0x050B
    0509 2700      CLR	R16
    050A C068      RJMP	0x0573
(0116) 		#endif	
(0117) 		Writebyte(dataddr);	      		//写数据存储地址低八位
    050B B963      OUT	0x03,R22
    050C E884      LDI	R24,0x84
    050D BF86      OUT	0x36,R24
(0118) 		Wait();					   		//等待操作完成
    050E B626      IN	R2,0x36
    050F FE27      SBRS	R2,7
    0510 CFFD      RJMP	0x050E
(0119) 		if(TestACK()!=MT_DATA_ACK){return 0;}
    0511 B181      IN	R24,0x01
    0512 7F88      ANDI	R24,0xF8
    0513 3288      CPI	R24,0x28
    0514 F011      BEQ	0x0517
    0515 2700      CLR	R16
    0516 C05C      RJMP	0x0573
(0120) 		if((n-PAGE_SIZE*i)>PAGE_SIZE)
    0517 E480      LDI	R24,0x40
    0518 9F84      MUL	R24,R20
    0519 0115      MOVW	R2,R10
    051A 1820      SUB	R2,R0
    051B 0831      SBC	R3,R1
    051C 2799      CLR	R25
    051D 1582      CP	R24,R2
    051E 0593      CPC	R25,R3
    051F F4E8      BCC	0x053D
(0121) 		{
(0122) 		for(j=0;j<PAGE_SIZE;j++)
    0520 24EE      CLR	R14
    0521 C017      RJMP	0x0539
(0123) 		{
(0124) 	        Writebyte(rdata[(i*PAGE_SIZE)+j]);//写一字节数据
    0522 E480      LDI	R24,0x40
    0523 9F84      MUL	R24,R20
    0524 01F0      MOVW	R30,R0
    0525 2C2E      MOV	R2,R14
    0526 2433      CLR	R3
    0527 0DE2      ADD	R30,R2
    0528 1DF3      ADC	R31,R3
    0529 0DEC      ADD	R30,R12
    052A 1DFD      ADC	R31,R13
    052B 8020      LDD	R2,Z+0
    052C B823      OUT	0x03,R2
    052D E884      LDI	R24,0x84
    052E BF86      OUT	0x36,R24
(0125) 	        Wait();					   //等待操作完成
    052F B626      IN	R2,0x36
    0530 FE27      SBRS	R2,7
    0531 CFFD      RJMP	0x052F
(0126) 			if(TestACK()!=MT_DATA_ACK){return 0;}
    0532 B181      IN	R24,0x01
    0533 7F88      ANDI	R24,0xF8
    0534 3288      CPI	R24,0x28
    0535 F011      BEQ	0x0538
    0536 2700      CLR	R16
    0537 C03B      RJMP	0x0573
    0538 94E3      INC	R14
    0539 2D8E      MOV	R24,R14
    053A 3480      CPI	R24,0x40
    053B F330      BCS	0x0522
(0127) 		}
(0128) 		}
    053C C021      RJMP	0x055E
(0129) 		else
(0130) 		{
(0131) 		for(j=0;j<(n%PAGE_SIZE);j++)
    053D 24EE      CLR	R14
    053E C017      RJMP	0x0556
(0132) 		{
(0133) 	        Writebyte(rdata[(i*PAGE_SIZE)+j]);//写一字节数据
    053F E480      LDI	R24,0x40
    0540 9F84      MUL	R24,R20
    0541 01F0      MOVW	R30,R0
    0542 2C2E      MOV	R2,R14
    0543 2433      CLR	R3
    0544 0DE2      ADD	R30,R2
    0545 1DF3      ADC	R31,R3
    0546 0DEC      ADD	R30,R12
    0547 1DFD      ADC	R31,R13
    0548 8020      LDD	R2,Z+0
    0549 B823      OUT	0x03,R2
    054A E884      LDI	R24,0x84
    054B BF86      OUT	0x36,R24
(0134) 	        Wait();					   //等待操作完成
    054C B626      IN	R2,0x36
    054D FE27      SBRS	R2,7
    054E CFFD      RJMP	0x054C
(0135) 			if(TestACK()!=MT_DATA_ACK){return 0;}
    054F B181      IN	R24,0x01
    0550 7F88      ANDI	R24,0xF8
    0551 3288      CPI	R24,0x28
    0552 F011      BEQ	0x0555
    0553 2700      CLR	R16
    0554 C01E      RJMP	0x0573
    0555 94E3      INC	R14
    0556 01C5      MOVW	R24,R10
    0557 738F      ANDI	R24,0x3F
    0558 7090      ANDI	R25,0
    0559 2C2E      MOV	R2,R14
    055A 2433      CLR	R3
    055B 1628      CP	R2,R24
    055C 0639      CPC	R3,R25
    055D F308      BCS	0x053F
(0136) 		}   
(0137) 		}
(0138) 		dataddr=dataddr+PAGE_SIZE;
    055E 5C60      SUBI	R22,0xC0
    055F 4F7F      SBCI	R23,0xFF
(0139) 		Stop();	  				  	   //停止
    0560 E984      LDI	R24,0x94
    0561 BF86      OUT	0x36,R24
(0140) 		delay(10);
    0562 E00A      LDI	R16,0xA
    0563 E010      LDI	R17,0
    0564 D32B      RCALL	_delay
    0565 9543      INC	R20
    0566 E026      LDI	R18,6
    0567 E030      LDI	R19,0
    0568 0185      MOVW	R16,R10
    0569 D609      RCALL	lsr16
    056A 01C8      MOVW	R24,R16
    056B 9601      ADIW	R24,1
    056C 2E24      MOV	R2,R20
    056D 2433      CLR	R3
    056E 1628      CP	R2,R24
    056F 0639      CPC	R3,R25
    0570 F408      BCC	0x0572
    0571 CF71      RJMP	0x04E3
(0141) 	}
(0142) 	return 1;
    0572 E001      LDI	R16,1
    0573 D593      RCALL	pop_gset5
    0574 9508      RET
_twi_readBtye:
  temp                 --> R20
  dataddr              --> R20
    0575 D59B      RCALL	push_gset1
    0576 01A8      MOVW	R20,R16
(0143) }
(0144) //==========读一个字节数据=============
(0145) uchar twi_readBtye(uint dataddr)	  //存储地址
(0146) {
(0147) 	uint  temp;
(0148) 	Start();
    0577 EA84      LDI	R24,0xA4
    0578 BF86      OUT	0x36,R24
(0149) 	Wait();					   		  //等待操作完成
    0579 B626      IN	R2,0x36
    057A FE27      SBRS	R2,7
    057B CFFD      RJMP	0x0579
(0150) 	if(TestACK()!=START){return 0;}
    057C B181      IN	R24,0x01
    057D 7F88      ANDI	R24,0xF8
    057E 3088      CPI	R24,0x8
    057F F011      BEQ	0x0582
    0580 2700      CLR	R16
    0581 C057      RJMP	0x05D9
(0151) 	Writebyte(W_ADD_COM);		   	  //写器件地址
    0582 EA80      LDI	R24,0xA0
    0583 B983      OUT	0x03,R24
    0584 E884      LDI	R24,0x84
    0585 BF86      OUT	0x36,R24
(0152) 	Wait();					  		  //等待操作完成
    0586 B626      IN	R2,0x36
    0587 FE27      SBRS	R2,7
    0588 CFFD      RJMP	0x0586
(0153) 	if

⌨️ 快捷键说明

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