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

📄 eeprom.lst

📁 使用ICCAVR编写的AT24C16的读写函数
💻 LST
📖 第 1 页 / 共 3 页
字号:
    0158 1784      CP	R24,R20
    0159 0795      CPC	R25,R21
    015A F02C      BLT	0x0160
    015B 3240      CPI	R20,0x20
    015C E0E0      LDI	R30,0
    015D 075E      CPC	R21,R30
    015E F071      BEQ	0x016D
    015F C018      RJMP	0x0178
    0160 3348      CPI	R20,0x38
    0161 E0E0      LDI	R30,0
    0162 075E      CPC	R21,R30
    0163 F0A1      BEQ	0x0178
    0164 3348      CPI	R20,0x38
    0165 E0E0      LDI	R30,0
    0166 075E      CPC	R21,R30
    0167 F084      BLT	0x0178
    0168 3448      CPI	R20,0x48
    0169 E0E0      LDI	R30,0
    016A 075E      CPC	R21,R30
    016B F049      BEQ	0x0175
    016C C00B      RJMP	0x0178
(0018)  {
(0019)   case 0x20:     /*址址写失败*/
(0020)    /*stop 停止*/
(0021)    TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
    016D E984      LDI	R24,0x94
    016E 93800074  STS	0x74,R24
(0022)    break;
    0170 C007      RJMP	0x0178
(0023)   case 0x30:     /*数据写失败*/
(0024)    /*stop 停止*/
(0025)    TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
    0171 E984      LDI	R24,0x94
    0172 93800074  STS	0x74,R24
(0026)    break;
    0174 C003      RJMP	0x0178
(0027)   case 0x38:     /*仲裁失败*/
(0028)    break;
(0029)   case 0x48:     /*址址读失败*/
(0030)    /*stop 停止*/
(0031)    TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
    0175 E984      LDI	R24,0x94
    0176 93800074  STS	0x74,R24
(0032)    break;
    0178 940E0372  CALL	pop_gset1
    017A 9508      RET
_twi_write:
  dd                   --> R20
  addr                 --> R22
    017B 940E036D  CALL	push_gset2
    017D 2F42      MOV	R20,R18
    017E 2F60      MOV	R22,R16
(0033)   }
(0034) }
(0035) /*I2C总线单字节写入*/
(0036) unsigned char twi_write(unsigned char addr, unsigned char dd) 
(0037) {
(0038)  TWBR = 2;
    017F E082      LDI	R24,2
    0180 93800070  STS	0x70,R24
(0039)  /*start 启动*/
(0040)  TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);                              //发送START信号
    0182 EA84      LDI	R24,0xA4
    0183 93800074  STS	0x74,R24
(0041)  while (!(TWCR & (1 << TWINT)));                                                //等待TWINT置位,TWINT置位表示START信号已发出
    0185 90200074  LDS	R2,0x74
    0187 FE27      SBRS	R2,7
    0188 CFFC      RJMP	0x0185
(0042)  if ((TWSR & 0xF8) != 0x08) {
    0189 91800071  LDS	R24,0x71
    018B 7F88      ANDI	R24,0xF8
    018C 3088      CPI	R24,0x8
    018D F029      BEQ	0x0193
(0043)   error(TWSR);
    018E 91000071  LDS	R16,0x71
    0190 DFBB      RCALL	_error
(0044)   return 0;
    0191 2700      CLR	R16
    0192 C03E      RJMP	0x01D1
(0045)   }
(0046)  /*SLA_W 芯片地址*/
(0047)  TWDR = 0xA0;
    0193 EA80      LDI	R24,0xA0
    0194 93800073  STS	0x73,R24
(0048)  TWCR = (1 << TWINT) | (1 << TWEN);                                             //TWINT位清零,启动发送地址
    0196 E884      LDI	R24,0x84
    0197 93800074  STS	0x74,R24
(0049)  while (!(TWCR & (1 << TWINT)));
    0199 90200074  LDS	R2,0x74
    019B FE27      SBRS	R2,7
    019C CFFC      RJMP	0x0199
(0050)  if ((TWSR & 0xF8) != 0x18) {
    019D 91800071  LDS	R24,0x71
    019F 7F88      ANDI	R24,0xF8
    01A0 3188      CPI	R24,0x18
    01A1 F029      BEQ	0x01A7
(0051)   error(TWSR);
    01A2 91000071  LDS	R16,0x71
    01A4 DFA7      RCALL	_error
(0052)   return 0;
    01A5 2700      CLR	R16
    01A6 C02A      RJMP	0x01D1
(0053)   }
(0054)  /*addr 操作地址*/
(0055)  TWDR = addr;
    01A7 93600073  STS	0x73,R22
