📄 main.lst
字号:
__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 + -