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

📄 24c01a.lst

📁 AVR 24c02 f
💻 LST
📖 第 1 页 / 共 3 页
字号:
__start:
__text_start:
    0035 E5CF      LDI	R28,0x5F
    0036 E0D4      LDI	R29,4
    0037 BFCD      OUT	0x3D,R28
    0038 BFDE      OUT	0x3E,R29
    0039 51C0      SUBI	R28,0x10
    003A 40D0      SBCI	R29,0
    003B EA0A      LDI	R16,0xAA
    003C 8308      STD	Y+0,R16
    003D 2400      CLR	R0
    003E E6E0      LDI	R30,0x60
    003F E0F0      LDI	R31,0
    0040 E010      LDI	R17,0
    0041 36E0      CPI	R30,0x60
    0042 07F1      CPC	R31,R17
    0043 F011      BEQ	0x0046
    0044 9201      ST	R0,Z+
    0045 CFFB      RJMP	0x0041
    0046 8300      STD	Z+0,R16
    0047 E6EA      LDI	R30,0x6A
    0048 E0F0      LDI	R31,0
    0049 E6A0      LDI	R26,0x60
    004A E0B0      LDI	R27,0
    004B E010      LDI	R17,0
    004C 36EA      CPI	R30,0x6A
    004D 07F1      CPC	R31,R17
    004E F021      BEQ	0x0053
    004F 95C8      LPM
    0050 9631      ADIW	R30,1
    0051 920D      ST	R0,X+
    0052 CFF9      RJMP	0x004C
    0053 940E022F  CALL	_main
_exit:
    0055 CFFF      RJMP	_exit