(0056)  TWCR = (1 << TWINT) | (1 << TWEN);
    01A9 E884      LDI	R24,0x84
    01AA 93800074  STS	0x74,R24
(0057)  while (!(TWCR & (1 << TWINT)));
    01AC 90200074  LDS	R2,0x74
    01AE FE27      SBRS	R2,7
    01AF CFFC      RJMP	0x01AC
(0058)  if ((TWSR & 0xF8) != 0x28) {
    01B0 91800071  LDS	R24,0x71
    01B2 7F88      ANDI	R24,0xF8
    01B3 3288      CPI	R24,0x28
    01B4 F029      BEQ	0x01BA
(0059)   error(TWSR);
    01B5 91000071  LDS	R16,0x71
    01B7 DF94      RCALL	_error
(0060)   return 0;
    01B8 2700      CLR	R16
    01B9 C017      RJMP	0x01D1
(0061)   }
(0062)  
(0063)  /*dd 写入数据*/
(0064)  TWDR = dd;
    01BA 93400073  STS	0x73,R20
(0065)  TWCR = (1 << TWINT) | (1 << TWEN);
    01BC E884      LDI	R24,0x84
    01BD 93800074  STS	0x74,R24
(0066)  while (!(TWCR & (1 << TWINT)));
    01BF 90200074  LDS	R2,0x74
    01C1 FE27      SBRS	R2,7
    01C2 CFFC      RJMP	0x01BF
(0067)  if ((TWSR & 0xF8) != 0x28) {
    01C3 91800071  LDS	R24,0x71
    01C5 7F88      ANDI	R24,0xF8
    01C6 3288      CPI	R24,0x28
    01C7 F029      BEQ	0x01CD
(0068)   error(TWSR);
    01C8 91000071  LDS	R16,0x71
    01CA DF81      RCALL	_error
(0069)   return 0;
    01CB 2700      CLR	R16
    01CC C004      RJMP	0x01D1
(0070)   }
(0071)  
(0072)  /*stop 停止*/
(0073)  TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
    01CD E984      LDI	R24,0x94
    01CE 93800074  STS	0x74,R24
(0074)  return 1;
    01D0 E001      LDI	R16,1
    01D1 940E0361  CALL	pop_gset2
    01D3 9508      RET
_twi_read:
  dd                   --> R20
  addr                 --> R22
    01D4 940E036D  CALL	push_gset2
    01D6 01A9      MOVW	R20,R18
    01D7 2F60      MOV	R22,R16
(0075) }
(0076) /*I2C总线单字节读取*/
(0077) unsigned char twi_read(unsigned char addr, unsigned char *dd) 
(0078) {
(0079)  TWBR = 2;
    01D8 E082      LDI	R24,2
    01D9 93800070  STS	0x70,R24
(0080)  /*start 启动*/
(0081)  TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
    01DB EA84      LDI	R24,0xA4
    01DC 93800074  STS	0x74,R24
(0082)  while(!(TWCR&(1<<TWINT)));
    01DE 90200074  LDS	R2,0x74
    01E0 FE27      SBRS	R2,7
    01E1 CFFC      RJMP	0x01DE
(0083)  if ((TWSR & 0xF8) != 0x08) {
    01E2 91800071  LDS	R24,0x71
    01E4 7F88      ANDI	R24,0xF8
    01E5 3088      CPI	R24,0x8
    01E6 F029      BEQ	0x01EC
(0084)   error(TWSR);
    01E7 91000071  LDS	R16,0x71
    01E9 DF62      RCALL	_error
(0085)   return 0;
    01EA 2700      CLR	R16
    01EB C065      RJMP	0x0251
(0086)   }
(0087)  /*SLA_W 芯片地址*/
(0088)  TWDR = 0xA0;
    01EC EA80      LDI	R24,0xA0
    01ED 93800073  STS	0x73,R24
(0089)  TWCR = (1 << TWINT) | (1 << TWEN);
    01EF E884      LDI	R24,0x84
    01F0 93800074  STS	0x74,R24
(0090)  while (!(TWCR & (1 << TWINT)));
    01F2 90200074  LDS	R2,0x74
    01F4 FE27      SBRS	R2,7
    01F5 CFFC      RJMP	0x01F2
(0091)  if ((TWSR & 0xF8) != 0x18) {
    01F6 91800071  LDS	R24,0x71
    01F8 7F88      ANDI	R24,0xF8
    01F9 3188      CPI	R24,0x18
    01FA F029      BEQ	0x0200
(0092)   error(TWSR);
    01FB 91000071  LDS	R16,0x71
    01FD DF4E      RCALL	_error
(0093)   return 0;
    01FE 2700      CLR	R16
    01FF C051      RJMP	0x0251
(0094)   }
(0095)  /*addr 操作地址*/
(0096)  TWDR = addr;
    0200 93600073  STS	0x73,R22
(0097)  TWCR = (1 << TWINT) | (1 << TWEN);
    0202 E884      LDI	R24,0x84
    0203 93800074  STS	0x74,R24
(0098)  while (!(TWCR & (1 << TWINT)));
    0205 90200074  LDS	R2,0x74
    0207 FE27      SBRS	R2,7
    0208 CFFC      RJMP	0x0205
(0099)  if ((TWSR & 0xF8) != 0x28) {
    0209 91800071  LDS	R24,0x71
    020B 7F88      ANDI	R24,0xF8
    020C 3288      CPI	R24,0x28
    020D F029      BEQ	0x0213
(0100)   error(TWSR);
    020E 91000071  LDS	R16,0x71
    0210 DF3B      RCALL	_error
(0101)   return 0;
    0211 2700      CLR	R16
    0212 C03E      RJMP	0x0251
(0102)   }
(0103)   
(0104)  /*start 启动*/
(0105)  TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
    0213 EA84      LDI	R24,0xA4
    0214 93800074  STS	0x74,R24
(0106)  while (!(TWCR & (1 << TWINT)));
    0216 90200074  LDS	R2,0x74
    0218 FE27      SBRS	R2,7
    0219 CFFC      RJMP	0x0216
(0107)  if ((TWSR & 0xF8) != 0x10) {
    021A 91800071  LDS	R24,0x71
    021C 7F88      ANDI	R24,0xF8
    021D 3180      CPI	R24,0x10
    021E F029      BEQ	0x0224
(0108)   error(TWSR);
    021F 91000071  LDS	R16,0x71
    0221 DF2A      RCALL	_error
(0109)   return 0;
    0222 2700      CLR	R16
    0223 C02D      RJMP	0x0251
(0110)   }
(0111)  
(0112)  /*SLA_R 芯片地址*/
(0113)  TWDR = 0xA1;
    0224 EA81      LDI	R24,0xA1
    0225 93800073  STS	0x73,R24
(0114)  TWCR = (1 << TWINT) | (1 << TWEN);
    0227 E884      LDI	R24,0x84
    0228 93800074  STS	0x74,R24
(0115)  while (!(TWCR & (1 << TWINT)));
    022A 90200074  LDS	R2,0x74
    022C FE27      SBRS	R2,7
    022D CFFC      RJMP	0x022A
(0116)  if ((TWSR & 0xF8) != 0x40) {
    022E 91800071  LDS	R24,0x71
    0230 7F88      ANDI	R24,0xF8
    0231 3480      CPI	R24,0x40
    0232 F029      BEQ	0x0238
(0117)   error(TWSR);
    0233 91000071  LDS	R16,0x71
    0235 DF16      RCALL	_error
(0118)   return 0;
    0236 2700      CLR	R16
    0237 C019      RJMP	0x0251
(0119)   }
(0120)  /*读取数据*/
(0121)  TWCR = (1 << TWINT) | (1 << TWEN);
    0238 E884      LDI	R24,0x84
    0239 93800074  STS	0x74,R24
(0122)  while (!(TWCR & (1 << TWINT)));
    023B 90200074  LDS	R2,0x74
    023D FE27      SBRS	R2,7
    023E CFFC      RJMP	0x023B
(0123)  if ((TWSR & 0xF8) != 0x58) {
    023F 91800071  LDS	R24,0x71
    0241 7F88      ANDI	R24,0xF8
    0242 3588      CPI	R24,0x58
    0243 F029      BEQ	0x0249
(0124)   error(TWSR);
    0244 91000071  LDS	R16,0x71
    0246 DF05      RCALL	_error
(0125)   return 0;
    0247 2700      CLR	R16
    0248 C008      RJMP	0x0251
(0126)   }
(0127)  *dd = TWDR;
    0249 90200073  LDS	R2,0x73
    024B 01FA      MOVW	R30,R20
    024C 8220      STD	Z+0,R2
(0128)   
(0129)  /*stop 停止*/
(0130)  TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN);
    024D E984      LDI	R24,0x94
    024E 93800074  STS	0x74,R24
(0131)  return 1;
    0250 E001      LDI	R16,1
    0251 940E0361  CALL	pop_gset2
    0253 9508      RET
_ds1302_write_byte:
  i                    --> R20
  d                    --> R18
  addr                 --> R16
    0254 940E036F  CALL	push_gset1
