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

📄 24c01a.lst

📁 AVR 24c02 f
💻 LST
📖 第 1 页 / 共 3 页
字号:
  data                 --> R20
    00E7 940E02A0  CALL	push_gset1
    00E9 2F40      MOV	R20,R16
(0214) }
(0215) /*--------------------------------------------------------------------
(0216) 函数名称:I2C_SendDat
(0217) 函数功能:I2C发送数据
(0218) 注意事项:
(0219) 提示说明:
(0220) 输    入:待发送的字节数据
(0221) 返    回:运行状况  I2C_ERR :错误   I2C_CRR :正确
(0222) --------------------------------------------------------------------*/
(0223) unsigned char I2C_SendDat(unsigned char data) 
(0224) {
(0225)  I2C_SendByte(data);   
    00EA 2F04      MOV	R16,R20
    00EB DF7D      RCALL	_I2C_SendByte
(0226)  if(!I2C_WaitINT()) return I2C_ERR;
    00EC DF6C      RCALL	_I2C_WaitINT
    00ED 2300      TST	R16
    00EE F411      BNE	0x00F1
    00EF 2700      CLR	R16
    00F0 C007      RJMP	0x00F8
(0227)  if( I2C_STATUS!=I2C_MT_DATA_ACK ) 
    00F1 B181      IN	R24,0x01
    00F2 7F88      ANDI	R24,0xF8
    00F3 3288      CPI	R24,0x28
    00F4 F011      BEQ	0x00F7
(0228)   return I2C_ERR;
    00F5 2700      CLR	R16
    00F6 C001      RJMP	0x00F8
(0229)  return I2C_CRR; 
    00F7 E001      LDI	R16,1
    00F8 940E02A3  CALL	pop_gset1
    00FA 9508      RET
_I2C_RcvNAckDat:
  pRdDat               --> R20
    00FB 940E02A0  CALL	push_gset1
    00FD 01A8      MOVW	R20,R16
(0230) }
(0231) /*--------------------------------------------------------------------
(0232) 函数名称:I2C_RcvNAckDat
(0233) 函数功能:I2C接收数据且不产生应答
(0234) 注意事项:
(0235) 提示说明:
(0236) 输    入:接收数据存储空间指针
(0237) 返    回:运行状况  I2C_ERR :错误   I2C_CRR :正确
(0238) --------------------------------------------------------------------*/
(0239) unsigned char I2C_RcvNAckDat(unsigned char *pRdDat) 
(0240) {
(0241)  I2CRcvNckByte();
    00FE E884      LDI	R24,0x84
    00FF BF86      OUT	0x36,R24
(0242)  if(!I2C_WaitINT()) return I2C_ERR;
    0100 DF58      RCALL	_I2C_WaitINT
    0101 2300      TST	R16
    0102 F411      BNE	0x0105
    0103 2700      CLR	R16
    0104 C00A      RJMP	0x010F
(0243)  if( I2C_STATUS!=I2C_MR_DATA_NACK )
    0105 B181      IN	R24,0x01
    0106 7F88      ANDI	R24,0xF8
    0107 3588      CPI	R24,0x58
    0108 F011      BEQ	0x010B
(0244)   return I2C_ERR;
    0109 2700      CLR	R16
    010A C004      RJMP	0x010F
(0245)  *pRdDat=TWDR;
    010B B023      IN	R2,0x03
    010C 01FA      MOVW	R30,R20
    010D 8220      STD	Z+0,R2
(0246)  return I2C_CRR;
    010E E001      LDI	R16,1
    010F 940E02A3  CALL	pop_gset1
    0111 9508      RET
_I2C_RcvAckDat:
  pRdDat               --> R20
    0112 940E02A0  CALL	push_gset1
    0114 01A8      MOVW	R20,R16
(0247) }
(0248) /*--------------------------------------------------------------------
(0249) 函数名称:I2C_RcvAckDat
(0250) 函数功能:I2C接收数据且产生应答
(0251) 注意事项:
(0252) 提示说明:
(0253) 输    入:接收数据存储空间指针
(0254) 返    回:运行状况  I2C_ERR :错误   I2C_CRR :正确
(0255) --------------------------------------------------------------------*/
(0256) unsigned char I2C_RcvAckDat(unsigned char *pRdDat) 
(0257) {
(0258)  I2CRcvAckByte();     
    0115 EC84      LDI	R24,0xC4
    0116 BF86      OUT	0x36,R24
(0259)  if(!I2C_WaitINT()) return I2C_ERR;
    0117 DF41      RCALL	_I2C_WaitINT
    0118 2300      TST	R16
    0119 F411      BNE	0x011C
    011A 2700      CLR	R16
    011B C00A      RJMP	0x0126
(0260)  if( I2C_STATUS!=I2C_MR_DATA_ACK )
    011C B181      IN	R24,0x01
    011D 7F88      ANDI	R24,0xF8
    011E 3580      CPI	R24,0x50
    011F F011      BEQ	0x0122
(0261)   return I2C_ERR;
    0120 2700      CLR	R16
    0121 C004      RJMP	0x0126
(0262)  *pRdDat=TWDR;
    0122 B023      IN	R2,0x03
    0123 01FA      MOVW	R30,R20
    0124 8220      STD	Z+0,R2
(0263)  return I2C_CRR;
    0125 E001      LDI	R16,1
    0126 940E02A3  CALL	pop_gset1
    0128 9508      RET
_I2C_Write:
  dat                  --> Y+4
  wordAdr              --> R20
  wrDAdr               --> R22
    0129 940E029E  CALL	push_gset2
    012B 2F42      MOV	R20,R18
    012C 01B8      MOVW	R22,R16
(0264) }
(0265) 
(0266) 
(0267) /*以下是API函数*/
(0268) 
(0269) /*--------------------------------------------------------------------
(0270) 函数名称:I2C_Write
(0271) 函数功能:I2C写器件,写一个字节
(0272) 注意事项:
(0273) 提示说明:
(0274) 输    入:wrDAdr : write device-address 写器件地址
(0275)    	  	  wordAdr: word address 从地址
(0276)           dat: data 数据
(0277) 返    回:运行状况  I2C_ERR :错误   I2C_CRR :正确
(0278) --------------------------------------------------------------------*/
(0279) unsigned char I2C_Write(unsigned int wrDAdr,unsigned char wordAdr,unsigned char dat)
(0280) {
(0281)  if( I2C_Start()==I2C_ERR )
    012D DF3F      RCALL	_I2C_Start
    012E 2300      TST	R16
    012F F411      BNE	0x0132
(0282)   return I2C_ERR;
    0130 2700      CLR	R16
    0131 C016      RJMP	0x0148
(0283)  //wrDAdr &=0xfffe;
(0284)  if( I2C_SendWrDAdr_((wrDAdr&0xfffe)|I2C_WRITE)==I2C_ERR )//保证写控制位正确
    0132 018B      MOVW	R16,R22
    0133 7F0E      ANDI	R16,0xFE
    0134 DF6A      RCALL	_I2C_SendWrDAdr_
    0135 2300      TST	R16
    0136 F411      BNE	0x0139
(0285)   return I2C_ERR;
    0137 2700      CLR	R16
    0138 C00F      RJMP	0x0148
(0286) 
(0287)  if( I2C_SendDat(wordAdr)==I2C_ERR )//从地址当作一般数据发送
    0139 2F04      MOV	R16,R20
    013A DFAC      RCALL	_I2C_SendDat
    013B 2300      TST	R16
    013C F411      BNE	0x013F
(0288)   return I2C_ERR;
    013D 2700      CLR	R16
    013E C009      RJMP	0x0148
(0289) 
(0290)  if( I2C_SendDat(dat)==I2C_ERR )
    013F 810C      LDD	R16,Y+4
    0140 DFA6      RCALL	_I2C_SendDat
    0141 2300      TST	R16
    0142 F411      BNE	0x0145
(0291)   return I2C_ERR;
    0143 2700      CLR	R16
    0144 C003      RJMP	0x0148
(0292) 
(0293)  I2CStop();
    0145 E984      LDI	R24,0x94
    0146 BF86      OUT	0x36,R24
(0294) 
(0295)  return I2C_CRR;
    0147 E001      LDI	R16,1
    0148 940E0292  CALL	pop_gset2
    014A 9508      RET
_I2C_Write_:
  i                    --> R20
  num                  --> R22
  pWrDat               --> R10
  wordAdr              --> R20
  wrDAdr               --> R12
    014B 940E029A  CALL	push_gset4
    014D 2F42      MOV	R20,R18
    014E 0168      MOVW	R12,R16
    014F 84A8      LDD	R10,Y+8
    0150 84B9      LDD	R11,Y+9
    0151 856A      LDD	R22,Y+10
(0296) }
(0297) /*--------------------------------------------------------------------
(0298) 函数名称:I2C_Write_
(0299) 函数功能:I2C写器件,写N个数据
(0300) 注意事项:
(0301) 提示说明:
(0302) 输    入:wrDAdr : write device-address 写器件地址
(0303)    	  	  wordAdr: word address 从地址
(0304)           *pWrDat: p->write data 写入数据的指针
(0305)           num    : number 写入数据个数
(0306) 返    回:运行状况  I2C_ERR :错误   I2C_CRR :正确
(0307) --------------------------------------------------------------------*/
(0308) unsigned char I2C_Write_(unsigned int wrDAdr,unsigned char wordAdr,
(0309)       unsigned char *pWrDat,unsigned char num)
(0310) {
(0311)     unsigned char i;
(0312)  
(0313)  if( I2C_Start()==I2C_ERR )
    0152 DF1A      RCALL	_I2C_Start
    0153 2300      TST	R16
    0154 F411      BNE	0x0157
(0314)   return I2C_ERR;
    0155 2700      CLR	R16
    0156 C01D      RJMP	0x0174
(0315) 
(0316)   //wrDAdr &=0xfffe;
(0317)  if( I2C_SendWrDAdr_((wrDAdr&0xfffe)|I2C_WRITE)==I2C_ERR )//保证写控制位正确
    0157 0186      MOVW	R16,R12
    0158 7F0E      ANDI	R16,0xFE
    0159 DF45      RCALL	_I2C_SendWrDAdr_
    015A 2300      TST	R16
    015B F411      BNE	0x015E
(0318)   return I2C_ERR;
    015C 2700      CLR	R16
    015D C016      RJMP	0x0174
(0319) 
(0320)  if( I2C_SendDat(wordAdr)==I2C_ERR )//从地址当作一般数据发送
    015E 2F04      MOV	R16,R20
    015F DF87      RCALL	_I2C_SendDat
    0160 2300      TST	R16
    0161 F411      BNE	0x0164
(0321)   return I2C_ERR;
    0162 2700      CLR	R16
    0163 C010      RJMP	0x0174
(0322) 
(0323)  for(i=0;i<num;i++)
    0164 2744      CLR	R20
    0165 C009      RJMP	0x016F
(0324)   if( I2C_SendDat(*(pWrDat++))==I2C_ERR )
    0166 01F5      MOVW	R30,R10
    0167 9101      LD	R16,Z+
    0168 015F      MOVW	R10,R30
    0169 DF7D      RCALL	_I2C_SendDat
    016A 2300      TST	R16
    016B F411      BNE	0x016E
(0325)   return I2C_ERR;
    016C 2700      CLR	R16
    016D C006      RJMP	0x0174
    016E 9543      INC	R20
    016F 1746      CP	R20,R22
    0170 F3A8      BCS	0x0166
(0326)  
(0327)  I2CStop();
    0171 E984      LDI	R24,0x94
    0172 BF86      OUT	0x36,R24
(0328)  
(0329)  return I2C_CRR;
    0173 E001      LDI	R16,1
    0174 940E0295  CALL	pop_gset4
    0176 9508      RET
_I2C_Read:
  pRdDat               --> Y+4
  wordAdr              --> R22
  rdDAdr               --> R20
    0177 940E029E  CALL	push_gset2
    0179 2F62      MOV	R22,R18
    017A 01A8      MOVW	R20,R16
(0330) } 
(0331) /*--------------------------------------------------------------------
(0332) 函数名称:I2C_Read
(0333) 函数功能:I2C读器件,读一个数据
(0334) 注意事项:
(0335) 提示说明:
(0336) 输    入:rdDAdr : read device-address 读器件地址
(0337)    	  	  wordAdr: word address 从地址
(0338)    		  *pRdDat: p->read data 读取数据指针
(0339) 返    回:运行状况  I2C_ERR :错误   I2C_CRR :正确
(0340) --------------------------------------------------------------------*/
(0341) unsigned char I2C_Read(unsigned int rdDAdr,unsigned char wordAdr,unsigned char *pRdDat)
(0342) {
(0343)  if( I2C_Start()==I2C_ERR )
    017B DEF1      RCALL	_I2C_Start
    017C 2300      TST	R16
    017D F411      BNE	0x0180
(0344)   return I2C_ERR;
    017E 2700      CLR	R16
    017F C024      RJMP	0x01A4
(0345) 
(0346)    //rdDAdr &=0xfffe;
(0347)  if( I2C_SendWrDAdr_((rdDAdr&0xfffe)|I2C_WRITE)==I2C_ERR )//保证写控制位正确
    0180 018A      MOVW	R16,R20
    0181 7F0E      ANDI	R16,0xFE
    0182 DF1C      RCALL	_I2C_SendWrDAdr_
    0183 2300      TST	R16
    0184 F411      BNE	0x0187
(0348)   return I2C_ERR;
    0185 2700      CLR	R16
    0186 C01D      RJMP	0x01A4
(0349) 
(0350)  if( I2C_SendDat(wordAdr)==I2C_ERR )//从地址当作一般数据发送。
    0187 2F06      MOV	R16,R22
    0188 DF5E      RCALL	_I2C_SendDat
    0189 2300      TST	R16
    018A F411      BNE	0x018D
(0351)   return I2C_ERR;
    018B 2700      CLR	R16
    018C C017      RJMP	0x01A4
(0352) 
(0353)  if( I2C_Restart()==I2C_ERR )//重启动
    018D DEEE      RCALL	_I2C_Restart
    018E 2300      TST	R16
    018F F411      BNE	0x0192
(0354)   return I2C_ERR;
    0190 2700      CLR	R16
    0191 C012      RJMP	0x01A4
(0355) 
(0356)   //rdDAdr &=0xfffe;
(0357)  if( I2C_SendRdDAdr((rdDAdr&0xfffe)|I2C_READ)==I2C_ERR )//保证读控制位正确
    0192 2F04      MOV	R16,R20
    0193 7F0E      ANDI	R16,0xFE
    0194 6001      ORI	R16,1
    0195 DF23      RCALL	_I2C_SendRdDAdr
    0196 2300      TST	R16
    0197 F411      BNE	0x019A
(0358)   return I2C_ERR;
    0198 2700      CLR	R16
    0199 C00A      RJMP	0x01A4
(0359) 
(0360)  if( I2C_RcvNAckDat(pRdDat)==I2C_ERR )//接收数据
    019A 810C      LDD	R16,Y+4
    019B 811D      LDD	R17,Y+5
    019C DF5E      RCALL	_I2C_RcvNAckDat
    019D 2300      TST	R16
    019E F411      BNE	0x01A1
(0361)   return I2C_ERR;
    019F 2700      CLR	R16
    01A0 C003      RJMP	0x01A4
(0362) 
(0363)  I2CStop();
    01A1 E984      LDI	R24,0x94
    01A2 BF86      OUT	0x36,R24
(0364) 
(0365)  return I2C_CRR;
    01A3 E001      LDI	R16,1
    01A4 940E0292  CALL	pop_gset2
    01A6 9508      RET
_I2C_Read_:
  i                    --> R20
  num                  --> R22
  pRdDat               --> R10
  wordAdr              --> R12
  rdDAdr               --> R20
    01A7 940E029A  CALL	push_gset4
    01A9 2EC2      MOV	R12,R18
    01AA 01A8      MOVW	R20,R16
    01AB 84A8      LDD	R10,Y+8
    01AC 84B9      LDD	R11,Y+9
    01AD 856A      LDD	R22,Y+10
(0366) }
(0367) /*--------------------------------------------------------------------
(0368) 函数名称:I2C_Read_
(0369) 函数功能:I2C读器件,读N个数据
(0370) 注意事项:
(0371) 提示说明:
(0372) 输    入:rdDAdr : read device-address 读器件地址
(0373)           wordAdr: word address 字地址
(0374)    		  *pRdDat: p->read data 读取数据指针
(0375)    		  num    : number 读取数据个数
(0376) 返    回:运行状况  I2C_ERR :错误   I2C_CRR :正确
(0377) --------------------------------------------------------------------*/
(0378) unsigned char I2C_Read_(unsigned int rdDAdr,unsigned char wordAdr,
(0379)       unsigned char *pRdDat,unsigned char num)
(0380) {
(0381)   unsigned char i;
(0382)  
(0383)  if( I2C_Start()==I2C_ERR )
    01AE DEBE      RCALL	_I2C_Start
    01AF 2300      TST	R16
    01B0 F411      BNE	0x01B3
(0384)   return I2C_ERR;
    01B1 2700      CLR	R16
    01B2 C036      RJMP	0x01E9
(0385)  //rdDAdr &=0xfffe;
(0386)  if( I2C_SendWrDAdr_((rdDAdr&0xfffe)|I2C_WRITE)==I2C_ERR )//保证写控制位正确
    01B3 018A      MOVW	R16,R20
    01B4 7F0E      ANDI	R16,0xFE
    01B5 DEE9      RCALL	_I2C_SendWrDAdr_
    01B6 2300      TST	R16
    01B7 F411      BNE	0x01BA
(0387)   return I2C_ERR;
    01B8 2700      CLR	R16
    01B9 C02F      RJMP	0x01E9
(0388) 
(0389)  if( I2C_SendDat(wordAdr)==I2C_ERR )//从地址当作一般数据发送。
    01BA 2D0C      MOV	R16,R12
    01BB DF2B      RCALL	_I2C_SendDat
    01BC 2300      TST	R16

⌨️ 快捷键说明

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