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