📄 main.s
字号:
; i=num;//数据个数
ldd R10,y+24
.dbline 136
; if(ICerror<10)
ldd R24,y+5
cpi R24,10
brlo X1
xjmp L44
X1:
.dbline 137
; {
.dbline 138
; ICerror++;
mov R0,R24
inc R0
std y+5,R0
.dbline 139
; }
.dbline 141
; else
; {
.dbline 142
; goto Wstop;
L43:
.dbline 144
; }
; SDAout();
sbi 0x14,1
.dbline 145
; WriteStart(); //启动
xcall _WriteStart
.dbline 146
; temp=0xa0+(DevAddr<<1);
ldd R24,y+18
lsl R24
subi R24,96 ; addi 160
mov R12,R24
.dbline 147
; if(model<16) temp+=((addr>>7)&0x0e);//器件24c32以下地址高位
ldd R24,y+16
ldd R25,y+17
cpi R24,16
ldi R30,0
cpc R25,R30
brsh L45
.dbline 147
ldi R18,7
ldi R19,0
ldd R16,y+20
ldd R17,y+21
xcall lsr16
movw R24,R16
andi R24,14
andi R25,0
mov R2,R12
clr R3
add R2,R24
adc R3,R25
mov R12,R2
L45:
.dbline 148
; if(WriteByte(temp)) //头字节
mov R16,R12
xcall _WriteByte
tst R16
breq L47
.dbline 149
; goto Wagain;
xjmp L41
L47:
.dbline 150
; if(model>16)//写器件24c32以上地址高位
ldi R24,16
ldi R25,0
ldd R0,y+16
ldd R1,y+17
cp R24,R0
cpc R25,R1
brsh L49
.dbline 151
; {
.dbline 152
; if(WriteByte(addr>>8))//
ldd R16,y+20
ldd R17,y+21
mov R16,R17
clr R17
xcall _WriteByte
tst R16
breq L51
.dbline 153
; goto Wagain;
xjmp L41
L51:
.dbline 154
; }
L49:
.dbline 155
; if(WriteByte(addr&0xff)) //写地址低位
ldd R16,y+20
ldd R17,y+21
andi R17,0
xcall _WriteByte
tst R16
breq L56
.dbline 156
; goto Wagain;
xjmp L41
L55:
.dbline 158
; while(i)//写入数据i个
; {
.dbline 159
; i--;
dec R10
.dbline 160
; if(WriteByte(*(p++)))goto Wagain;
movw R30,R14
ld R16,Z+
movw R14,R30
xcall _WriteByte
tst R16
breq L58
.dbline 160
xjmp L41
L58:
.dbline 161
; addr++;
ldd R24,y+20
ldd R25,y+21
adiw R24,1
std y+21,R25
std y+20,R24
.dbline 162
; if(addr==next_page_start_addr)break;
movw R30,R28
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
movw R6,R24
clr R8
clr R9
cp R6,R2
cpc R7,R3
cpc R8,R4
cpc R9,R5
brne L60
.dbline 162
xjmp L57
L60:
.dbline 163
L56:
.dbline 157
tst R10
brne L55
L57:
L44:
.dbline 165
xcall _Stop
.dbline 166
tst R10
brne X2
xjmp L62
X2:
.dbline 167
.dbline 168
ldi R16,100
ldi R17,0
xcall _Delay
.dbline 169
std y+24,R10
.dbline 170
std y+23,R15
std y+22,R14
.dbline 171
ldd R2,y+4
clr R3
clr R4
clr R5
movw R30,R28
ldd R6,z+0
ldd R7,z+1
ldd R8,z+2
ldd R9,z+3
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
movw R30,R28
std z+0,R6
std z+1,R7
std z+2,R8
std z+3,R9
.dbline 172
ldi R16,128
ldi R17,0
ldd R18,y+16
ldd R19,y+17
xcall empy16s
ldd R0,y+20
ldd R1,y+21
cp R0,R16
cpc R1,R17
breq X3
xjmp L41
X3:
.dbline 172
.dbline 172
clr R0
clr R1
std y+21,R1
std y+20,R0
.dbline 172
ldd R2,y+4
clr R3
clr R4
clr R5
movw R30,R28
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
.dbline 172
.dbline 173
xjmp L41
L62:
.dbline -2
.dbline 175
; }
; Wstop:
; Stop();
; if(i)//写到了页末,重新开始写新一页
; {
; Delay(100);
; num=i;
; P_data=p;
; next_page_start_addr+=page_size;
; if(addr==model*128){addr=0;next_page_start_addr=page_size;}
; goto Wagain;
; }
; }
L27:
adiw R28,6
xcall pop_gset5
adiw R28,4
.dbline 0 ; func end
ret
.dbsym l ICerror 5 c
.dbsym r temp 12 c
.dbsym r p 14 pc
.dbsym l page_size 4 c
.dbsym r i 10 c
.dbsym l next_page_start_addr 0 l
.dbsym l num 24 c
.dbsym l P_data 22 pc
.dbsym l addr 20 i
.dbsym l DevAddr 18 c
.dbsym l model 16 i
.dbend
.dbfunc e AT24CxxRead _AT24CxxRead fc
; ICerror -> R20
; temp -> R12
; p -> R10,R11
; num -> R22
; P_data -> R14,R15
; addr -> y+14
; DevAddr -> y+12
; model -> y+10
.even
_AT24CxxRead::
xcall push_arg4
xcall push_gset5
ldd R14,y+16
ldd R15,y+17
ldd R22,y+18
.dbline -1
.dbline 178
; //读数据,器件型号model,器件地址DevAddr,地址addr,存放到 *P_data,数据长度num
; unsigned char AT24CxxRead(unsigned int model,unsigned char DevAddr,unsigned int addr,unsigned char *P_data,unsigned char num)
; {
.dbline 179
; unsigned char temp,*p,ICerror=0;
clr R20
L67:
.dbline 181
; Ragain:
; if(ICerror<10)ICerror++;
cpi R20,10
brlo X4
xjmp L70
X4:
.dbline 181
inc R20
.dbline 182
; else goto Rstop;
L69:
.dbline 183
; SDAout();
sbi 0x14,1
.dbline 184
; p=P_data;
movw R10,R14
.dbline 185
; WriteStart();//
xcall _WriteStart
.dbline 186
; temp=0xa0+(DevAddr<<1);
ldd R24,y+12
lsl R24
subi R24,96 ; addi 160
mov R12,R24
.dbline 187
; if(model<16) temp+=((addr>>7)&0x0e);//器件24c32以下地址高位
ldd R24,y+10
ldd R25,y+11
cpi R24,16
ldi R30,0
cpc R25,R30
brsh L71
.dbline 187
ldi R18,7
ldi R19,0
ldd R16,y+14
ldd R17,y+15
xcall lsr16
movw R24,R16
andi R24,14
andi R25,0
mov R2,R12
clr R3
add R2,R24
adc R3,R25
mov R12,R2
L71:
.dbline 188
; if(WriteByte(temp))//;//头字节
mov R16,R12
xcall _WriteByte
tst R16
breq L73
.dbline 189
; goto Ragain;
xjmp L67
L73:
.dbline 190
; if(model>16)//器件24c32以上地址高位
ldi R24,16
ldi R25,0
ldd R0,y+10
ldd R1,y+11
cp R24,R0
cpc R25,R1
brsh L75
.dbline 191
; {
.dbline 192
; if(WriteByte(addr>>8))//
ldd R16,y+14
ldd R17,y+15
mov R16,R17
clr R17
xcall _WriteByte
tst R16
breq L77
.dbline 193
; goto Ragain;
xjmp L67
L77:
.dbline 194
; }
L75:
.dbline 195
; if(WriteByte(addr&0xff))//
ldd R16,y+14
ldd R17,y+15
andi R17,0
xcall _WriteByte
tst R16
breq L79
.dbline 196
; goto Ragain;
xjmp L67
L79:
L81:
.dbline 198
; Ragain2:
; WriteStart();//
xcall _WriteStart
.dbline 199
; if(WriteByte(temp|1))//
mov R16,R12
ori R16,1
xcall _WriteByte
tst R16
breq L85
.dbline 200
; goto Ragain2;
xjmp L81
L84:
.dbline 202
; while(num--)
; {
.dbline 203
; *(p++)=ReadByte();//
xcall _ReadByte
movw R30,R10
st Z+,R16
movw R10,R30
.dbline 204
; if(num)WACK(0);
tst R22
breq L87
.dbline 204
clr R16
xcall _WACK
xjmp L88
L87:
.dbline 205
; else WACK(1);
ldi R16,1
xcall _WACK
L88:
.dbline 206
L85:
.dbline 201
mov R2,R22
clr R3
subi R22,1
tst R2
brne L84
L70:
.dbline 208
; }
; Rstop:
; Stop();//
xcall _Stop
.dbline 209
; return(ICerror);
mov R16,R20
.dbline -2
L66:
xcall pop_gset5
adiw R28,4
.dbline 0 ; func end
ret
.dbsym r ICerror 20 c
.dbsym r temp 12 c
.dbsym r p 10 pc
.dbsym r num 22 c
.dbsym r P_data 14 pc
.dbsym l addr 14 i
.dbsym l DevAddr 12 c
.dbsym l model 10 i
.dbend
.dbfunc e Delay _Delay fV
; DelayCount -> R16
.even
_Delay::
.dbline -1
.dbline 213
L90:
.dbline 213
L91:
.dbline 213
; }
; /* * * * * * * * 一个简单延时程序 * * * * * * * * * * * * */
; void Delay(unsigned char DelayCount)
; { while(DelayCount--);
mov R2,R16
clr R3
subi R16,1
tst R2
brne L90
.dbline -2
.dbline 214
; }
L89:
.dbline 0 ; func end
ret
.dbsym r DelayCount 16 c
.dbend
.area lit(rom, con, rel)
L94:
.byte 1,2
.byte 3,4
.byte 5,6
.byte 7,8
.byte 9,10
.byte 11,12
.byte 13,14
.byte 15,16
.byte 17,18
.byte 19,20
.area text(rom, con, rel)
.dbfile E:\atmega16子函数\AT24C256\main.c
.dbfunc e main _main fV
; pp -> R20,R21
; p -> R22,R23
; card -> y+25
; card_read -> y+5
; i -> R20
.even
_main::
sbiw R28,45
.dbline -1
.dbline 217
;
; void main(void)
; { char i;
.dbline 218
; unsigned char card[20] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20},
ldi R24,<L94
ldi R25,>L94
movw R30,R28
adiw R30,25
ldi R16,20
ldi R17,0
st -y,R31
st -y,R30
st -y,R25
st -y,R24
xcall asgncblk
.dbline 219
; *p=card,card_read[20],*pp=card_read;
movw R22,R28
subi R22,231 ; offset = 25
sbci R23,255
.dbline 219
movw R20,R28
subi R20,251 ; offset = 5
sbci R21,255
.dbline 222
; //*p = card;
; // pp = card_read;
; usart_init();
xcall _usart_init
.dbline 224
; //写入数据,器件型号model,器件地址DevAddr,开始地址addr,数据*P_data,数据长度num
; AT24CxxWrite(0x0100,0,20,p,12);
ldi R24,12
std y+4,R24
std y+3,R23
std y+2,R22
ldi R24,20
ldi R25,0
std y+1,R25
std y+0,R24
clr R18
ldi R16,256
ldi R17,1
xcall _AT24CxxWrite
.dbline 225
; Delay(e2ptime);
ldi R16,20
xcall _Delay
.dbline 226
; AT24CxxRead(0x0100,0,20,pp,12);
ldi R24,12
std y+4,R24
std y+3,R21
std y+2,R20
ldi R24,20
ldi R25,0
std y+1,R25
std y+0,R24
clr R18
ldi R16,256
ldi R17,1
xcall _AT24CxxRead
.dbline 227
; for(i=0;i<12;i++)
clr R20
xjmp L98
L95:
.dbline 228
.dbline 229
movw R24,R28
adiw R24,5
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
out 0xc,R2
.dbline 230
L96:
.dbline 227
inc R20
L98:
.dbline 227
cpi R20,12
brlo L95
.dbline -2
.dbline 232
; {
; UDR = card_read[i];
; }
;
; }
L93:
adiw R28,45
.dbline 0 ; func end
ret
.dbsym r pp 20 pc
.dbsym r p 22 pc
.dbsym l card 25 A[20:20]c
.dbsym l card_read 5 A[20:20]c
.dbsym r i 20 c
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -