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

📄 main.lst

📁 AT24C256 读写 atmega16单片机( ICC )
💻 LST
📖 第 1 页 / 共 3 页
字号:
(0130)   if(next_page_start_addr<=addr){next_page_start_addr+=page_size;break;}
    013F 882C      LDD	R2,Y+20
    0140 883D      LDD	R3,Y+21
    0141 2444      CLR	R4
    0142 2455      CLR	R5
    0143 01FE      MOVW	R30,R28
    0144 8060      LDD	R6,Z+0
    0145 8071      LDD	R7,Z+1
    0146 8082      LDD	R8,Z+2
    0147 8093      LDD	R9,Z+3
    0148 1426      CP	R2,R6
    0149 0437      CPC	R3,R7
    014A 0448      CPC	R4,R8
    014B 0459      CPC	R5,R9
    014C F098      BCS	0x0160
    014D 802C      LDD	R2,Y+4
    014E 2433      CLR	R3
    014F 2444      CLR	R4
    0150 2455      CLR	R5
    0151 01FE      MOVW	R30,R28
    0152 8060      LDD	R6,Z+0
    0153 8071      LDD	R7,Z+1
    0154 8082      LDD	R8,Z+2
    0155 8093      LDD	R9,Z+3
    0156 0C62      ADD	R6,R2
    0157 1C73      ADC	R7,R3
    0158 1C84      ADC	R8,R4
    0159 1C95      ADC	R9,R5
    015A 01FE      MOVW	R30,R28
    015B 8260      STD	Z+0,R6
    015C 8271      STD	Z+1,R7
    015D 8282      STD	Z+2,R8
    015E 8293      STD	Z+3,R9
    015F C00F      RJMP	0x016F
    0160 E040      LDI	R20,0
    0161 E050      LDI	R21,0
    0162 E060      LDI	R22,0
    0163 E070      LDI	R23,0
    0164 01FE      MOVW	R30,R28
    0165 8020      LDD	R2,Z+0
    0166 8031      LDD	R3,Z+1
    0167 8042      LDD	R4,Z+2
    0168 8053      LDD	R5,Z+3
    0169 1624      CP	R2,R20
    016A 0635      CPC	R3,R21
    016B 0646      CPC	R4,R22
    016C 0657      CPC	R5,R23
    016D F009      BEQ	0x016F
    016E CFBE      RJMP	0x012D
(0131)  }
(0132)  
(0133) Wagain:
(0134)  p=P_data;
    016F 88EE      LDD	R14,Y+22
    0170 88FF      LDD	R15,Y+23
(0135)  i=num;//数据个数
    0171 8CA8      LDD	R10,Y+24
(0136)  if(ICerror<10)
    0172 818D      LDD	R24,Y+5
    0173 308A      CPI	R24,0xA
    0174 F008      BCS	0x0176
    0175 C055      RJMP	0x01CB
(0137)  {
(0138)   ICerror++;
    0176 2E08      MOV	R0,R24
    0177 9403      INC	R0
    0178 820D      STD	Y+5,R0
(0139)  }
(0140)  else 
(0141)  {
(0142)  goto Wstop;
(0143)  }
(0144)  SDAout();
    0179 9AA1      SBI	0x14,1
(0145)  WriteStart();      //启动
    017A DEDE      RCALL	_WriteStart
(0146)  temp=0xa0+(DevAddr<<1);
    017B 898A      LDD	R24,Y+18
    017C 0F88      LSL	R24
    017D 5680      SUBI	R24,0x60
    017E 2EC8      MOV	R12,R24
(0147)  if(model<16) temp+=((addr>>7)&0x0e);//器件24c32以下地址高位
    017F 8988      LDD	R24,Y+16
    0180 8999      LDD	R25,Y+17
    0181 3180      CPI	R24,0x10
    0182 E0E0      LDI	R30,0
    0183 079E      CPC	R25,R30
    0184 F470      BCC	0x0193
    0185 E027      LDI	R18,7
    0186 E030      LDI	R19,0
    0187 890C      LDD	R16,Y+20
    0188 891D      LDD	R17,Y+21
    0189 940E0397  CALL	lsr16
    018B 01C8      MOVW	R24,R16
    018C 708E      ANDI	R24,0xE
    018D 7090      ANDI	R25,0
    018E 2C2C      MOV	R2,R12
    018F 2433      CLR	R3
    0190 0E28      ADD	R2,R24
    0191 1E39      ADC	R3,R25
    0192 2CC2      MOV	R12,R2
(0148)  if(WriteByte(temp))   //头字节
    0193 2D0C      MOV	R16,R12
    0194 DF03      RCALL	_WriteByte
    0195 2300      TST	R16
    0196 F009      BEQ	0x0198
(0149)  goto Wagain;
    0197 CFD7      RJMP	0x016F
(0150)  if(model>16)//写器件24c32以上地址高位
    0198 E180      LDI	R24,0x10
    0199 E090      LDI	R25,0
    019A 8808      LDD	R0,Y+16
    019B 8819      LDD	R1,Y+17
    019C 1580      CP	R24,R0
    019D 0591      CPC	R25,R1
    019E F440      BCC	0x01A7
(0151)  {
(0152)   if(WriteByte(addr>>8))//
    019F 890C      LDD	R16,Y+20
    01A0 891D      LDD	R17,Y+21
    01A1 2F01      MOV	R16,R17
    01A2 2711      CLR	R17
    01A3 DEF4      RCALL	_WriteByte
    01A4 2300      TST	R16
    01A5 F009      BEQ	0x01A7
(0153)   goto Wagain;
    01A6 CFC8      RJMP	0x016F
(0154)  }
(0155)  if(WriteByte(addr&0xff)) //写地址低位
    01A7 890C      LDD	R16,Y+20
    01A8 891D      LDD	R17,Y+21
    01A9 7010      ANDI	R17,0
    01AA DEED      RCALL	_WriteByte
    01AB 2300      TST	R16
    01AC F0E1      BEQ	0x01C9
(0156)  goto Wagain;
    01AD CFC1      RJMP	0x016F
(0157)  while(i)//写入数据i个
(0158)  {
(0159)   i--;				  	  
    01AE 94AA      DEC	R10
(0160)   if(WriteByte(*(p++)))goto Wagain;
    01AF 01F7      MOVW	R30,R14
    01B0 9101      LD	R16,Z+
    01B1 017F      MOVW	R14,R30
    01B2 DEE5      RCALL	_WriteByte
    01B3 2300      TST	R16
    01B4 F009      BEQ	0x01B6
    01B5 CFB9      RJMP	0x016F
(0161)   addr++;
    01B6 898C      LDD	R24,Y+20
    01B7 899D      LDD	R25,Y+21
    01B8 9601      ADIW	R24,1
    01B9 8B9D      STD	Y+21,R25
    01BA 8B8C      STD	Y+20,R24
(0162)   if(addr==next_page_start_addr)break;
    01BB 01FE      MOVW	R30,R28
    01BC 8020      LDD	R2,Z+0
    01BD 8031      LDD	R3,Z+1
    01BE 8042      LDD	R4,Z+2
    01BF 8053      LDD	R5,Z+3
    01C0 013C      MOVW	R6,R24
    01C1 2488      CLR	R8
    01C2 2499      CLR	R9
    01C3 1462      CP	R6,R2
    01C4 0473      CPC	R7,R3
    01C5 0484      CPC	R8,R4
    01C6 0495      CPC	R9,R5
    01C7 F409      BNE	0x01C9
    01C8 C002      RJMP	0x01CB
    01C9 20AA      TST	R10
    01CA F719      BNE	0x01AE
(0163)  }
(0164) Wstop:
(0165)  Stop();
    01CB DEED      RCALL	_Stop
(0166) if(i)//写到了页末,重新开始写新一页
    01CC 20AA      TST	R10
    01CD F409      BNE	0x01CF
    01CE C032      RJMP	0x0201
(0167)  { 
(0168)  Delay(100);
    01CF E604      LDI	R16,0x64
    01D0 E010      LDI	R17,0
    01D1 D093      RCALL	_Delay
(0169)  num=i;
    01D2 8EA8      STD	Y+24,R10
(0170)  P_data=p;
    01D3 8AFF      STD	Y+23,R15
    01D4 8AEE      STD	Y+22,R14
(0171)  next_page_start_addr+=page_size;
    01D5 802C      LDD	R2,Y+4
    01D6 2433      CLR	R3
    01D7 2444      CLR	R4
    01D8 2455      CLR	R5
    01D9 01FE      MOVW	R30,R28
    01DA 8060      LDD	R6,Z+0
    01DB 8071      LDD	R7,Z+1
    01DC 8082      LDD	R8,Z+2
    01DD 8093      LDD	R9,Z+3
    01DE 0C62      ADD	R6,R2
    01DF 1C73      ADC	R7,R3
    01E0 1C84      ADC	R8,R4
    01E1 1C95      ADC	R9,R5
    01E2 01FE      MOVW	R30,R28
    01E3 8260      STD	Z+0,R6
    01E4 8271      STD	Z+1,R7
    01E5 8282      STD	Z+2,R8
    01E6 8293      STD	Z+3,R9
(0172)  if(addr==model*128){addr=0;next_page_start_addr=page_size;}
    01E7 E800      LDI	R16,0x80
    01E8 E010      LDI	R17,0
    01E9 8928      LDD	R18,Y+16
    01EA 8939      LDD	R19,Y+17
    01EB 940E034E  CALL	empy16s
    01ED 880C      LDD	R0,Y+20
    01EE 881D      LDD	R1,Y+21
    01EF 1600      CP	R0,R16
    01F0 0611      CPC	R1,R17
    01F1 F009      BEQ	0x01F3
    01F2 CF7C      RJMP	0x016F
    01F3 2400      CLR	R0
    01F4 2411      CLR	R1
    01F5 8A1D      STD	Y+21,R1
    01F6 8A0C      STD	Y+20,R0
    01F7 802C      LDD	R2,Y+4
    01F8 2433      CLR	R3
    01F9 2444      CLR	R4
    01FA 2455      CLR	R5
    01FB 01FE      MOVW	R30,R28
    01FC 8220      STD	Z+0,R2
    01FD 8231      STD	Z+1,R3
    01FE 8242      STD	Z+2,R4
    01FF 8253      STD	Z+3,R5
(0173)  goto Wagain;
    0200 CF6E      RJMP	0x016F
(0174)  }
(0175) }
    0201 9626      ADIW	R28,6
    0202 940E0361  CALL	pop_gset5
    0204 9624      ADIW	R28,4
    0205 9508      RET
_AT24CxxRead:
  ICerror              --> R20
  temp                 --> R12
  p                    --> R10
  num                  --> R22
  P_data               --> R14
  addr                 --> Y+14
  DevAddr              --> Y+12
  model                --> Y+10
    0206 940E032D  CALL	push_arg4
    0208 940E0387  CALL	push_gset5
    020A 88E8      LDD	R14,Y+16
    020B 88F9      LDD	R15,Y+17
    020C 896A      LDD	R22,Y+18
