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