FILE: D:\24C01A\I2C.h
(0001) /*--------------------------文件说明----------------------------------
(0002) 文件用途      :TWI/I2C驱动,查询方式,主机模式
(0003) 原创者        :SEE
(0004) 修改者        :programshao
(0005) 最后修改时间  :2007-05-03
(0006) 使用说明      :调用最后6个API函数进行I2C读写
(0007) 调试说明      :ATmega16L+ICC+AVR studio 4 环境下调试通过。
(0008) 注意事项      :根据原创者意愿,如用于商业用途请注明文件来源。
(0009) 
(0010) --------------------------------------------------------------------*/
(0011) #ifndef I2C_H
(0012) #define I2C_H
(0013) 
(0014) /* define  TWSR values (not bits) */
(0015) /* Master */
(0016) #define I2C_START                       0x08
(0017) #define I2C_RESTART      				0x10
(0018) 
(0019) /* Master Transmitter */
(0020) #define I2C_MT_SLA_ACK   				0x18
(0021) #define I2C_MT_SLA_NACK  				0x20
(0022) #define I2C_MT_DATA_ACK  				0x28
(0023) #define I2C_MT_DATA_NACK 				0x30
(0024) #define I2C_MT_ARB_LOST  				0x38
(0025) 
(0026) /* Master Receiver */
(0027) #define I2C_MR_ARB_LOST  				0x38
(0028) #define I2C_MR_SLA_ACK   				0x40
(0029) #define I2C_MR_SLA_NACK  				0x48
(0030) #define I2C_MR_DATA_ACK  				0x50
(0031) #define I2C_MR_DATA_NACK 				0x58
(0032) 
(0033) /* Slave Receiver */
(0034) #define I2C_SR_SLA_ACK    				0x60
(0035) #define I2C_SR_ARB_LOST_SLA_ACK  		0x68
(0036) #define I2C_SR_GCALL_ACK   				0x70
(0037) #define I2C_SR_ARB_LOST_GCALL_ACK 		0x78
(0038) #define I2C_SR_DATA_ACK    				0x80
(0039) #define I2C_SR_DATA_NACK   				0x88
(0040) #define I2C_SR_GCALL_DATA_ACK  			0x90
(0041) #define I2C_SR_GCALL_DATA_NACK  		0x98
(0042) #define I2C_SR_STOP     				0xA0
(0043) 
(0044) /* Slave Transmitter */
(0045) #define I2C_ST_SLA_ACK   				0xA8
(0046) #define I2C_ST_ARB_LOST_SLA_ACK 		0xB0
(0047) #define I2C_ST_DATA_ACK   				0xB8
(0048) #define I2C_ST_DATA_NACK 				0xC0
(0049) #define I2C_ST_LAST_DATA  				0xC8
(0050) 
(0051) /* Misc */
(0052) #define I2C_NO_INFO   					0xF8
(0053) #define I2C_BUS_ERROR  					0x00
(0054) 
(0055) 
(0056) 
(0057) /*定义SLA中读写控制位极性*/
(0058) #define I2C_READ   1
(0059) #define I2C_WRITE  0
(0060) 
(0061) #define I2CStart()      (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))
(0062) #define I2CStop()       (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))
(0063) #define I2C_STATUS      (TWSR & 0xf8)
(0064) #define I2CSendAck()    (TWCR|=(1<<TWEA))
(0065) #define I2CSendNoAck()  (TWCR&=~(1<<TWEA))
(0066) #define I2CRcvNckByte() (TWCR=(1<<TWINT)|(1<<TWEN))
(0067) #define I2CRcvAckByte() (TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWEA))
(0068) 
(0069) /*定义运行状态返回值极性*/
(0070) #define I2C_ERR   0     //错误
(0071) #define I2C_CRR   1     //正确
(0072) 
(0073) /*定义TWINT位置位查询等待时间*/
(0074) #define WAITCOUNT  50
(0075) 
(0076) /*--------------------------------------------------------------------
(0077) 函数名称:I2C_Init
(0078) 函数功能:TWI初始化
(0079) 注意事项:(须根据具体情况设置)
(0080) 提示说明:
(0081) 输    入:
(0082) 返    回:
(0083) --------------------------------------------------------------------*/
(0084) void I2C_Init(void)
(0085) {
(0086) TWBR=0x0f;//波特率设置,必须大于 10
_I2C_Init:
    0056 E08F      LDI	R24,0xF
    0057 B980      OUT	0x00,R24
    0058 9508      RET
(0087) //TWAR=       //从机地址和通用呼叫设置
(0088) }
(0089) /*--------------------------------------------------------------------
(0090) 函数名称:I2C_WaitINT
(0091) 函数功能:等待TWINT位置位
(0092) 注意事项:需定义 WAITCOUNT
(0093) 提示说明:
(0094) 输    入:
(0095) 返    回:运行状况  I2C_ERR :错误   I2C_CRR :正确
(0096) --------------------------------------------------------------------*/
(0097) unsigned char I2C_WaitINT(void) 
(0098) {
(0099) unsigned int i=WAITCOUNT;
_I2C_WaitINT:
  i                    --> R16
    0059 E302      LDI	R16,0x32
    005A E010      LDI	R17,0
    005B C008      RJMP	0x0064
(0100) while(!(TWCR&(1<<TWINT)))
(0101) {if((--i)==0) return I2C_ERR;}
    005C 01C8      MOVW	R24,R16
    005D 9701      SBIW	R24,1
    005E 018C      MOVW	R16,R24
    005F 3000      CPI	R16,0
    0060 0701      CPC	R16,R17
    0061 F411      BNE	0x0064
    0062 2700      CLR	R16
    0063 C004      RJMP	0x0068
    0064 B626      IN	R2,0x36
    0065 FE27      SBRS	R2,7
    0066 CFF5      RJMP	0x005C
(0102) return I2C_CRR;
    0067 E001      LDI	R16,1
    0068 9508      RET
(0103) }
(0104) /*--------------------------------------------------------------------
(0105) 函数名称:I2C_SendByte
(0106) 函数功能:发送一字节数据
(0107) 注意事项:
(0108) 提示说明:
(0109) 输    入:待发送数据
(0110) 返    回:运行状况  I2C_ERR :错误   I2C_CRR :正确
(0111) --------------------------------------------------------------------*/
(0112) void I2C_SendByte(unsigned char x)
(0113) {
(0114)  	 TWDR=(x);
_I2C_SendByte:
  x                    --> R16
    0069 B903      OUT	0x03,R16
(0115) 	 TWCR=(1<<TWINT)|(1<<TWEN);
    006A E884      LDI	R24,0x84
    006B BF86      OUT	0x36,R24
    006C 9508      RET
(0116) }
(0117) /*--------------------------------------------------------------------
(0118) 函数名称:I2C Start
(0119) 函数功能:发出起始信号
(0120) 注意事项:
(0121) 提示说明:
(0122) 输    入:
(0123) 返    回:运行状况  I2C_ERR :错误   I2C_CRR :正确
(0124) --------------------------------------------------------------------*/
(0125) unsigned char I2C_Start()     
(0126) {
(0127)  I2CStart();      
_I2C_Start:
    006D EA84      LDI	R24,0xA4
    006E BF86      OUT	0x36,R24
(0128)  if(!I2C_WaitINT()) return I2C_ERR;
    006F DFE9      RCALL	_I2C_WaitINT
    0070 2300      TST	R16
    0071 F411      BNE	0x0074
    0072 2700      CLR	R16
    0073 C007      RJMP	0x007B
(0129)  if( I2C_STATUS!=I2C_START ) 
    0074 B181      IN	R24,0x01
    0075 7F88      ANDI	R24,0xF8
    0076 3088      CPI	R24,0x8
    0077 F011      BEQ	0x007A
(0130)   return I2C_ERR;
    0078 2700      CLR	R16
    0079 C001      RJMP	0x007B
(0131)  return I2C_CRR;
    007A E001      LDI	R16,1
    007B 9508      RET
(0132) }
(0133) /*--------------------------------------------------------------------
(0134) 函数名称:I2C ReStart
(0135) 函数功能:发出重复起始信号
(0136) 注意事项:
(0137) 提示说明:
(0138) 输    入:
(0139) 返    回:运行状况  I2C_ERR :错误   I2C_CRR :正确
(0140) --------------------------------------------------------------------*/
(0141) unsigned char I2C_Restart()     
(0142) {
(0143)  I2CStart();      
_I2C_Restart:
    007C EA84      LDI	R24,0xA4
    007D BF86      OUT	0x36,R24
(0144)  if(!I2C_WaitINT()) return I2C_ERR;
    007E DFDA      RCALL	_I2C_WaitINT
    007F 2300      TST	R16
    0080 F411      BNE	0x0083
    0081 2700      CLR	R16
    0082 C007      RJMP	0x008A
(0145)  if( I2C_STATUS!=I2C_RESTART ) 
    0083 B181      IN	R24,0x01
    0084 7F88      ANDI	R24,0xF8
    0085 3180      CPI	R24,0x10
    0086 F011      BEQ	0x0089
(0146)   return I2C_ERR;
    0087 2700      CLR	R16
    0088 C001      RJMP	0x008A
(0147)  return I2C_CRR;
    0089 E001      LDI	R16,1
    008A 9508      RET
_I2C_SendWrDAdr:
  wrDAdr               --> R20
    008B 940E02A0  CALL	push_gset1
    008D 2F40      MOV	R20,R16
(0148) }
(0149) /*--------------------------------------------------------------------
(0150) 函数名称:I2C_SendWrDAdr
(0151) 函数功能:发送 7位 器件写地址: XXXX XXX0
(0152) 注意事项:
(0153) 提示说明:
(0154) 输    入:写地址
(0155) 返    回:运行状况  I2C_ERR :错误   I2C_CRR :正确
(0156) --------------------------------------------------------------------*/
(0157) unsigned char I2C_SendWrDAdr(unsigned char wrDAdr) 
(0158) {
(0159)  I2C_SendByte(wrDAdr);   //设置器件写地址
    008E 2F04      MOV	R16,R20
    008F DFD9      RCALL	_I2C_SendByte
(0160)  if(!I2C_WaitINT()) return I2C_ERR;
    0090 DFC8      RCALL	_I2C_WaitINT
    0091 2300      TST	R16
    0092 F411      BNE	0x0095
    0093 2700      CLR	R16
    0094 C007      RJMP	0x009C
(0161)  if( I2C_STATUS!=I2C_MT_SLA_ACK )  
    0095 B181      IN	R24,0x01
    0096 7F88      ANDI	R24,0xF8
    0097 3188      CPI	R24,0x18
    0098 F011      BEQ	0x009B
(0162)   return I2C_ERR;
    0099 2700      CLR	R16
    009A C001      RJMP	0x009C
(0163)  return I2C_CRR;  
    009B E001      LDI	R16,1
    009C 940E02A3  CALL	pop_gset1
    009E 9508      RET
_I2C_SendWrDAdr_:
  wrDAdr               --> R20
    009F 940E02A0  CALL	push_gset1
    00A1 01A8      MOVW	R20,R16
(0164) }
(0165) /*--------------------------------------------------------------------
(0166) 函数名称:I2C_SendWrDAdr_
(0167) 函数功能:发送 10位 器件写地址: 1111 0XX0, XXXX XXXX
(0168) 注意事项:
(0169) 提示说明:兼容 发送 7位 器件写地址: XXXX XXX0
(0170) 输    入:
(0171) 返    回:运行状况  I2C_ERR :错误   I2C_CRR :正确
(0172) --------------------------------------------------------------------*/
(0173) unsigned char I2C_SendWrDAdr_(unsigned int wrDAdr) 
(0174) {
(0175)  if( wrDAdr&0xF000 == 0xF000 )           //判断是否为 10位 器件地址
    00A2 FF40      SBRS	R20,0
    00A3 C00B      RJMP	0x00AF
(0176)   if( I2C_SendWrDAdr((unsigned char )wrDAdr>>8)==I2C_ERR ) //设置(高位)器件写地址
    00A4 2F04      MOV	R16,R20
    00A5 2711      CLR	R17
    00A6 2F01      MOV	R16,R17
    00A7 2711      CLR	R17
    00A8 FD07      SBRC	R16,7
    00A9 9510      COM	R17
    00AA DFE0      RCALL	_I2C_SendWrDAdr
    00AB 2300      TST	R16
    00AC F411      BNE	0x00AF
(0177)    return I2C_ERR;
    00AD 2700      CLR	R16
    00AE C007      RJMP	0x00B6
(0178)  if( I2C_SendWrDAdr( (unsigned char)wrDAdr )==I2C_ERR ) //设置 (低位)器件写地址
    00AF 2F04      MOV	R16,R20
    00B0 DFDA      RCALL	_I2C_SendWrDAdr
    00B1 2300      TST	R16
    00B2 F411      BNE	0x00B5
(0179)   return I2C_ERR;
    00B3 2700      CLR	R16
    00B4 C001      RJMP	0x00B6
(0180)  return I2C_CRR;
    00B5 E001      LDI	R16,1
    00B6 940E02A3  CALL	pop_gset1
    00B8 9508      RET
_I2C_SendRdDAdr:
  rdDAdr               --> R20
    00B9 940E02A0  CALL	push_gset1
    00BB 2F40      MOV	R20,R16
(0181) }
(0182) /*--------------------------------------------------------------------
(0183) 函数名称:I2C_SendRdDAdr
(0184) 函数功能:发送 7位 器件读地址: XXXX XXX1
(0185) 注意事项:
(0186) 提示说明:
(0187) 输    入:读地址
(0188) 返    回:运行状况  I2C_ERR :错误   I2C_CRR :正确
(0189) --------------------------------------------------------------------*/
(0190) unsigned char I2C_SendRdDAdr(unsigned char rdDAdr) 
(0191) {
(0192)  I2C_SendByte(rdDAdr);   //设置 器件读地址
    00BC 2F04      MOV	R16,R20
    00BD DFAB      RCALL	_I2C_SendByte
(0193)  if(!I2C_WaitINT()) return I2C_ERR;
    00BE DF9A      RCALL	_I2C_WaitINT
    00BF 2300      TST	R16
    00C0 F411      BNE	0x00C3
    00C1 2700      CLR	R16
    00C2 C007      RJMP	0x00CA
(0194)  if( I2C_STATUS!=I2C_MR_SLA_ACK )  
    00C3 B181      IN	R24,0x01
    00C4 7F88      ANDI	R24,0xF8
    00C5 3480      CPI	R24,0x40
    00C6 F011      BEQ	0x00C9
(0195)   return I2C_ERR;
    00C7 2700      CLR	R16
    00C8 C001      RJMP	0x00CA
(0196)  return I2C_CRR; 
    00C9 E001      LDI	R16,1
    00CA 940E02A3  CALL	pop_gset1
    00CC 9508      RET
_I2C_SendRdDAdr_:
  rdDAdr               --> R20
    00CD 940E02A0  CALL	push_gset1
    00CF 2F40      MOV	R20,R16
(0197) }
(0198) /*--------------------------------------------------------------------
(0199) 函数名称:I2C_SendRdDAdr_
(0200) 函数功能:发送 10位 器件读地址: 1111 0XX0, XXXX XXXX
(0201) 注意事项:
(0202) 提示说明:兼容 发送 7位 器件读地址: XXXX XXX1
(0203) 输    入:
(0204) 返    回:运行状况  I2C_ERR :错误   I2C_CRR :正确
(0205) --------------------------------------------------------------------*/
(0206) unsigned char I2C_SendRdDAdr_(unsigned char rdDAdr) 
(0207) {
(0208)  if( rdDAdr&0xF000 == 0xF000 ) 		   		//判断是否为 10位 器件地址
    00D0 FF40      SBRS	R20,0
    00D1 C00B      RJMP	0x00DD
(0209)   if( I2C_SendWrDAdr( (unsigned char)rdDAdr>>8 )==I2C_ERR ) //设置 (高位)器件读地址
    00D2 2F04      MOV	R16,R20
    00D3 2711      CLR	R17
    00D4 2F01      MOV	R16,R17
    00D5 2711      CLR	R17
    00D6 FD07      SBRC	R16,7
    00D7 9510      COM	R17
    00D8 DFB2      RCALL	_I2C_SendWrDAdr
    00D9 2300      TST	R16
    00DA F411      BNE	0x00DD
(0210)    return I2C_ERR;
    00DB 2700      CLR	R16
    00DC C007      RJMP	0x00E4
(0211)  if( I2C_SendWrDAdr( (unsigned char)rdDAdr )==I2C_ERR ) //设置 (低位)器件读地址
    00DD 2F04      MOV	R16,R20
    00DE DFAC      RCALL	_I2C_SendWrDAdr
    00DF 2300      TST	R16
    00E0 F411      BNE	0x00E3
(0212)   return I2C_ERR;
    00E1 2700      CLR	R16
    00E2 C001      RJMP	0x00E4
(0213)  return I2C_CRR;
    00E3 E001      LDI	R16,1
    00E4 940E02A3  CALL	pop_gset1
    00E6 9508      RET
_I2C_SendDat:

⌨️ 快捷键说明

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