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

📄 main.lst

📁 AT24C256 读写 atmega16单片机( ICC )
💻 LST
📖 第 1 页 / 共 3 页
字号:
__text_start:
__start:
    0038 E5CF      LDI	R28,0x5F
    0039 E0D4      LDI	R29,4
    003A BFCD      OUT	0x3D,R28
    003B BFDE      OUT	0x3E,R29
    003C 52C0      SUBI	R28,0x20
    003D 40D0      SBCI	R29,0
    003E EA0A      LDI	R16,0xAA
    003F 8308      STD	Y+0,R16
    0040 2400      CLR	R0
    0041 E6E0      LDI	R30,0x60
    0042 E0F0      LDI	R31,0
    0043 E010      LDI	R17,0
    0044 36E0      CPI	R30,0x60
    0045 07F1      CPC	R31,R17
    0046 F011      BEQ	0x0049
    0047 9201      ST	R0,Z+
    0048 CFFB      RJMP	0x0044
    0049 8300      STD	Z+0,R16
    004A E7E0      LDI	R30,0x70
    004B E0F0      LDI	R31,0
    004C E6A0      LDI	R26,0x60
    004D E0B0      LDI	R27,0
    004E E010      LDI	R17,0
    004F 37E0      CPI	R30,0x70
    0050 07F1      CPC	R31,R17
    0051 F021      BEQ	0x0056
    0052 95C8      LPM
    0053 9631      ADIW	R30,1
    0054 920D      ST	R0,X+
    0055 CFF9      RJMP	0x004F
    0056 940E026B  CALL	_main
_exit:
    0058 CFFF      RJMP	_exit
FILE: E:\atmega16子函数\AT24C256\main.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) 
(0004) #define SDA1() PORTC|=1<<PC1   //数据输出 1
(0005) #define SDA0() PORTC&=~(1<<PC1) //数据输出 0
(0006) #define SDAout() DDRC|=1<<PC1   //数据线改为输出
(0007) #define SDAin() DDRC&=~(1<<PC1)  //数据线改为输入
(0008) #define RSDA() PINC&(1<<PC1)   //读数据
(0009) #define SCL1() PORTC|=1<<PC0   //时钟线输出1
(0010) #define SCL0() PORTC&=~(1<<PC0) //时钟线输出0
(0011) #define e2ptime 20
(0012)  
(0013) 
(0014) void WriteStart(void)//起始
(0015)  {
(0016)   SDA1();
_WriteStart:
    0059 9AA9      SBI	0x15,1
(0017)     Delay(e2ptime);//该函数为软件延时函数,根据需要自己去写吧
    005A E104      LDI	R16,0x14
    005B E010      LDI	R17,0
    005C D208      RCALL	_Delay
(0018)   SCL1();
    005D 9AA8      SBI	0x15,0
(0019)     Delay(e2ptime);
    005E E104      LDI	R16,0x14
    005F E010      LDI	R17,0
    0060 D204      RCALL	_Delay
(0020)   SDA0();
    0061 98A9      CBI	0x15,1
(0021)     Delay(e2ptime);
    0062 E104      LDI	R16,0x14
    0063 E010      LDI	R17,0
(0022)  // SCL0();
(0023)  }
    0064 C200      RJMP	_Delay
_WACK:
  a                    --> R20
    0065 940E0364  CALL	push_gset1
    0067 2F40      MOV	R20,R16
(0024) 
(0025) void WACK(unsigned char a)//输出ACK
(0026)  {
(0027)  SCL0();
    0068 98A8      CBI	0x15,0
(0028)  Delay(e2ptime);
    0069 E104      LDI	R16,0x14
    006A E010      LDI	R17,0
    006B D1F9      RCALL	_Delay
(0029)  SDA0();//
    006C 98A9      CBI	0x15,1
(0030)  if(a)SDA1();
    006D 2344      TST	R20
    006E F009      BEQ	0x0070
    006F 9AA9      SBI	0x15,1
(0031)  Delay(e2ptime);
    0070 E104      LDI	R16,0x14
    0071 E010      LDI	R17,0
    0072 D1F2      RCALL	_Delay
(0032)  SCL1();
    0073 9AA8      SBI	0x15,0
(0033)  Delay(e2ptime);
    0074 E104      LDI	R16,0x14
    0075 E010      LDI	R17,0
    0076 D1EE      RCALL	_Delay
(0034)  SCL0();
    0077 98A8      CBI	0x15,0
(0035)  }
    0078 940E0367  CALL	pop_gset1
    007A 9508      RET
_RACK:
  temp                 --> R20
    007B 940E0364  CALL	push_gset1
(0036) 
(0037) unsigned char RACK(void)//读ACK
(0038) {
(0039)  unsigned char temp=4;
    007D E044      LDI	R20,4
(0040)  SCL0();
    007E 98A8      CBI	0x15,0
(0041)  Delay(e2ptime);
    007F E104      LDI	R16,0x14
    0080 E010      LDI	R17,0
    0081 D1E3      RCALL	_Delay
(0042)  SDAin();//改成输入
    0082 98A1      CBI	0x14,1
(0043)  SDA1();//加上拉
    0083 9AA9      SBI	0x15,1
(0044)  SCL1();
    0084 9AA8      SBI	0x15,0
(0045)  Delay(e2ptime);
    0085 E104      LDI	R16,0x14
    0086 E010      LDI	R17,0
    0087 D1DD      RCALL	_Delay
    0088 C001      RJMP	0x008A
(0046)  while(RSDA()&&temp)temp--;
    0089 954A      DEC	R20
    008A 9B99      SBIS	0x13,1
    008B C002      RJMP	0x008E
    008C 2344      TST	R20
    008D F7D9      BNE	0x0089
(0047)  SCL0();
    008E 98A8      CBI	0x15,0
(0048)  SDAout();
    008F 9AA1      SBI	0x14,1
(0049)  if(temp)return(0);
    0090 2344      TST	R20
    0091 F011      BEQ	0x0094
    0092 2700      CLR	R16
    0093 C001      RJMP	0x0095
(0050)  else return(1);
    0094 E001      LDI	R16,1
    0095 940E0367  CALL	pop_gset1
    0097 9508      RET
_WriteByte:
  i                    --> R20
  a                    --> R22
    0098 940E037B  CALL	push_gset2
    009A 2F60      MOV	R22,R16
(0051) }
(0052) 
(0053) unsigned char WriteByte(unsigned char a)//写一个字节
(0054) {
(0055)  unsigned char i;
(0056)  SCL0();
    009B 98A8      CBI	0x15,0
(0057)  for(i=0x80;i;i>>=1)
    009C E840      LDI	R20,0x80
    009D C015      RJMP	0x00B3
(0058)  {
(0059)   Delay(e2ptime);
    009E E104      LDI	R16,0x14
    009F E010      LDI	R17,0
    00A0 D1C4      RCALL	_Delay
(0060)   if(a&i)SDA1();
    00A1 2E26      MOV	R2,R22
    00A2 2224      AND	R2,R20
    00A3 F011      BEQ	0x00A6
    00A4 9AA9      SBI	0x15,1
    00A5 C001      RJMP	0x00A7
(0061)   else SDA0();
    00A6 98A9      CBI	0x15,1
(0062)   Delay(e2ptime);
    00A7 E104      LDI	R16,0x14
    00A8 E010      LDI	R17,0
    00A9 D1BB      RCALL	_Delay
(0063)   SCL1();
    00AA 9AA8      SBI	0x15,0
(0064)   Delay(e2ptime);
    00AB E104      LDI	R16,0x14
    00AC E010      LDI	R17,0
    00AD D1B7      RCALL	_Delay
(0065)   SCL0();
    00AE 98A8      CBI	0x15,0
(0066)   Delay(e2ptime);
    00AF E104      LDI	R16,0x14
    00B0 E010      LDI	R17,0
    00B1 D1B3      RCALL	_Delay
    00B2 9546      LSR	R20
    00B3 2344      TST	R20
    00B4 F749      BNE	0x009E
(0067)  }
(0068)  return(RACK());
    00B5 DFC5      RCALL	_RACK
    00B6 940E035E  CALL	pop_gset2
    00B8 9508      RET
(0069) }
(0070) 
(0071) void Stop(void)//停止
(0072)  {
(0073)   SCL0();
_Stop:
    00B9 98A8      CBI	0x15,0
(0074)     Delay(e2ptime);
    00BA E104      LDI	R16,0x14
    00BB E010      LDI	R17,0
    00BC D1A8      RCALL	_Delay
(0075)   SDA0();//
    00BD 98A9      CBI	0x15,1
(0076)     Delay(e2ptime);
    00BE E104      LDI	R16,0x14
    00BF E010      LDI	R17,0
    00C0 D1A4      RCALL	_Delay
(0077)   SCL1();
    00C1 9AA8      SBI	0x15,0
(0078)     Delay(e2ptime);
    00C2 E104      LDI	R16,0x14
    00C3 E010      LDI	R17,0
    00C4 D1A0      RCALL	_Delay
(0079)   SDA1();
    00C5 9AA9      SBI	0x15,1
(0080)     Delay(e2ptime);////////////////
    00C6 E104      LDI	R16,0x14
    00C7 E010      LDI	R17,0
(0081)   //SCL0();/////////////
(0082)  }
    00C8 C19C      RJMP	_Delay
_ReadByte:
  temp                 --> R20
  i                    --> R22
    00C9 940E037B  CALL	push_gset2
(0083) 
(0084) char ReadByte(void) //读一个字节数据
(0085) {
(0086)   unsigned char temp,i;
(0087)   SCL0();
    00CB 98A8      CBI	0x15,0
(0088)   SDAin();
    00CC 98A1      CBI	0x14,1
(0089)   SDA1();
    00CD 9AA9      SBI	0x15,1
(0090)   for(i=0,temp=0;i<8;i++)
    00CE 2766      CLR	R22
    00CF 2744      CLR	R20
    00D0 C00D      RJMP	0x00DE
(0091)    {
(0092)    temp<<=1;
    00D1 0F44      LSL	R20
(0093)    SCL1();
    00D2 9AA8      SBI	0x15,0
(0094)    Delay(e2ptime);
    00D3 E104      LDI	R16,0x14
    00D4 E010      LDI	R17,0
    00D5 D18F      RCALL	_Delay
(0095)    if(RSDA())temp|=1;
    00D6 9B99      SBIS	0x13,1
    00D7 C001      RJMP	0x00D9
    00D8 6041      ORI	R20,1
(0096)    SCL0();
    00D9 98A8      CBI	0x15,0
(0097)    Delay(e2ptime);
    00DA E104      LDI	R16,0x14
    00DB E010      LDI	R17,0
    00DC D188      RCALL	_Delay
    00DD 9563      INC	R22
    00DE 3068      CPI	R22,0x8
    00DF F388      BCS	0x00D1
(0098)    }
(0099)   SDAout();
    00E0 9AA1      SBI	0x14,1
(0100)   return(temp);
    00E1 2F04      MOV	R16,R20
    00E2 940E035E  CALL	pop_gset2
    00E4 9508      RET
_AT24CxxWrite:
  ICerror              --> Y+5
  temp                 --> R12
  p                    --> R14
  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
    00E5 940E032D  CALL	push_arg4
    00E7 940E0387  CALL	push_gset5
    00E9 9726      SBIW	R28,6
(0101)  }
(0102)  /*
(0103) AT24C01 为128字节 (0x00-0x7f)
(0104) AT24C02 为256字节 (0x00-0xff)
(0105) AT24C04 为512字节 (0x000-0x1ff)
(0106) AT24C08 为1024字节(0x000-0x3ff)
(0107) AT24C16 为2048字节(0x000-0x7ff)
(0108) 
(0109) AT24C32 为4096字节(0x000-0xfff)
(0110) AT24C64 为8192字节(0x0000-0x1fff)
(0111) AT24C128 为16384字节(0x00-0x7ff)
(0112) AT24C256 容量为32768字节(0x0000-0x7fff)
(0113) AT24C512 容量为65536字节(0x0000-0xffff)
(0114) */
(0115)  //写入数据,器件型号model,器件地址DevAddr,开始地址addr,数据*P_data,数据长度num
(0116) void AT24CxxWrite(unsigned int model,unsigned char DevAddr,unsigned int addr,unsigned char *P_data,unsigned char num)
(0117)  {
(0118)  unsigned char i,temp,*p,ICerror=0,page_size;
    00EA 2400      CLR	R0
    00EB 820D      STD	Y+5,R0
(0119)  unsigned long next_page_start_addr;
(0120)  if(model<2)page_size=8;
    00EC 8988      LDD	R24,Y+16
    00ED 8999      LDD	R25,Y+17
    00EE 3082      CPI	R24,2
    00EF E0E0      LDI	R30,0
    00F0 079E      CPC	R25,R30
    00F1 F418      BCC	0x00F5
    00F2 E088      LDI	R24,0x8
    00F3 838C      STD	Y+4,R24
    00F4 C01D      RJMP	0x0112
(0121)  else if(model<32)page_size=16;
    00F5 8988      LDD	R24,Y+16
    00F6 8999      LDD	R25,Y+17
    00F7 3280      CPI	R24,0x20
    00F8 E0E0      LDI	R30,0
    00F9 079E      CPC	R25,R30
    00FA F418      BCC	0x00FE
    00FB E180      LDI	R24,0x10
    00FC 838C      STD	Y+4,R24
    00FD C014      RJMP	0x0112
(0122)    else if(model<128)page_size=32;
    00FE 8988      LDD	R24,Y+16
    00FF 8999      LDD	R25,Y+17
    0100 3880      CPI	R24,0x80
    0101 E0E0      LDI	R30,0
    0102 079E      CPC	R25,R30
    0103 F418      BCC	0x0107
    0104 E280      LDI	R24,0x20
    0105 838C      STD	Y+4,R24
    0106 C00B      RJMP	0x0112
(0123)      else if(model<512)page_size=64;
    0107 8988      LDD	R24,Y+16
    0108 8999      LDD	R25,Y+17
    0109 3080      CPI	R24,0
    010A E0E2      LDI	R30,2
    010B 079E      CPC	R25,R30
    010C F418      BCC	0x0110
    010D E480      LDI	R24,0x40
    010E 838C      STD	Y+4,R24
    010F C002      RJMP	0x0112
(0124)        else page_size=128;
    0110 E880      LDI	R24,0x80
    0111 838C      STD	Y+4,R24
(0125)  next_page_start_addr=model;
    0112 8828      LDD	R2,Y+16
    0113 8839      LDD	R3,Y+17
    0114 2444      CLR	R4
    0115 2455      CLR	R5
    0116 01FE      MOVW	R30,R28
    0117 8220      STD	Z+0,R2
    0118 8231      STD	Z+1,R3
    0119 8242      STD	Z+2,R4
    011A 8253      STD	Z+3,R5
(0126)  next_page_start_addr<<=7;//总容量
    011B E087      LDI	R24,7
    011C E090      LDI	R25,0
    011D 01FE      MOVW	R30,R28
    011E 8020      LDD	R2,Z+0
    011F 8031      LDD	R3,Z+1
    0120 8042      LDD	R4,Z+2
    0121 8053      LDD	R5,Z+3
    0122 938A      ST	R24,-Y
    0123 0181      MOVW	R16,R2
    0124 0192      MOVW	R18,R4
    0125 940E038B  CALL	lsl32
    0127 01FE      MOVW	R30,R28
    0128 8300      STD	Z+0,R16
    0129 8311      STD	Z+1,R17
    012A 8322      STD	Z+2,R18
    012B 8333      STD	Z+3,R19
    012C C033      RJMP	0x0160
(0127)  while(next_page_start_addr)
(0128)  {
(0129)   next_page_start_addr-=page_size;
    012D 802C      LDD	R2,Y+4
    012E 2433      CLR	R3
    012F 2444      CLR	R4
    0130 2455      CLR	R5
    0131 01FE      MOVW	R30,R28
    0132 8060      LDD	R6,Z+0
    0133 8071      LDD	R7,Z+1
    0134 8082      LDD	R8,Z+2
    0135 8093      LDD	R9,Z+3
    0136 1862      SUB	R6,R2
    0137 0873      SBC	R7,R3
    0138 0884      SBC	R8,R4
    0139 0895      SBC	R9,R5
    013A 01FE      MOVW	R30,R28
    013B 8260      STD	Z+0,R6
    013C 8271      STD	Z+1,R7
    013D 8282      STD	Z+2,R8
    013E 8293      STD	Z+3,R9

⌨️ 快捷键说明

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