(0176) //读数据,器件型号model,器件地址DevAddr,地址addr,存放到 *P_data,数据长度num
(0177) unsigned char AT24CxxRead(unsigned int model,unsigned char DevAddr,unsigned int addr,unsigned char *P_data,unsigned char num)
(0178) {
(0179)  unsigned char temp,*p,ICerror=0;
    020D 2744      CLR	R20
(0180) Ragain:
(0181)  if(ICerror<10)ICerror++;
    020E 304A      CPI	R20,0xA
    020F F008      BCS	0x0211
    0210 C04E      RJMP	0x025F
    0211 9543      INC	R20
(0182)  else goto Rstop;
(0183)  SDAout();
    0212 9AA1      SBI	0x14,1
(0184)  p=P_data;
    0213 0157      MOVW	R10,R14
(0185)  WriteStart();//
    0214 DE44      RCALL	_WriteStart
(0186)  temp=0xa0+(DevAddr<<1);
    0215 858C      LDD	R24,Y+12
    0216 0F88      LSL	R24
    0217 5680      SUBI	R24,0x60
    0218 2EC8      MOV	R12,R24
(0187)  if(model<16) temp+=((addr>>7)&0x0e);//器件24c32以下地址高位
    0219 858A      LDD	R24,Y+10
    021A 859B      LDD	R25,Y+11
    021B 3180      CPI	R24,0x10
    021C E0E0      LDI	R30,0
    021D 079E      CPC	R25,R30
    021E F470      BCC	0x022D
    021F E027      LDI	R18,7
    0220 E030      LDI	R19,0
    0221 850E      LDD	R16,Y+14
    0222 851F      LDD	R17,Y+15
    0223 940E0397  CALL	lsr16
    0225 01C8      MOVW	R24,R16
    0226 708E      ANDI	R24,0xE
    0227 7090      ANDI	R25,0
    0228 2C2C      MOV	R2,R12
    0229 2433      CLR	R3
    022A 0E28      ADD	R2,R24
    022B 1E39      ADC	R3,R25
    022C 2CC2      MOV	R12,R2
(0188)  if(WriteByte(temp))//;//头字节
    022D 2D0C      MOV	R16,R12
    022E DE69      RCALL	_WriteByte
    022F 2300      TST	R16
    0230 F009      BEQ	0x0232
(0189)  goto Ragain;
    0231 CFDC      RJMP	0x020E
(0190)  if(model>16)//器件24c32以上地址高位
    0232 E180      LDI	R24,0x10
    0233 E090      LDI	R25,0
    0234 840A      LDD	R0,Y+10
    0235 841B      LDD	R1,Y+11
    0236 1580      CP	R24,R0
    0237 0591      CPC	R25,R1
    0238 F440      BCC	0x0241
(0191)  {
(0192)   if(WriteByte(addr>>8))//
    0239 850E      LDD	R16,Y+14
    023A 851F      LDD	R17,Y+15
    023B 2F01      MOV	R16,R17
    023C 2711      CLR	R17
    023D DE5A      RCALL	_WriteByte
    023E 2300      TST	R16
    023F F009      BEQ	0x0241
(0193)   goto Ragain;
    0240 CFCD      RJMP	0x020E
(0194)  }
(0195)  if(WriteByte(addr&0xff))//
    0241 850E      LDD	R16,Y+14
    0242 851F      LDD	R17,Y+15
    0243 7010      ANDI	R17,0
    0244 DE53      RCALL	_WriteByte
    0245 2300      TST	R16
    0246 F009      BEQ	0x0248
(0196)  goto Ragain;
    0247 CFC6      RJMP	0x020E
(0197)  Ragain2:
(0198)  WriteStart();//
    0248 DE10      RCALL	_WriteStart
(0199)  if(WriteByte(temp|1))//
    0249 2D0C      MOV	R16,R12
    024A 6001      ORI	R16,1
    024B DE4C      RCALL	_WriteByte
    024C 2300      TST	R16
    024D F061      BEQ	0x025A
(0200)  goto Ragain2;
    024E CFF9      RJMP	0x0248
(0201)  while(num--)
(0202)  {
(0203)   *(p++)=ReadByte();//
    024F DE79      RCALL	_ReadByte
    0250 01F5      MOVW	R30,R10
    0251 9301      ST	R16,Z+
    0252 015F      MOVW	R10,R30
(0204)   if(num)WACK(0);
    0253 2366      TST	R22
    0254 F019      BEQ	0x0258
    0255 2700      CLR	R16
    0256 DE0E      RCALL	_WACK
    0257 C002      RJMP	0x025A
(0205)   else WACK(1);
    0258 E001      LDI	R16,1
    0259 DE0B      RCALL	_WACK
    025A 2E26      MOV	R2,R22
    025B 2433      CLR	R3
    025C 5061      SUBI	R22,1
    025D 2022      TST	R2
    025E F781      BNE	0x024F
(0206)  }
(0207)  Rstop:
(0208)  Stop();//
    025F DE59      RCALL	_Stop
(0209)  return(ICerror);
    0260 2F04      MOV	R16,R20
    0261 940E0361  CALL	pop_gset5
    0263 9624      ADIW	R28,4
    0264 9508      RET
(0210) }  
(0211)  /* * * * * * * * 一个简单延时程序 * * * * * * * * * * * * */ 
(0212)  void Delay(unsigned char DelayCount) 
(0213)   { while(DelayCount--); 
_Delay:
  DelayCount           --> R16
    0265 2E20      MOV	R2,R16
    0266 2433      CLR	R3
    0267 5001      SUBI	R16,1
    0268 2022      TST	R2
    0269 F7D9      BNE	0x0265
(0214)   } 
    026A 9508      RET
_main:
  pp                   --> R20
  p                    --> R22
  card                 --> Y+25
  card_read            --> Y+5
  i                    --> R20
    026B 97AD      SBIW	R28,0x2D
(0215) 
(0216) void main(void)
(0217) { char i;
(0218)   unsigned char card[20] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20},
    026C E584      LDI	R24,0x54
    026D E090      LDI	R25,0
    026E 01FE      MOVW	R30,R28
    026F 9679      ADIW	R30,0x19
    0270 E104      LDI	R16,0x14
    0271 E010      LDI	R17,0
    0272 93FA      ST	R31,-Y
    0273 93EA      ST	R30,-Y

⌨️ 快捷键说明

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