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

📄 test.lst

📁 24IIC的源代码
💻 LST
📖 第 1 页 / 共 3 页
字号:
__text_start:
__start:
      46 E5CF      LDI	R28,0x5F
      47 E0D4      LDI	R29,4
      48 BFCD      OUT	0x3D,R28
      49 BFDE      OUT	0x3E,R29
      4A 51C0      SUBI	R28,0x10
      4B 40D0      SBCI	R29,0
      4C EA0A      LDI	R16,0xAA
      4D 8308      STD	Y+0,R16
      4E 2400      CLR	R0
      4F E7E1      LDI	R30,0x71
      50 E0F0      LDI	R31,0
      51 E010      LDI	R17,0
      52 37E1      CPI	R30,0x71
      53 07F1      CPC	R31,R17
      54 F011      BEQ	0x0057
      55 9201      ST	R0,Z+
      56 CFFB      RJMP	0x0052
      57 8300      STD	Z+0,R16
      58 E7EA      LDI	R30,0x7A
      59 E0F0      LDI	R31,0
      5A E6A0      LDI	R26,0x60
      5B E0B0      LDI	R27,0
      5C E010      LDI	R17,0
      5D E000      LDI	R16,0
      5E BF0B      OUT	0x3B,R16
      5F 38EB      CPI	R30,0x8B
      60 07F1      CPC	R31,R17
      61 F021      BEQ	0x0066
      62 95C8      LPM
      63 9631      ADIW	R30,1
      64 920D      ST	R0,X+
      65 CFF9      RJMP	0x005F
      66 D24B      RCALL	_main
_exit:
      67 CFFF      RJMP	_exit
