📄 main.s
字号:
.module main.c
.area text(rom, con, rel)
.dbfile E:\atmega16子函数\AT24C256\main.c
.dbfunc e WriteStart _WriteStart fV
.even
_WriteStart::
.dbline -1
.dbline 15
; #include <iom16v.h>
; #include <macros.h>
;
; #define SDA1() PORTC|=1<<PC1 //数据输出 1
; #define SDA0() PORTC&=~(1<<PC1) //数据输出 0
; #define SDAout() DDRC|=1<<PC1 //数据线改为输出
; #define SDAin() DDRC&=~(1<<PC1) //数据线改为输入
; #define RSDA() PINC&(1<<PC1) //读数据
; #define SCL1() PORTC|=1<<PC0 //时钟线输出1
; #define SCL0() PORTC&=~(1<<PC0) //时钟线输出0
; #define e2ptime 20
;
;
; void WriteStart(void)//起始
; {
.dbline 16
; SDA1();
sbi 0x15,1
.dbline 17
; Delay(e2ptime);//该函数为软件延时函数,根据需要自己去写吧
ldi R16,20
ldi R17,0
xcall _Delay
.dbline 18
; SCL1();
sbi 0x15,0
.dbline 19
; Delay(e2ptime);
ldi R16,20
ldi R17,0
xcall _Delay
.dbline 20
; SDA0();
cbi 0x15,1
.dbline 21
; Delay(e2ptime);
ldi R16,20
ldi R17,0
.dbline -2
.dbline 23
; // SCL0();
; }
L1:
.dbline 0 ; func end
xjmp _Delay
.dbend
.dbfunc e WACK _WACK fV
; a -> R20
.even
_WACK::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 26
;
; void WACK(unsigned char a)//输出ACK
; {
.dbline 27
; SCL0();
cbi 0x15,0
.dbline 28
; Delay(e2ptime);
ldi R16,20
ldi R17,0
xcall _Delay
.dbline 29
; SDA0();//
cbi 0x15,1
.dbline 30
; if(a)SDA1();
tst R20
breq L3
.dbline 30
sbi 0x15,1
L3:
.dbline 31
; Delay(e2ptime);
ldi R16,20
ldi R17,0
xcall _Delay
.dbline 32
; SCL1();
sbi 0x15,0
.dbline 33
; Delay(e2ptime);
ldi R16,20
ldi R17,0
xcall _Delay
.dbline 34
; SCL0();
cbi 0x15,0
.dbline -2
.dbline 35
; }
L2:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r a 20 c
.dbend
.dbfunc e RACK _RACK fc
; temp -> R20
.even
_RACK::
xcall push_gset1
.dbline -1
.dbline 38
;
; unsigned char RACK(void)//读ACK
; {
.dbline 39
; unsigned char temp=4;
ldi R20,4
.dbline 40
; SCL0();
cbi 0x15,0
.dbline 41
; Delay(e2ptime);
ldi R16,20
ldi R17,0
xcall _Delay
.dbline 42
; SDAin();//改成输入
cbi 0x14,1
.dbline 43
; SDA1();//加上拉
sbi 0x15,1
.dbline 44
; SCL1();
sbi 0x15,0
.dbline 45
; Delay(e2ptime);
ldi R16,20
ldi R17,0
xcall _Delay
xjmp L7
L6:
.dbline 46
dec R20
L7:
.dbline 46
; while(RSDA()&&temp)temp--;
sbis 0x13,1
rjmp L9
tst R20
brne L6
L9:
.dbline 47
; SCL0();
cbi 0x15,0
.dbline 48
; SDAout();
sbi 0x14,1
.dbline 49
; if(temp)return(0);
tst R20
breq L10
.dbline 49
clr R16
xjmp L5
L10:
.dbline 50
; else return(1);
ldi R16,1
.dbline -2
L5:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r temp 20 c
.dbend
.dbfunc e WriteByte _WriteByte fc
; i -> R20
; a -> R22
.even
_WriteByte::
xcall push_gset2
mov R22,R16
.dbline -1
.dbline 54
; }
;
; unsigned char WriteByte(unsigned char a)//写一个字节
; {
.dbline 56
; unsigned char i;
; SCL0();
cbi 0x15,0
.dbline 57
; for(i=0x80;i;i>>=1)
ldi R20,128
xjmp L16
L13:
.dbline 58
; {
.dbline 59
; Delay(e2ptime);
ldi R16,20
ldi R17,0
xcall _Delay
.dbline 60
; if(a&i)SDA1();
mov R2,R22
and R2,R20
breq L17
.dbline 60
sbi 0x15,1
xjmp L18
L17:
.dbline 61
; else SDA0();
cbi 0x15,1
L18:
.dbline 62
ldi R16,20
ldi R17,0
xcall _Delay
.dbline 63
sbi 0x15,0
.dbline 64
ldi R16,20
ldi R17,0
xcall _Delay
.dbline 65
cbi 0x15,0
.dbline 66
ldi R16,20
ldi R17,0
xcall _Delay
.dbline 67
L14:
.dbline 57
lsr R20
L16:
.dbline 57
tst R20
brne L13
.dbline 68
; Delay(e2ptime);
; SCL1();
; Delay(e2ptime);
; SCL0();
; Delay(e2ptime);
; }
; return(RACK());
xcall _RACK
.dbline -2
L12:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r a 22 c
.dbend
.dbfunc e Stop _Stop fV
.even
_Stop::
.dbline -1
.dbline 72
; }
;
; void Stop(void)//停止
; {
.dbline 73
; SCL0();
cbi 0x15,0
.dbline 74
; Delay(e2ptime);
ldi R16,20
ldi R17,0
xcall _Delay
.dbline 75
; SDA0();//
cbi 0x15,1
.dbline 76
; Delay(e2ptime);
ldi R16,20
ldi R17,0
xcall _Delay
.dbline 77
; SCL1();
sbi 0x15,0
.dbline 78
; Delay(e2ptime);
ldi R16,20
ldi R17,0
xcall _Delay
.dbline 79
; SDA1();
sbi 0x15,1
.dbline 80
; Delay(e2ptime);////////////////
ldi R16,20
ldi R17,0
.dbline -2
.dbline 82
; //SCL0();/////////////
; }
L19:
.dbline 0 ; func end
xjmp _Delay
.dbend
.dbfunc e ReadByte _ReadByte fc
; temp -> R20
; i -> R22
.even
_ReadByte::
xcall push_gset2
.dbline -1
.dbline 85
;
; char ReadByte(void) //读一个字节数据
; {
.dbline 87
; unsigned char temp,i;
; SCL0();
cbi 0x15,0
.dbline 88
; SDAin();
cbi 0x14,1
.dbline 89
; SDA1();
sbi 0x15,1
.dbline 90
; for(i=0,temp=0;i<8;i++)
clr R22
clr R20
xjmp L24
L21:
.dbline 91
; {
.dbline 92
; temp<<=1;
lsl R20
.dbline 93
; SCL1();
sbi 0x15,0
.dbline 94
; Delay(e2ptime);
ldi R16,20
ldi R17,0
xcall _Delay
.dbline 95
; if(RSDA())temp|=1;
sbis 0x13,1
rjmp L25
.dbline 95
ori R20,1
L25:
.dbline 96
cbi 0x15,0
.dbline 97
ldi R16,20
ldi R17,0
xcall _Delay
.dbline 98
L22:
.dbline 90
inc R22
L24:
.dbline 90
cpi R22,8
brlo L21
.dbline 99
; SCL0();
; Delay(e2ptime);
; }
; SDAout();
sbi 0x14,1
.dbline 100
; return(temp);
mov R16,R20
.dbline -2
L20:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r temp 20 c
.dbsym r i 22 c
.dbend
.dbfunc e AT24CxxWrite _AT24CxxWrite fV
; ICerror -> y+5
; temp -> R12
; p -> R14,R15
; 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
.even
_AT24CxxWrite::
xcall push_arg4
xcall push_gset5
sbiw R28,6
.dbline -1
.dbline 117
; }
; /*
; AT24C01 为128字节 (0x00-0x7f)
; AT24C02 为256字节 (0x00-0xff)
; AT24C04 为512字节 (0x000-0x1ff)
; AT24C08 为1024字节(0x000-0x3ff)
; AT24C16 为2048字节(0x000-0x7ff)
;
; AT24C32 为4096字节(0x000-0xfff)
; AT24C64 为8192字节(0x0000-0x1fff)
; AT24C128 为16384字节(0x00-0x7ff)
; AT24C256 容量为32768字节(0x0000-0x7fff)
; AT24C512 容量为65536字节(0x0000-0xffff)
; */
; //写入数据,器件型号model,器件地址DevAddr,开始地址addr,数据*P_data,数据长度num
; void AT24CxxWrite(unsigned int model,unsigned char DevAddr,unsigned int addr,unsigned char *P_data,unsigned char num)
; {
.dbline 118
; unsigned char i,temp,*p,ICerror=0,page_size;
clr R0
std y+5,R0
.dbline 120
; unsigned long next_page_start_addr;
; if(model<2)page_size=8;
ldd R24,y+16
ldd R25,y+17
cpi R24,2
ldi R30,0
cpc R25,R30
brsh L28
.dbline 120
ldi R24,8
std y+4,R24
xjmp L29
L28:
.dbline 121
; else if(model<32)page_size=16;
ldd R24,y+16
ldd R25,y+17
cpi R24,32
ldi R30,0
cpc R25,R30
brsh L30
.dbline 121
ldi R24,16
std y+4,R24
xjmp L31
L30:
.dbline 122
; else if(model<128)page_size=32;
ldd R24,y+16
ldd R25,y+17
cpi R24,128
ldi R30,0
cpc R25,R30
brsh L32
.dbline 122
ldi R24,32
std y+4,R24
xjmp L33
L32:
.dbline 123
; else if(model<512)page_size=64;
ldd R24,y+16
ldd R25,y+17
cpi R24,0
ldi R30,2
cpc R25,R30
brsh L34
.dbline 123
ldi R24,64
std y+4,R24
xjmp L35
L34:
.dbline 124
; else page_size=128;
ldi R24,128
std y+4,R24
L35:
L33:
L31:
L29:
.dbline 125
; next_page_start_addr=model;
ldd R2,y+16
ldd R3,y+17
clr R4
clr R5
movw R30,R28
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
.dbline 126
; next_page_start_addr<<=7;//总容量
ldi R24,7
ldi R25,0
movw R30,R28
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
st -y,R24
movw R16,R2
movw R18,R4
xcall lsl32
movw R30,R28
std z+0,R16
std z+1,R17
std z+2,R18
std z+3,R19
xjmp L37
L36:
.dbline 128
; while(next_page_start_addr)
; {
.dbline 129
; next_page_start_addr-=page_size;
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
sub R6,R2
sbc R7,R3
sbc R8,R4
sbc R9,R5
movw R30,R28
std z+0,R6
std z+1,R7
std z+2,R8
std z+3,R9
.dbline 130
; if(next_page_start_addr<=addr){next_page_start_addr+=page_size;break;}
ldd R2,y+20
ldd R3,y+21
clr R4
clr R5
movw R30,R28
ldd R6,z+0
ldd R7,z+1
ldd R8,z+2
ldd R9,z+3
cp R2,R6
cpc R3,R7
cpc R4,R8
cpc R5,R9
brlo L39
.dbline 130
.dbline 130
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 130
xjmp L38
L39:
.dbline 131
L37:
.dbline 127
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
breq X0
xjmp L36
X0:
L38:
L41:
.dbline 134
; }
;
; Wagain:
; p=P_data;
ldd R14,y+22
ldd R15,y+23
.dbline 135
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -