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

📄 m16i2c.lst

📁 AVR程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
(0345) 
(0346) 	if( I2C_SendDat(wordAdr)==I2C_ERR )
    016D 2F04      MOV	R16,R20
    016E DF73      RCALL	_I2C_SendDat
    016F 2300      TST	R16
    0170 F411      BNE	0x0173
(0347) 		return I2C_ERR;
    0171 2700      CLR	R16
    0172 C015      RJMP	0x0188
(0348) 
(0349) 	if( I2C_Restart()==I2C_ERR )
    0173 DF11      RCALL	_I2C_Restart
    0174 2300      TST	R16
    0175 F411      BNE	0x0178
(0350) 		return I2C_ERR;
    0176 2700      CLR	R16
    0177 C010      RJMP	0x0188
(0351) 
(0352) 	if( I2C_SendRdDAdr(rdDAdr)==I2C_ERR )
    0178 810C      LDD	R16,Y+4
    0179 DF40      RCALL	_I2C_SendRdDAdr
    017A 2300      TST	R16
    017B F411      BNE	0x017E
(0353) 		return I2C_ERR;
    017C 2700      CLR	R16
    017D C00A      RJMP	0x0188
(0354) 
(0355) 	if( I2C_RcvNAckDat(pRdDat)==I2C_ERR )
    017E 810E      LDD	R16,Y+6
    017F 811F      LDD	R17,Y+7
    0180 DF6F      RCALL	_I2C_RcvNAckDat
    0181 2300      TST	R16
    0182 F411      BNE	0x0185
(0356) 		return I2C_ERR;
    0183 2700      CLR	R16
    0184 C003      RJMP	0x0188
(0357) 
(0358) 	I2C_Stop();
    0185 E984      LDI	R24,0x94
    0186 BF86      OUT	0x36,R24
(0359) 
(0360) 	return I2C_CRR;
    0187 E001      LDI	R16,1
    0188 940E0245  CALL	pop_gset2
    018A 9508      RET
_I2C_Read_:
  i                    --> R20
  num                  --> R22
  pRdDat               --> R10
  rdDAdr               --> Y+8
  wordAdr              --> R20
  wrDAdr               --> R12
    018B 940E024D  CALL	push_gset4
    018D 2F42      MOV	R20,R18
    018E 0168      MOVW	R12,R16
    018F 84AA      LDD	R10,Y+10
    0190 84BB      LDD	R11,Y+11
    0191 856C      LDD	R22,Y+12