FILE: E:\icc\eeprom\DS1302.h
(0001) //#include <iom16v.h>
(0002) //复位脚
(0003) #define RST_CLR PORTE&=~(1<<PE4) 
(0004) #define RST_SET PORTE|=(1<<PE4)
(0005) #define RST_IN  DDRE&=~(1<<PE4)
(0006) #define RST_OUT DDRE|=(1<<PE4)
(0007) //双向数据
(0008) 
(0009) #define IO_CLR PORTE&=~(1<<PE3)
(0010) #define IO_SET PORTE|=(1<<PE3)
(0011) #define IO_R   PINE&(1<<PE3)
(0012) #define IO_IN  DDRE&=~(1<<PE3)
(0013) #define IO_OUT DDRE|=(1<<PE3)
(0014) //时钟信号
(0015) #define SCK_CLR PORTE&=~(1<<PE2)
(0016) #define SCK_SET PORTE|=(1<<PE2)
(0017) #define SCK_IN  DDRE&=~(1<<PE2)
(0018) #define SCK_OUT DDRE|=(1<<PE2)
(0019) #define ds1302_sec_add			0x80		//秒数据地址
(0020) #define ds1302_min_add			0x82		//分数据地址
(0021) #define ds1302_hr_add			0x84		//时数据地址
(0022) #define ds1302_date_add			0x86		//日数据地址
(0023) #define ds1302_month_add		0x88		//月数据地址
(0024) #define ds1302_day_add			0x8a		//星期数据地址
(0025) #define ds1302_year_add			0x8c		//年数据地址
(0026) #define ds1302_control_add		0x8e		//控制数据地址
(0027) #define ds1302_charger_add		0x90 					 
(0028) #define ds1302_clkburst_add		0xbe
(0029) unsigned char time_buf[8] = {0x20,0x08,0x03,0x21,0x20,0x20,0x50,0x02};
(0030) /*向DS1302写入一字节数据*/
(0031) void ds1302_write_byte(unsigned char addr, unsigned char d) 
(0032) {
(0033) 
(0034) 	unsigned char i;
(0035) 	RST_SET;					/*启动DS1302总线*/
    0256 9A1C      SBI	0x03,4
(0036) 	
(0037) 	/*写入目标地址:addr*/
(0038) 	IO_OUT;
    0257 9A13      SBI	0x02,3
(0039) 	addr = addr & 0xFE;/*最低位置零*/
    0258 7F0E      ANDI	R16,0xFE
(0040) 	for (i = 0; i < 8; i ++) {
    0259 2744      CLR	R20
    025A C009      RJMP	0x0264
(0041) 		if (addr & 0x01) {
    025B FF00      SBRS	R16,0
    025C C002      RJMP	0x025F
(0042) 			IO_SET;
    025D 9A1B      SBI	0x03,3
(0043) 			}
    025E C001      RJMP	0x0260
(0044) 		else {
(0045) 			IO_CLR;
    025F 981B      CBI	0x03,3
(0046) 			}
(0047) 		SCK_SET;
    0260 9A1A      SBI	0x03,2
(0048) 		SCK_CLR;
    0261 981A      CBI	0x03,2
(0049) 		addr = addr >> 1;
    0262 9506      LSR	R16
    0263 9543      INC	R20
    0264 3048      CPI	R20,0x8
    0265 F3A8      BCS	0x025B
(0050) 		}
(0051) 	
(0052) 	/*写入数据:d*/
(0053) 	IO_OUT;
    0266 9A13      SBI	0x02,3
(0054) 	for (i = 0; i < 8; i ++) {
    0267 2744      CLR	R20
    0268 C009      RJMP	0x0272
(0055) 		if (d & 0x01) {
    0269 FF20      SBRS	R18,0
    026A C002      RJMP	0x026D
(0056) 			IO_SET;
    026B 9A1B      SBI	0x03,3
(0057) 			}
    026C C001      RJMP	0x026E
(0058) 		else {
(0059) 			IO_CLR;
    026D 981B      CBI	0x03,3
(0060) 			}
(0061) 		SCK_SET;
    026E 9A1A      SBI	0x03,2
(0062) 		SCK_CLR;
    026F 981A      CBI	0x03,2
(0063) 		d = d >> 1;
    0270 9526      LSR	R18
    0271 9543      INC	R20
    0272 3048      CPI	R20,0x8
    0273 F3A8      BCS	0x0269
(0064) 		}
(0065) 	RST_CLR;					/*停止DS1302总线*/
    0274 981C      CBI	0x03,4
    0275 940E0372  CALL	pop_gset1
    0277 9508      RET
_ds1302_read_byte:
  temp                 --> R20
  i                    --> R22
  addr                 --> R16
    0278 940E036D  CALL	push_gset2
(0066) }

⌨️ 快捷键说明

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