FILE: D:\mega16_32实验板资料\ICCAVR源程序\twi\24c64\连续读写\delay.h
(0001) /**********延时函数*****************/
(0002) /*-----------------------------------------------
(0003) delay_us	   :1us延时函数
(0004) ------------------------------------------------*/
(0005) void delay_1us(void)
(0006) {
(0007)  asm("nop");
_delay_1us:
      68 0000      NOP
      69 9508      RET
_delay_us:
  t                    --> R20
      6A 934A      ST	R20,-Y
      6B 935A      ST	R21,-Y
      6C 01A8      MOVW	R20,R16
(0008) }
(0009) /*-----------------------------------------------
(0010) delay_nus          :长延时函数
(0011) 输入参数: t        :延时时间 us
(0012) ------------------------------------------------*/
(0013) void delay_us(unsigned int t)
(0014) {
      6D C001      RJMP	0x006F
(0015)  while(t--)
(0016)   delay_1us();
      6E DFF9      RCALL	_delay_1us
      6F 011A      MOVW	R2,R20
      70 5041      SUBI	R20,1
      71 4050      SBCI	R21,0
      72 2022      TST	R2
      73 F7D1      BNE	0x006E
      74 2033      TST	R3
      75 F7C1      BNE	0x006E
      76 9159      LD	R21,Y+
      77 9149      LD	R20,Y+
      78 9508      RET
(0017) }
(0018) /*----------------------------------------------
(0019) delay_ms	   :1ms延时函数
(0020) -----------------------------------------------*/
(0021) void delay_1ms(void)
(0022) {
(0023)  unsigned int i;
(0024)  for(i=0;i<1140;i++);
_delay_1ms:
  i                    --> R16
      79 2700      CLR	R16
      7A 2711      CLR	R17
      7B C002      RJMP	0x007E
      7C 5F0F      SUBI	R16,0xFF
      7D 4F1F      SBCI	R17,0xFF
      7E 3704      CPI	R16,0x74
      7F E0E4      LDI	R30,4
      80 071E      CPC	R17,R30
      81 F3D0      BCS	0x007C
      82 9508      RET
_delay_ms:
  t                    --> R20
      83 934A      ST	R20,-Y
      84 935A      ST	R21,-Y
      85 01A8      MOVW	R20,R16
(0025) }
(0026) /*----------------------------------------------
(0027) delay_nms          :长延时函数
(0028) 输入参数: t        :延时时间 ms
(0029) -----------------------------------------------*/
(0030) void delay_ms(unsigned int t)
(0031) {
      86 C001      RJMP	0x0088
(0032)  while(t--)
(0033)   delay_1ms();
      87 DFF1      RCALL	_delay_1ms
      88 011A      MOVW	R2,R20
      89 5041      SUBI	R20,1
      8A 4050      SBCI	R21,0
      8B 2022      TST	R2
      8C F7D1      BNE	0x0087
      8D 2033      TST	R3
      8E F7C1      BNE	0x0087
      8F 9159      LD	R21,Y+
      90 9149      LD	R20,Y+
      91 9508      RET
FILE: D:\mega16_32实验板资料\ICCAVR源程序\twi\24c64\连续读写\24cxx.h
(0001) /*------------------------------------------------------------------
(0002) 
(0003) ------------------------------------------------------------------*/
(0004) #define Start()     (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))   
(0005) #define Stop()      (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)) //总线上起动停止条件
(0006) #define Wait()      {while(!(TWCR&(1<<TWINT)));} 
(0007) #define TW_STATUS	(TWSR&0xf8)
(0008) #define Twi()       (TWCR=(1<<TWINT)|(1<<TWEN)) 
(0009) 
(0010) //写入数据,器件型号model,器件地址DevAddr,开始地址addr,数据*P_data,数据长度num
(0011) unsigned char AT24CxxWrite(unsigned int model,unsigned char DevAddr,unsigned int addr,unsigned char *P_data,unsigned char num);
(0012) //读数据,器件型号model,器件地址DevAddr,地址addr,存放到 *P_data,数据长度num
(0013) unsigned char AT24CxxRead(unsigned int model,unsigned char DevAddr,unsigned int addr,unsigned char *P_data,unsigned char num);
(0014) 
(0015) //总线上起动开始条件 
(0016) unsigned char twi_start(void) 
(0017) {
(0018)  Start(); 
_twi_start:
      92 EA84      LDI	R24,0xA4
      93 BF86      OUT	0x36,R24
(0019)  Wait();
      94 940E 03D2 CALL	0x03D2
(0020)  delay_us(100);
      96 DFD3      RCALL	_delay_us
(0021)  return TW_STATUS; 
      97 B101      IN	R16,0x01
      98 7F08      ANDI	R16,0xF8
      99 9508      RET
_twi_writebyte:
  c                    --> R10
      9A 92AA      ST	R10,-Y
      9B 2EA0      MOV	R10,R16
(0022) }
(0023) 
(0024) //写一字节 
(0025) unsigned char twi_writebyte(unsigned char c) 
(0026) {
(0027)  TWDR=c; 
      9C B8A3      OUT	0x03,R10
(0028)  Twi(); 
      9D E884      LDI	R24,0x84
      9E BF86      OUT	0x36,R24
(0029)  Wait(); 
      9F 940E 03D2 CALL	0x03D2
(0030)  delay_us(100);
      A1 DFC8      RCALL	_delay_us
(0031)  return TW_STATUS; 
      A2 B101      IN	R16,0x01
      A3 7F08      ANDI	R16,0xF8
      A4 90A9      LD	R10,Y+
      A5 9508      RET
_twi_readbyte:
  tmp                  --> R20
  ack                  --> R12
  c                    --> R10
      A6 D2B0      RCALL	push_xgset303C
      A7 2EC2      MOV	R12,R18
      A8 0158      MOVW	R10,R16
(0032) }
(0033) 
(0034) //读一字节 ack: true时发ACK,false时发NACK 
(0035) unsigned char twi_readbyte(unsigned char *c ,unsigned char ack) 
(0036) {
(0037)  unsigned char tmp=(1<<TWINT)|(1<<TWEN); 
      A9 E844      LDI	R20,0x84
(0038)  if(ack) tmp|=(1<<TWEA); 
      AA 20CC      TST	R12
      AB F009      BEQ	0x00AD
      AC 6440      ORI	R20,0x40
(0039)  TWCR=tmp;
      AD BF46      OUT	0x36,R20
(0040)  Wait(); 
      AE 940E 03D2 CALL	0x03D2
(0041)  delay_us(100);
      B0 DFB9      RCALL	_delay_us
(0042)  *c=TWDR; 
      B1 B023      IN	R2,0x03
      B2 01F5      MOVW	R30,R10
      B3 8220      STD	Z+0,R2
(0043)  return TW_STATUS; 
      B4 B101      IN	R16,0x01
      B5 7F08      ANDI	R16,0xF8
      B6 C2A7      RJMP	pop_xgset303C
_AT24CxxWrite:
  temp                 --> R14
  ICerror              --> Y,+5
  p                    --> R12
  page_size            --> Y,+4
  i                    --> R10
  next_page_start_addr --> Y,+0
  num                  --> Y,+24
  P_data               --> Y,+22
  addr                 --> Y,+20
  DevAddr              --> Y,+18
  model                --> Y,+16
      B7 D236      RCALL	push_arg4
      B8 D287      RCALL	push_xgsetF0FC
      B9 9726      SBIW	R28,6
(0044) }
(0045) 
(0046) //写入数据,器件型号model,器件地址DevAddr,开始地址addr,数据*P_data,数据长度num
(0047) unsigned char AT24CxxWrite(unsigned int model,unsigned char DevAddr,unsigned int addr,unsigned char *P_data,unsigned char num)
(0048) {
(0049)  unsigned char i,temp,*p,ICerror=0,page_size;
      BA 2400      CLR	R0
      BB 820D      STD	Y+5,R0
(0050)  unsigned long next_page_start_addr;
(0051)  if(model<=2)
      BC E082      LDI	R24,2
      BD 940E 03E9 CALL	0x03E9
      BF F018      BCS	0x00C3
(0052)   page_size=8;
      C0 E088      LDI	R24,0x8
      C1 838C      STD	Y+4,R24
      C2 C01D      RJMP	0x00E0
(0053)  else if(model<32)
      C3 8988      LDD	R24,Y+16
      C4 8999      LDD	R25,Y+17
      C5 3280      CPI	R24,0x20
      C6 E0E0      LDI	R30,0
      C7 079E      CPC	R25,R30
      C8 F418      BCC	0x00CC
(0054)   page_size=16;
      C9 E180      LDI	R24,0x10
      CA 838C      STD	Y+4,R24
      CB C014      RJMP	0x00E0
(0055)  else if(model<128)
      CC 8988      LDD	R24,Y+16
      CD 8999      LDD	R25,Y+17
      CE 3880      CPI	R24,0x80
      CF E0E0      LDI	R30,0
      D0 079E      CPC	R25,R30
      D1 F418      BCC	0x00D5
(0056)   page_size=32;
      D2 E280      LDI	R24,0x20
      D3 838C      STD	Y+4,R24
      D4 C00B      RJMP	0x00E0
(0057)  else if(model<512)
      D5 8988      LDD	R24,Y+16
      D6 8999      LDD	R25,Y+17
      D7 3080      CPI	R24,0
      D8 E0E2      LDI	R30,2
      D9 079E      CPC	R25,R30
      DA F418      BCC	0x00DE
(0058)   page_size=64;
      DB E480      LDI	R24,0x40
      DC 838C      STD	Y+4,R24
      DD C002      RJMP	0x00E0
(0059)  else 
(0060)   page_size=128;
      DE E880      LDI	R24,0x80
      DF 838C      STD	Y+4,R24
(0061)  next_page_start_addr=model;
      E0 8828      LDD	R2,Y+16
      E1 8839      LDD	R3,Y+17
      E2 2444      CLR	R4
      E3 2455      CLR	R5
      E4 8228      STD	Y+0,R2
      E5 8239      STD	Y+1,R3
      E6 824A      STD	Y+2,R4
      E7 825B      STD	Y+3,R5
(0062)  next_page_start_addr<<=7;//总容量
      E8 E087      LDI	R24,7
      E9 E090      LDI	R25,0
      EA 8108      LDD	R16,Y+0
      EB 8119      LDD	R17,Y+1
      EC 812A      LDD	R18,Y+2
      ED 813B      LDD	R19,Y+3
      EE 938A      ST	R24,-Y
      EF D281      RCALL	lsl32
      F0 8308      STD	Y+0,R16
      F1 8319      STD	Y+1,R17
      F2 832A      STD	Y+2,R18
      F3 833B      STD	Y+3,R19
      F4 C01A      RJMP	0x010F
(0063)  while(next_page_start_addr)
(0064)  {
(0065)   next_page_start_addr-=page_size;
      F5 802C      LDD	R2,Y+4
      F6 2433      CLR	R3
      F7 940E 03AF CALL	0x03AF
      F9 1862      SUB	R6,R2
      FA 0873      SBC	R7,R3
      FB 0884      SBC	R8,R4
      FC 0895      SBC	R9,R5
      FD 8268      STD	Y+0,R6
      FE 8279      STD	Y+1,R7
      FF 828A      STD	Y+2,R8
     100 829B      STD	Y+3,R9
(0066)   if(next_page_start_addr<=addr)
     101 882C      LDD	R2,Y+20
     102 883D      LDD	R3,Y+21
     103 940E 03AF CALL	0x03AF
     105 1426      CP	R2,R6
     106 0437      CPC	R3,R7
     107 0448      CPC	R4,R8
     108 0459      CPC	R5,R9
     109 F028      BCS	0x010F
     10A 940E 03C8 CALL	0x03C8
     10C 940E 03B6 CALL	0x03B6
(0067)   {
(0068)    next_page_start_addr+=page_size;
(0069)    break;
     10E C00B      RJMP	0x011A
     10F E040      LDI	R20,0
     110 E050      LDI	R21,0
     111 E060      LDI	R22,0
     112 E070      LDI	R23,0
     113 940E 03EF CALL	0x03EF
     115 1624      CP	R2,R20
     116 0635      CPC	R3,R21
     117 0646      CPC	R4,R22
     118 0657      CPC	R5,R23
     119 F6D9      BNE	0x00F5
(0070)   }
(0071)  }
(0072) 
(0073)  Wagain:
(0074)   p=P_data;
     11A 88CE      LDD	R12,Y+22
     11B 88DF      LDD	R13,Y+23
(0075)  i=num;//数据个数
     11C 8CA8      LDD	R10,Y+24
(0076)  if(ICerror<10)
     11D 818D      LDD	R24,Y+5
     11E 308A      CPI	R24,0xA
     11F F008      BCS	0x0121
     120 C04E      RJMP	0x016F
(0077)   ICerror++;
     121 2E08      MOV	R0,R24
     122 9403      INC	R0
     123 820D      STD	Y+5,R0
(0078)  else 
(0079)   goto Wstop;
(0080)  twi_start(); //启动
     124 DF6D      RCALL	_twi_start
(0081)  temp=0xa0+(DevAddr<<1);
     125 898A      LDD	R24,Y+18
     126 0F88      LSL	R24
     127 5680      SUBI	R24,0x60
     128 2EE8      MOV	R14,R24
(0082)  if(model<16) 
     129 8988      LDD	R24,Y+16
     12A 8999      LDD	R25,Y+17
     12B 3180      CPI	R24,0x10
     12C E0E0      LDI	R30,0
     12D 079E      CPC	R25,R30
     12E F468      BCC	0x013C
(0083)   temp+=((addr>>7)&0x0e);//器件24c32以下地址高位
     12F E027      LDI	R18,7
     130 E030      LDI	R19,0
     131 890C      LDD	R16,Y+20
     132 891D      LDD	R17,Y+21
     133 D249      RCALL	lsr16
     134 01C8      MOVW	R24,R16
     135 708E      ANDI	R24,0xE
     136 7090      ANDI	R25,0
     137 2C2E      MOV	R2,R14
     138 2433      CLR	R3
     139 0E28      ADD	R2,R24
     13A 1E39      ADC	R3,R25
     13B 2CE2      MOV	R14,R2
(0084)  if(twi_writebyte(temp)!=0x18)// //头字节
     13C 2D0E      MOV	R16,R14
     13D DF5C      RCALL	_twi_writebyte
     13E 3108      CPI	R16,0x18
     13F F009      BEQ	0x0141
(0085)  goto Wagain;
     140 CFD9      RJMP	0x011A
(0086)  if(model>16) //写器件24c32以上地址高位
     141 E180      LDI	R24,0x10
     142 940E 03E9 CALL	0x03E9
     144 F440      BCC	0x014D
(0087)  {
(0088)   if((twi_writebyte(addr>>8)!=0x28))//
     145 890C      LDD	R16,Y+20
     146 891D      LDD	R17,Y+21
     147 2F01      MOV	R16,R17
     148 2711      CLR	R17
     149 DF50      RCALL	_twi_writebyte
     14A 3208      CPI	R16,0x28
     14B F009      BEQ	0x014D
(0089)   goto Wagain;
     14C CFCD      RJMP	0x011A
(0090)  }
(0091)  if((twi_writebyte(addr&0xff)!=0x28)) //写地址低位
     14D 890C      LDD	R16,Y+20
     14E 7010      ANDI	R17,0
     14F DF4A      RCALL	_twi_writebyte
     150 2EE0      MOV	R14,R16
     151 3208      CPI	R16,0x28
     152 F0D1      BEQ	0x016D
(0092)  goto Wagain;
     153 CFC6      RJMP	0x011A
(0093)  while(i)//写入数据i个
(0094)  {
(0095)   i--;
     154 94AA      DEC	R10
(0096)   if(twi_writebyte(*(p++))!=0x28)//
     155 01F6      MOVW	R30,R12
     156 9101      LD	R16,Z+
     157 016F      MOVW	R12,R30
     158 DF41      RCALL	_twi_writebyte
     159 2EE0      MOV	R14,R16
     15A 3208      CPI	R16,0x28
     15B F009      BEQ	0x015D
(0097)   goto Wagain;
     15C CFBD      RJMP	0x011A
(0098)   addr++;
     15D 898C      LDD	R24,Y+20
     15E 899D      LDD	R25,Y+21
     15F 9601      ADIW	R24,1
     160 8B9D      STD	Y+21,R25
     161 8B8C      STD	Y+20,R24
     162 940E 03EF CALL	0x03EF
(0099)   if(addr==next_page_start_addr)break;
     164 013C      MOVW	R6,R24
     165 2488      CLR	R8
     166 2499      CLR	R9
     167 1462      CP	R6,R2
     168 0473      CPC	R7,R3
     169 0484      CPC	R8,R4
     16A 0495      CPC	R9,R5
     16B F409      BNE	0x016D
     16C C002      RJMP	0x016F
     16D 20AA      TST	R10
     16E F729      BNE	0x0154
(0100)  }
(0101)  Wstop:
(0102)   Stop();
     16F E984      LDI	R24,0x94
     170 BF86      OUT	0x36,R24
(0103)  if(i)//写到了页末,重新开始写新一页
     171 20AA      TST	R10
     172 F111      BEQ	0x0195
(0104)  { 
(0105)   delay_ms(50);
     173 E302      LDI	R16,0x32
     174 E010      LDI	R17,0

⌨️ 快捷键说明

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