(0361) }
(0362) /*--------------------------------------------------------------------
(0363) 函数名称:I2C读器件,读N个数据
(0364) 函数功能:
(0365) 注意事项:
(0366) 提示说明:
(0367) 输    入:wrDAdr: write device-address 写器件地址
(0368) 		 wordAdr: word address 字地址
(0369) 		 rdDAdr: read device-address 读器件地址
(0370) 		 *pRdDat: p->read data 读取数据指针
(0371) 		 num: number 读取数据个数
(0372) 返    回:
(0373) --------------------------------------------------------------------*/
(0374) bool I2C_Read_(uint16 wrDAdr,uint8 wordAdr,
(0375) 			   uint8 rdDAdr,uint8 *pRdDat,uint8 num)
(0376) {
(0377)  	uint8 i;
(0378) 	
(0379) 	if( I2C_Start()==I2C_ERR )
    0192 DEE5      RCALL	_I2C_Start
    0193 2300      TST	R16
    0194 F411      BNE	0x0197
(0380) 		return I2C_ERR;
    0195 2700      CLR	R16
    0196 C033      RJMP	0x01CA
(0381) 
(0382) 	if( I2C_SendWrDAdr_(wrDAdr)==I2C_ERR )
    0197 0186      MOVW	R16,R12
    0198 DF07      RCALL	_I2C_SendWrDAdr_
    0199 2300      TST	R16
    019A F411      BNE	0x019D
(0383) 		return I2C_ERR;
    019B 2700      CLR	R16
    019C C02D      RJMP	0x01CA
(0384) 
(0385) 	if( I2C_SendDat(wordAdr)==I2C_ERR )
    019D 2F04      MOV	R16,R20
    019E DF43      RCALL	_I2C_SendDat
    019F 2300      TST	R16
    01A0 F411      BNE	0x01A3
(0386) 		return I2C_ERR;
    01A1 2700      CLR	R16
    01A2 C027      RJMP	0x01CA
(0387) 
(0388) 	if( I2C_Restart()==I2C_ERR )
    01A3 DEE1      RCALL	_I2C_Restart
    01A4 2300      TST	R16
    01A5 F411      BNE	0x01A8
(0389) 		return I2C_ERR;
    01A6 2700      CLR	R16
    01A7 C022      RJMP	0x01CA
(0390) 
(0391) 	if( I2C_SendRdDAdr(rdDAdr)==I2C_ERR )
    01A8 8508      LDD	R16,Y+8
    01A9 DF10      RCALL	_I2C_SendRdDAdr
    01AA 2300      TST	R16
    01AB F411      BNE	0x01AE
(0392) 		return I2C_ERR;
    01AC 2700      CLR	R16
    01AD C01C      RJMP	0x01CA
(0393) 
(0394) 	for(i=0;i<num-1;i++)
    01AE 2744      CLR	R20
    01AF C00A      RJMP	0x01BA
(0395) 		if( I2C_RcvAckDat(pRdDat+i)==I2C_ERR )
    01B0 2F04      MOV	R16,R20
    01B1 2711      CLR	R17
    01B2 0D0A      ADD	R16,R10
    01B3 1D1B      ADC	R17,R11
    01B4 DF4B      RCALL	_I2C_RcvAckDat
    01B5 2300      TST	R16
    01B6 F411      BNE	0x01B9
(0396) 			return I2C_ERR;
    01B7 2700      CLR	R16
    01B8 C011      RJMP	0x01CA
    01B9 9543      INC	R20
    01BA 2F86      MOV	R24,R22
    01BB 5081      SUBI	R24,1
    01BC 1748      CP	R20,R24
    01BD F390      BCS	0x01B0
(0397) 	
(0398) 	if( I2C_RcvNAckDat(pRdDat+i)==I2C_ERR )
    01BE 2F04      MOV	R16,R20
    01BF 2711      CLR	R17
    01C0 0D0A      ADD	R16,R10
    01C1 1D1B      ADC	R17,R11
    01C2 DF2D      RCALL	_I2C_RcvNAckDat
    01C3 2300      TST	R16
    01C4 F411      BNE	0x01C7
(0399) 			return I2C_ERR;
    01C5 2700      CLR	R16
    01C6 C003      RJMP	0x01CA
(0400) 
(0401) 	I2C_Stop();
    01C7 E984      LDI	R24,0x94
    01C8 BF86      OUT	0x36,R24
(0402) 	
(0403) 	return I2C_CRR;
    01C9 E001      LDI	R16,1
    01CA 940E0248  CALL	pop_gset4
    01CC 9508      RET
FILE: F:\job\M16学习板\I2C读写24C02(实验十)\M16I2CRW24C02.c
(0001) /*******************************************************************
(0002)                       实验十
(0003) 实验名称: I2C读写24C02实验
(0004) 实验目的: 学习AVR单片机的TWI功能
(0005) 实验现象: 先在24C02中写入一段数据,然后断电,再送电,将EEPROM中的数据发
(0006) 		  送给PC机
(0007) 环	  境: ICCAVR6.31A
(0008) 设 计 者: shinea8868
(0009) 说    明: 部分程序原型源自网络,经本人修改调试可用,请尊重知识产权,如
(0010) 	  	  作商业用途请保留本段文字
(0011) 完成日期: 2007年4月10日
(0012) *******************************************************************/
(0013) #include <iom16v.h>
(0014) #include <macros.h>
(0015) #include "..\ICC_H\SOFTWARE.H"
(0016) #include "..\ICC_H\I2C.H"
(0017) 
(0018) //设定读写地址
(0019) #define WADD24C02 0xa0	//写字节命令及器件地址(根据地址实际情况改变), 1010 A2 A1 A0 0
(0020) #define RADD24C02 0xa1	//读命令字节及器件地址(根据地址实际情况改变), 1010 A2 A1 A0 1
(0021) /*-----------------------------------------------------------------
(0022) 函数名称: void Uart0Init(void) 
(0023) 函数功能: 串口初始化
(0024) 		  波特率 600 0.2% 字符长度 8bit 无奇偶校验
(0025) 参    数: 
(0026) 返 回 值: 无
(0027) -----------------------------------------------------------------*/
(0028) void Uart0Init(void)
(0029) {
(0030)  	UCSRB = 0x00; 					//关串口
_Uart0Init:
    01CD 2422      CLR	R2
    01CE B82A      OUT	0x0A,R2
(0031)  	UCSRA = 0x02;					//倍速模式   M16中文P151
    01CF E082      LDI	R24,2
    01D0 B98B      OUT	0x0B,R24
(0032)  	UCSRC = BIT(URSEL) | 0x06;		//写UCSRC寄存器,设定8个bit
    01D1 E886      LDI	R24,0x86
    01D2 BD80      OUT	0x20,R24
(0033)  	UBRR  = 12;	 	  	   		//设定串口波特率为600
    01D3 E08C      LDI	R24,0xC
    01D4 B989      OUT	0x09,R24
(0034)  	UCSRB = 0x98;					//开串口
    01D5 E988      LDI	R24,0x98
    01D6 B98A      OUT	0x0A,R24
    01D7 9508      RET
_UartRecvData:
  temp1                --> R16
    01D8 930A      ST	R16,-Y
    01D9 B70F      IN	R16,0x3F
    01DA 930A      ST	R16,-Y
(0035) }
(0036) /*-----------------------------------------------------------------
(0037) 函数名称: void UartRecvData(void)
(0038) 函数功能: 
(0039) 参    数: 
(0040) 返 回 值: 无
(0041) -----------------------------------------------------------------*/
(0042) #pragma interrupt_handler UartRecvData:12
(0043) void UartRecvData(void)
(0044) {
(0045)  	uchar temp1;
(0046)  	temp1 = UDR;
    01DB B10C      IN	R16,0x0C
    01DC 9109      LD	R16,Y+
    01DD BF0F      OUT	0x3F,R16
    01DE 9109      LD	R16,Y+
    01DF 9518      RETI
_UartTransmitData:
  i                    --> R20
  len                  --> R18
  SendData             --> R16
    01E0 940E0253  CALL	push_gset1
(0047) }
(0048) /*-----------------------------------------------------------------
(0049) 函数名称: void UartTransmitData(uchar *SendData, uchar len)
(0050) 函数功能: 发送字符串
(0051) 参    数: SendData  发送字符串的首地址
(0052) 	  	  len		发送字符串的长度
(0053) 返 回 值: 无
(0054) -----------------------------------------------------------------*/
(0055) void UartTransmitData(uchar *SendData, uint len)
(0056) {
(0057)  	uint i;
(0058) 	for( i = 0; i < len; i++)
    01E2 2744      CLR	R20
    01E3 2755      CLR	R21
    01E4 C009      RJMP	0x01EE
(0059) 	{
(0060)   		while(!(UCSRA&0x20));  				//判断数据寄存器是否为空
    01E5 9B5D      SBIS	0x0B,5
    01E6 CFFE      RJMP	0x01E5
(0061) 			UDR = SendData[i];
    01E7 01FA      MOVW	R30,R20
    01E8 0FE0      ADD	R30,R16
    01E9 1FF1      ADC	R31,R17
    01EA 8020      LDD	R2,Z+0
    01EB B82C      OUT	0x0C,R2
    01EC 5F4F      SUBI	R20,0xFF
    01ED 4F5F      SBCI	R21,0xFF
    01EE 1742      CP	R20,R18
    01EF 0753      CPC	R21,R19
    01F0 F3A0      BCS	0x01E5
    01F1 940E0256  CALL	pop_gset1
    01F3 9508      RET
(0062) 	}
(0063) }
(0064) /*-----------------------------------------------------------------
(0065) 函数名称: void InitDevices(void) 
(0066) 函数功能: 初始化各种信息
(0067) 参    数: 
(0068) 返 回 值: 无
(0069) -----------------------------------------------------------------*/
(0070) void InitDevices(void)
(0071) {
(0072)  	CLI(); 			  					//关全部中断
_InitDevices:
    01F4 94F8      BCLR	7
(0073)  	Uart0Init();
    01F5 DFD7      RCALL	_Uart0Init
(0074)  	SEI();   	 	   					//开全中断
    01F6 9478      BSET	7
    01F7 9508      RET
_main:
  temp2                --> Y+5
  j                    --> R20
  i                    --> R22
    01F8 972D      SBIW	R28,0xD
(0075) }
(0076) 
(0077) void main(void)
(0078) {
(0079)  	
(0080)  	/*第一次写程序*/
(0081) /* 	uchar temp[] = "abcdefgh";			//上电初始化24C02中的数据,
(0082) 	I2C_Write_(WADD24C02,0,temp,8);		//断电后屏蔽初始化程序,打开下面的程序*/
(0083) 	uchar i,temp2[8];
(0084) 	uint j;
(0085) 	j = 2000;
    01F9 ED40      LDI	R20,0xD0
    01FA E057      LDI	R21,7
(0086) 	InitDevices();
    01FB DFF8      RCALL	_InitDevices
(0087) 	while(j --);
    01FC 011A      MOVW	R2,R20
    01FD 5041      SUBI	R20,1
    01FE 4050      SBCI	R21,0
    01FF 2022      TST	R2
    0200 F7D9      BNE	0x01FC
    0201 2033      TST	R3
    0202 F7C9      BNE	0x01FC
(0088) 	{
(0089) 	 	i = 167;
    0203 EA67      LDI	R22,0xA7
(0090) 		while(i--);
    0204 2E26      MOV	R2,R22
    0205 2433      CLR	R3
    0206 5061      SUBI	R22,1
    0207 2022      TST	R2
    0208 F7D9      BNE	0x0204
(0091) 	}
(0092) 	I2C_Read_(WADD24C02,0x00,RADD24C02,temp2,8);
    0209 E088      LDI	R24,0x8
    020A 838C      STD	Y+4,R24
    020B 01CE      MOVW	R24,R28
    020C 9605      ADIW	R24,5
    020D 839B      STD	Y+3,R25
    020E 838A      STD	Y+2,R24
    020F EA81      LDI	R24,0xA1
    0210 8388      STD	Y+0,R24
    0211 2722      CLR	R18
    0212 EA00      LDI	R16,0xA0
    0213 E010      LDI	R17,0
    0214 DF76      RCALL	_I2C_Read_
(0093) 	j = 2000;
    0215 ED40      LDI	R20,0xD0
    0216 E057      LDI	R21,7
(0094) 	while(j --);
    0217 011A      MOVW	R2,R20
    0218 5041      SUBI	R20,1
    0219 4050      SBCI	R21,0
    021A 2022      TST	R2
    021B F7D9      BNE	0x0217
    021C 2033      TST	R3
    021D F7C9      BNE	0x0217
(0095) 	{
(0096) 	 	i = 167;
    021E EA67      LDI	R22,0xA7
(0097) 		while(i--);
    021F 2E26      MOV	R2,R22
    0220 2433      CLR	R3
    0221 5061      SUBI	R22,1
    0222 2022      TST	R2
    0223 F7D9      BNE	0x021F
(0098) 	}
(0099) 	UartTransmitData(temp2, 8);
    0224 E028      LDI	R18,0x8
    0225 E030      LDI	R19,0
    0226 018E      MOVW	R16,R28
    0227 5F0B      SUBI	R16,0xFB
    0228 4F1F      SBCI	R17,0xFF
    0229 DFB6      RCALL	_UartTransmitData
(0100) 	while(1);
FILE: <library>
    022A CFFF      RJMP	0x022A
    022B 962D      ADIW	R28,0xD
    022C 9508      RET
mod8u:
    022D 9468      BSET	6
    022E C001      RJMP	xdiv8u
div8u:
    022F 94E8      BCLR	6
xdiv8u:
    0230 932A      ST	R18,-Y
    0231 92FA      ST	R15,-Y
    0232 92EA      ST	R14,-Y
    0233 24FF      CLR	R15
    0234 24EE      CLR	R14
    0235 E120      LDI	R18,0x10
    0236 0F00      LSL	R16
    0237 1CFF      ROL	R15
    0238 1CEE      ROL	R14
    0239 16E1      CP	R14,R17
    023A F010      BCS	0x023D
    023B 1AE1      SUB	R14,R17
    023C 9503      INC	R16
    023D 952A      DEC	R18
    023E F7B9      BNE	0x0236
    023F F40E      BRTC	0x0241
    0240 2D0E      MOV	R16,R14
    0241 90E9      LD	R14,Y+
    0242 90F9      LD	R15,Y+
    0243 9129      LD	R18,Y+
    0244 9508      RET
pop_gset2:
    0245 E0E2      LDI	R30,2
    0246 940C0257  JMP	pop
pop_gset4:
    0248 E0E8      LDI	R30,0x8
    0249 940C0257  JMP	pop
push_gset5:
    024B 92FA      ST	R15,-Y
    024C 92EA      ST	R14,-Y
push_gset4:
    024D 92DA      ST	R13,-Y
    024E 92CA      ST	R12,-Y
push_gset3:
    024F 92BA      ST	R11,-Y
    0250 92AA      ST	R10,-Y
push_gset2:
    0251 937A      ST	R23,-Y
    0252 936A      ST	R22,-Y
push_gset1:
    0253 935A      ST	R21,-Y
    0254 934A      ST	R20,-Y
    0255 9508      RET
pop_gset1:
    0256 E0E1      LDI	R30,1
pop:
    0257 9149      LD	R20,Y+
    0258 9159      LD	R21,Y+
    0259 FDE0      SBRC	R30,0
    025A 9508      RET
    025B 9169      LD	R22,Y+
    025C 9179      LD	R23,Y+
    025D FDE1      SBRC	R30,1
    025E 9508      RET
    025F 90A9      LD	R10,Y+
    0260 90B9      LD	R11,Y+
    0261 FDE2      SBRC	R30,2
    0262 9508      RET
    0263 90C9      LD	R12,Y+
    0264 90D9      LD	R13,Y+
    0265 FDE3      SBRC	R30,3
    0266 9508      RET
    0267 90E9      LD	R14,Y+
    0268 90F9      LD	R15,Y+
    0269 9508      RET

⌨️ 快捷键说明

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