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

📄 m16i2c.lst

📁 AVR程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
(0147) 	return I2C_CRR;
    0090 E001      LDI	R16,1
    0091 9508      RET
(0148) }
(0149) /*--------------------------------------------------------------------
(0150) 函数名称:发送 7位 器件写地址: XXXX XXX0
(0151) 函数功能:
(0152) 注意事项:
(0153) 提示说明:
(0154) 输    入:
(0155) 返    回:
(0156) --------------------------------------------------------------------*/
(0157) bool I2C_SendWrDAdr(uint8 wrDAdr)	
(0158) {
(0159) 	I2CSendByte(wrDAdr);			//设置 器件写地址
_I2C_SendWrDAdr:
  wrDAdr               --> R16
    0092 B903      OUT	0x03,R16
    0093 E884      LDI	R24,0x84
    0094 BF86      OUT	0x36,R24
(0160) 	I2CWaitAck();
    0095 B626      IN	R2,0x36
    0096 FE27      SBRS	R2,7
    0097 CFFD      RJMP	0x0095
(0161) 	if( I2CChkAck()!=I2C_MT_SLA_ACK )  
    0098 B181      IN	R24,0x01
    0099 7F88      ANDI	R24,0xF8
    009A 3188      CPI	R24,0x18
    009B F011      BEQ	0x009E
(0162) 		return I2C_ERR;
    009C 2700      CLR	R16
    009D C001      RJMP	0x009F
(0163) 	return I2C_CRR;		
    009E E001      LDI	R16,1
    009F 9508      RET
_I2C_SendWrDAdr_:
  wrDAdr               --> R20
    00A0 940E0253  CALL	push_gset1
    00A2 01A8      MOVW	R20,R16
(0164) }
(0165) /*--------------------------------------------------------------------
(0166) 函数名称:发送 10位 器件写地址: 1111 0XX0, XXXX XXXX
(0167) 函数功能:
(0168) 注意事项:
(0169) 提示说明:兼容 发送 7位 器件写地址: XXXX XXX0
(0170) 输    入:
(0171) 返    回:
(0172) --------------------------------------------------------------------*/
(0173) bool I2C_SendWrDAdr_(uint16 wrDAdr)	
(0174) {
(0175) 	if( wrDAdr&0xF000 == 0xF000 )	//判断是否为 10位 器件地址
    00A3 FF40      SBRS	R20,0
    00A4 C00B      RJMP	0x00B0
(0176) 		if( I2C_SendWrDAdr( (uint8)wrDAdr>>8 )==I2C_ERR )	//设置 (高位)器件写地址
    00A5 2F04      MOV	R16,R20
    00A6 2711      CLR	R17
    00A7 2F01      MOV	R16,R17
    00A8 2711      CLR	R17
    00A9 FD07      SBRC	R16,7
    00AA 9510      COM	R17
    00AB DFE6      RCALL	_I2C_SendWrDAdr
    00AC 2300      TST	R16
    00AD F411      BNE	0x00B0
(0177) 			return I2C_ERR;
    00AE 2700      CLR	R16
    00AF C007      RJMP	0x00B7
(0178) 	if( I2C_SendWrDAdr( (uint8)wrDAdr )==I2C_ERR )	//设置 (低位)器件写地址
    00B0 2F04      MOV	R16,R20
    00B1 DFE0      RCALL	_I2C_SendWrDAdr
    00B2 2300      TST	R16
    00B3 F411      BNE	0x00B6
(0179) 		return I2C_ERR;
    00B4 2700      CLR	R16
    00B5 C001      RJMP	0x00B7
(0180) 	return I2C_CRR;
    00B6 E001      LDI	R16,1
    00B7 940E0256  CALL	pop_gset1
    00B9 9508      RET
(0181) }
(0182) /*--------------------------------------------------------------------
(0183) 函数名称:发送 7位 器件读地址: XXXX XXX1
(0184) 函数功能:
(0185) 注意事项:
(0186) 提示说明:
(0187) 输    入:
(0188) 返    回:
(0189) --------------------------------------------------------------------*/
(0190) bool I2C_SendRdDAdr(uint8 rdDAdr)	
(0191) {
(0192) 	I2CSendByte(rdDAdr);			//设置 器件读地址
_I2C_SendRdDAdr:
  rdDAdr               --> R16
    00BA B903      OUT	0x03,R16
    00BB E884      LDI	R24,0x84
    00BC BF86      OUT	0x36,R24
(0193) 	I2CWaitAck();
    00BD B626      IN	R2,0x36
    00BE FE27      SBRS	R2,7
    00BF CFFD      RJMP	0x00BD
(0194) 	if( I2CChkAck()!=I2C_MR_SLA_ACK )  
    00C0 B181      IN	R24,0x01
    00C1 7F88      ANDI	R24,0xF8
    00C2 3480      CPI	R24,0x40
    00C3 F011      BEQ	0x00C6
(0195) 		return I2C_ERR;
    00C4 2700      CLR	R16
    00C5 C001      RJMP	0x00C7
(0196) 	return I2C_CRR;	
    00C6 E001      LDI	R16,1
    00C7 9508      RET
_I2C_SendRdDAdr_:
  rdDAdr               --> R20
    00C8 940E0253  CALL	push_gset1
    00CA 2F40      MOV	R20,R16
(0197) }
(0198) /*--------------------------------------------------------------------
(0199) 函数名称:发送 10位 器件读地址: 1111 0XX0, XXXX XXXX
(0200) 函数功能:
(0201) 注意事项:
(0202) 提示说明:
(0203) 输    入:
(0204) 返    回:
(0205) --------------------------------------------------------------------*/
(0206) bool I2C_SendRdDAdr_(uint8 rdDAdr)	
(0207) {
(0208) 	if( rdDAdr&0xF000 == 0xF000 )	//判断是否为 10位 器件地址
    00CB FF40      SBRS	R20,0
    00CC C00B      RJMP	0x00D8
(0209) 		if( I2C_SendWrDAdr( (uint8)rdDAdr>>8 )==I2C_ERR )	//设置 (高位)器件读地址
    00CD 2F04      MOV	R16,R20
    00CE 2711      CLR	R17
    00CF 2F01      MOV	R16,R17
    00D0 2711      CLR	R17
    00D1 FD07      SBRC	R16,7
    00D2 9510      COM	R17
    00D3 DFBE      RCALL	_I2C_SendWrDAdr
    00D4 2300      TST	R16
    00D5 F411      BNE	0x00D8
(0210) 			return I2C_ERR;
    00D6 2700      CLR	R16
    00D7 C007      RJMP	0x00DF
(0211) 	if( I2C_SendWrDAdr( (uint8)rdDAdr )==I2C_ERR )	//设置 (低位)器件读地址
    00D8 2F04      MOV	R16,R20
    00D9 DFB8      RCALL	_I2C_SendWrDAdr
    00DA 2300      TST	R16
    00DB F411      BNE	0x00DE
(0212) 		return I2C_ERR;
    00DC 2700      CLR	R16
    00DD C001      RJMP	0x00DF
(0213) 	return I2C_CRR;
    00DE E001      LDI	R16,1
    00DF 940E0256  CALL	pop_gset1
    00E1 9508      RET
(0214) }
(0215) /*--------------------------------------------------------------------
(0216) 函数名称:I2C发送数据
(0217) 函数功能:
(0218) 注意事项:
(0219) 提示说明:
(0220) 输    入:
(0221) 返    回:
(0222) --------------------------------------------------------------------*/
(0223) bool I2C_SendDat(uint8 configDat)	
(0224) {
(0225) 	I2CSendByte(configDat);			
_I2C_SendDat:
  configDat            --> R16
    00E2 B903      OUT	0x03,R16
    00E3 E884      LDI	R24,0x84
    00E4 BF86      OUT	0x36,R24
(0226) 	I2CWaitAck();
    00E5 B626      IN	R2,0x36
    00E6 FE27      SBRS	R2,7
    00E7 CFFD      RJMP	0x00E5
(0227) 	if( I2CChkAck()!=I2C_MT_DATA_ACK ) 
    00E8 B181      IN	R24,0x01
    00E9 7F88      ANDI	R24,0xF8
    00EA 3288      CPI	R24,0x28
    00EB F011      BEQ	0x00EE
(0228) 		return I2C_ERR;
    00EC 2700      CLR	R16
    00ED C001      RJMP	0x00EF
(0229) 	return I2C_CRR;	
    00EE E001      LDI	R16,1
    00EF 9508      RET
(0230) }
(0231) /*--------------------------------------------------------------------
(0232) 函数名称:I2C接收数据且不产生应答
(0233) 函数功能:
(0234) 注意事项:
(0235) 提示说明:
(0236) 输    入:
(0237) 返    回:
(0238) --------------------------------------------------------------------*/
(0239) bool I2C_RcvNAckDat(uint8 *pRdDat)	
(0240) {
(0241) 	I2CRcvNckByte();
_I2C_RcvNAckDat:
  pRdDat               --> R16
    00F0 E884      LDI	R24,0x84
    00F1 BF86      OUT	0x36,R24
(0242) 	I2CWaitAck();
    00F2 B626      IN	R2,0x36
    00F3 FE27      SBRS	R2,7
    00F4 CFFD      RJMP	0x00F2
(0243) 	if( I2CChkAck()!=I2C_MR_DATA_NACK )
    00F5 B181      IN	R24,0x01
    00F6 7F88      ANDI	R24,0xF8
    00F7 3588      CPI	R24,0x58
    00F8 F011      BEQ	0x00FB
(0244) 		return I2C_ERR;
    00F9 2700      CLR	R16
    00FA C004      RJMP	0x00FF
(0245) 	*pRdDat=TWDR;
    00FB B023      IN	R2,0x03
    00FC 01F8      MOVW	R30,R16
    00FD 8220      STD	Z+0,R2
(0246) 	return I2C_CRR;
    00FE E001      LDI	R16,1
    00FF 9508      RET
(0247) }
(0248) /*--------------------------------------------------------------------
(0249) 函数名称:I2C接收数据且产生应答
(0250) 函数功能:
(0251) 注意事项:
(0252) 提示说明:
(0253) 输    入:
(0254) 返    回:
(0255) --------------------------------------------------------------------*/
(0256) bool I2C_RcvAckDat(uint8 *pRdDat)	
(0257) {
(0258) 	I2CRcvAckByte();					
_I2C_RcvAckDat:
  pRdDat               --> R16
    0100 EC84      LDI	R24,0xC4
    0101 BF86      OUT	0x36,R24
(0259) 	I2CWaitAck();
    0102 B626      IN	R2,0x36
    0103 FE27      SBRS	R2,7
    0104 CFFD      RJMP	0x0102
(0260) 	if( I2CChkAck()!=I2C_MR_DATA_ACK )
    0105 B181      IN	R24,0x01
    0106 7F88      ANDI	R24,0xF8
    0107 3580      CPI	R24,0x50
    0108 F011      BEQ	0x010B
(0261) 		return I2C_ERR;
    0109 2700      CLR	R16
    010A C004      RJMP	0x010F
(0262) 	*pRdDat=TWDR;
    010B B023      IN	R2,0x03
    010C 01F8      MOVW	R30,R16
    010D 8220      STD	Z+0,R2
(0263) 	return I2C_CRR;
    010E E001      LDI	R16,1
    010F 9508      RET
_I2C_Write:
  dat                  --> Y+4
  wordAdr              --> R20
  wrDAdr               --> R22
    0110 940E0251  CALL	push_gset2
    0112 2F42      MOV	R20,R18
    0113 01B8      MOVW	R22,R16
(0264) }
(0265) /*--------------------------------------------------------------------
(0266) 函数名称:I2C写器件,写一个数据
(0267) 函数功能:
(0268) 注意事项:
(0269) 提示说明:
(0270) 输    入:wrDAdr: write device-address 写器件地址
(0271) 		 wordAdr: word address 字地址
(0272) 		 dat: data 数据
(0273) 返    回:
(0274) --------------------------------------------------------------------*/
(0275) bool I2C_Write(uint16 wrDAdr,uint8 wordAdr,uint8 dat)
(0276) {
(0277) 	if( I2C_Start()==I2C_ERR )
    0114 DF63      RCALL	_I2C_Start
    0115 2300      TST	R16
    0116 F411      BNE	0x0119
(0278) 		return I2C_ERR;
    0117 2700      CLR	R16
    0118 C015      RJMP	0x012E
(0279) 
(0280) 	if( I2C_SendWrDAdr_(wrDAdr)==I2C_ERR )
    0119 018B      MOVW	R16,R22
    011A DF85      RCALL	_I2C_SendWrDAdr_
    011B 2300      TST	R16
    011C F411      BNE	0x011F
(0281) 		return I2C_ERR;
    011D 2700      CLR	R16
    011E C00F      RJMP	0x012E
(0282) 
(0283) 	if( I2C_SendDat(wordAdr)==I2C_ERR )
    011F 2F04      MOV	R16,R20
    0120 DFC1      RCALL	_I2C_SendDat
    0121 2300      TST	R16
    0122 F411      BNE	0x0125
(0284) 		return I2C_ERR;
    0123 2700      CLR	R16
    0124 C009      RJMP	0x012E
(0285) 
(0286) 	if( I2C_SendDat(dat)==I2C_ERR )
    0125 810C      LDD	R16,Y+4
    0126 DFBB      RCALL	_I2C_SendDat
    0127 2300      TST	R16
    0128 F411      BNE	0x012B
(0287) 		return I2C_ERR;
    0129 2700      CLR	R16
    012A C003      RJMP	0x012E
(0288) 
(0289) 	I2C_Stop();
    012B E984      LDI	R24,0x94
    012C BF86      OUT	0x36,R24
(0290) 
(0291) 	return I2C_CRR;
    012D E001      LDI	R16,1
    012E 940E0245  CALL	pop_gset2
    0130 9508      RET
_I2C_Write_:
  i                    --> R20
  num                  --> R22
  pWrDat               --> R10
  wordAdr              --> R20
  wrDAdr               --> R12
    0131 940E024D  CALL	push_gset4
    0133 2F42      MOV	R20,R18
    0134 0168      MOVW	R12,R16
    0135 84A8      LDD	R10,Y+8
    0136 84B9      LDD	R11,Y+9
    0137 856A      LDD	R22,Y+10
(0292) }
(0293) /*--------------------------------------------------------------------
(0294) 函数名称:I2C写器件,写N个数据
(0295) 函数功能:
(0296) 注意事项:
(0297) 提示说明:
(0298) 输    入:wrDAdr: write device-address 写器件地址
(0299) 		 wordAdr: word address 字地址
(0300) 		 *pWrDat: p->write data 写入数据指针
(0301) 		 num: number 写入数据个数
(0302) 返    回:
(0303) --------------------------------------------------------------------*/
(0304) bool I2C_Write_(uint16 wrDAdr,uint8 wordAdr,uint8 *pWrDat,uint8 num)
(0305) {
(0306)  	uchar i;
(0307)  	
(0308)  	if( I2C_Start()==I2C_ERR )
    0138 DF3F      RCALL	_I2C_Start
    0139 2300      TST	R16
    013A F411      BNE	0x013D
(0309) 		return I2C_ERR;
    013B 2700      CLR	R16
    013C C01E      RJMP	0x015B
(0310) 
(0311) 	if( I2C_SendWrDAdr_(wrDAdr)==I2C_ERR )
    013D 0186      MOVW	R16,R12
    013E DF61      RCALL	_I2C_SendWrDAdr_
    013F 2300      TST	R16
    0140 F411      BNE	0x0143
(0312) 		return I2C_ERR;
    0141 2700      CLR	R16
    0142 C018      RJMP	0x015B
(0313) 
(0314) 	if( I2C_SendDat(wordAdr)==I2C_ERR )
    0143 2F04      MOV	R16,R20
    0144 DF9D      RCALL	_I2C_SendDat
    0145 2300      TST	R16
    0146 F411      BNE	0x0149
(0315) 		return I2C_ERR;
    0147 2700      CLR	R16
    0148 C012      RJMP	0x015B
(0316) 	for( i = 0; i < num; i++)
    0149 2744      CLR	R20
    014A C00B      RJMP	0x0156
(0317) 	{
(0318) 	 	if( I2C_SendDat(pWrDat[i])==I2C_ERR )
    014B 2FE4      MOV	R30,R20
    014C 27FF      CLR	R31
    014D 0DEA      ADD	R30,R10
    014E 1DFB      ADC	R31,R11
    014F 8100      LDD	R16,Z+0
    0150 DF91      RCALL	_I2C_SendDat
    0151 2300      TST	R16
    0152 F411      BNE	0x0155
(0319) 			return I2C_ERR;
    0153 2700      CLR	R16
    0154 C006      RJMP	0x015B
    0155 9543      INC	R20
    0156 1746      CP	R20,R22
    0157 F398      BCS	0x014B
(0320) 	}
(0321) 
(0322) 	I2C_Stop();
    0158 E984      LDI	R24,0x94
    0159 BF86      OUT	0x36,R24
(0323) 
(0324) 	return I2C_CRR;
    015A E001      LDI	R16,1
    015B 940E0248  CALL	pop_gset4
    015D 9508      RET
_I2C_Read:
  pRdDat               --> Y+6
  rdDAdr               --> Y+4
  wordAdr              --> R20
  wrDAdr               --> R22
    015E 940E0251  CALL	push_gset2
    0160 2F42      MOV	R20,R18
    0161 01B8      MOVW	R22,R16
(0325) } 
(0326) /*--------------------------------------------------------------------
(0327) 函数名称:I2C读器件,读一个数据
(0328) 函数功能:
(0329) 注意事项:
(0330) 提示说明:
(0331) 输    入:wrDAdr: write device-address 写器件地址
(0332) 		 wordAdr: word address 字地址
(0333) 		 rdDAdr: read device-address 读器件地址
(0334) 		 *pRdDat: p->read data 读取数据指针
(0335) 返    回:
(0336) --------------------------------------------------------------------*/
(0337) bool I2C_Read(uint16 wrDAdr,uint8 wordAdr,
(0338) 			  uint8 rdDAdr,uint8 *pRdDat)
(0339) {
(0340) 	if( I2C_Start()==I2C_ERR )
    0162 DF15      RCALL	_I2C_Start
    0163 2300      TST	R16
    0164 F411      BNE	0x0167
(0341) 		return I2C_ERR;
    0165 2700      CLR	R16
    0166 C021      RJMP	0x0188
(0342) 
(0343) 	if( I2C_SendWrDAdr_(wrDAdr)==I2C_ERR )
    0167 018B      MOVW	R16,R22
    0168 DF37      RCALL	_I2C_SendWrDAdr_
    0169 2300      TST	R16
    016A F411      BNE	0x016D
(0344) 		return I2C_ERR;
    016B 2700      CLR	R16
    016C C01B      RJMP	0x0188

⌨️ 快捷键说明

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