📄 24cxx_test.s
字号:
.module _24cxx_test.c
.area text(rom, con, rel)
.dbfile D:\mega16_32实验板资料\ICCAVR源程序\twi\24c64\连续读写\24cxx_test.c
.dbfile D:\mega16_32实验板资料\ICCAVR源程序\twi\24c64\连续读写\delay.h
.dbfunc e delay_1us _delay_1us fV
.even
_delay_1us::
.dbline -1
.dbline 6
; /**********延时函数*****************/
; /*-----------------------------------------------
; delay_us :1us延时函数
; ------------------------------------------------*/
; void delay_1us(void)
; {
.dbline 7
; asm("nop");
nop
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e delay_us _delay_us fV
; t -> R20,R21
.even
_delay_us::
st -y,R20
st -y,R21
movw R20,R16
.dbline -1
.dbline 14
; }
; /*-----------------------------------------------
; delay_nus :长延时函数
; 输入参数: t :延时时间 us
; ------------------------------------------------*/
; void delay_us(unsigned int t)
; {
xjmp L4
L3:
.dbline 16
; while(t--)
; delay_1us();
xcall _delay_1us
L4:
.dbline 15
movw R2,R20
subi R20,1
sbci R21,0
tst R2
brne L3
tst R3
brne L3
X0:
.dbline -2
L2:
.dbline 0 ; func end
ld R21,y+
ld R20,y+
ret
.dbsym r t 20 i
.dbend
.dbfunc e delay_1ms _delay_1ms fV
; i -> R16,R17
.even
_delay_1ms::
.dbline -1
.dbline 22
; }
; /*----------------------------------------------
; delay_ms :1ms延时函数
; -----------------------------------------------*/
; void delay_1ms(void)
; {
.dbline 24
; unsigned int i;
; for(i=0;i<1140;i++);
clr R16
clr R17
xjmp L10
L7:
.dbline 24
L8:
.dbline 24
subi R16,255 ; offset = 1
sbci R17,255
L10:
.dbline 24
cpi R16,116
ldi R30,4
cpc R17,R30
brlo L7
X1:
.dbline -2
L6:
.dbline 0 ; func end
ret
.dbsym r i 16 i
.dbend
.dbfunc e delay_ms _delay_ms fV
; t -> R20,R21
.even
_delay_ms::
st -y,R20
st -y,R21
movw R20,R16
.dbline -1
.dbline 31
; }
; /*----------------------------------------------
; delay_nms :长延时函数
; 输入参数: t :延时时间 ms
; -----------------------------------------------*/
; void delay_ms(unsigned int t)
; {
xjmp L13
L12:
.dbline 33
; while(t--)
; delay_1ms();
xcall _delay_1ms
L13:
.dbline 32
movw R2,R20
subi R20,1
sbci R21,0
tst R2
brne L12
tst R3
brne L12
X2:
.dbline -2
L11:
.dbline 0 ; func end
ld R21,y+
ld R20,y+
ret
.dbsym r t 20 i
.dbend
.dbfile D:\mega16_32实验板资料\ICCAVR源程序\twi\24c64\连续读写\24cxx.h
.dbfunc e twi_start _twi_start fc
.even
_twi_start::
.dbline -1
.dbline 17
; /*------------------------------------------------------------------
;
; ------------------------------------------------------------------*/
; #define Start() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))
; #define Stop() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)) //总线上起动停止条件
; #define Wait() {while(!(TWCR&(1<<TWINT)));}
; #define TW_STATUS (TWSR&0xf8)
; #define Twi() (TWCR=(1<<TWINT)|(1<<TWEN))
;
; //写入数据,器件型号model,器件地址DevAddr,开始地址addr,数据*P_data,数据长度num
; unsigned char AT24CxxWrite(unsigned int model,unsigned char DevAddr,unsigned int addr,unsigned char *P_data,unsigned char num);
; //读数据,器件型号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);
;
; //总线上起动开始条件
; unsigned char twi_start(void)
; {
.dbline 18
; Start();
ldi R24,164
out 0x36,R24
.dbline 19
; Wait();
L16:
.dbline 19
L17:
.dbline 19
in R2,0x36
sbrs R2,7
rjmp L16
X3:
.dbline 19
.dbline 19
.dbline 20
; delay_us(100);
ldi R16,100
ldi R17,0
xcall _delay_us
.dbline 21
; return TW_STATUS;
in R16,0x1
andi R16,248
.dbline -2
L15:
.dbline 0 ; func end
ret
.dbend
.dbfunc e twi_writebyte _twi_writebyte fc
; c -> R10
.even
_twi_writebyte::
st -y,R10
mov R10,R16
.dbline -1
.dbline 26
; }
;
; //写一字节
; unsigned char twi_writebyte(unsigned char c)
; {
.dbline 27
; TWDR=c;
out 0x3,R10
.dbline 28
; Twi();
ldi R24,132
out 0x36,R24
.dbline 29
; Wait();
L20:
.dbline 29
L21:
.dbline 29
in R2,0x36
sbrs R2,7
rjmp L20
X4:
.dbline 29
.dbline 29
.dbline 30
; delay_us(100);
ldi R16,100
ldi R17,0
xcall _delay_us
.dbline 31
; return TW_STATUS;
in R16,0x1
andi R16,248
.dbline -2
L19:
.dbline 0 ; func end
ld R10,y+
ret
.dbsym r c 10 c
.dbend
.dbfunc e twi_readbyte _twi_readbyte fc
; tmp -> R20
; ack -> R12
; c -> R10,R11
.even
_twi_readbyte::
xcall push_xgset303C
mov R12,R18
movw R10,R16
.dbline -1
.dbline 36
; }
;
; //读一字节 ack: true时发ACK,false时发NACK
; unsigned char twi_readbyte(unsigned char *c ,unsigned char ack)
; {
.dbline 37
; unsigned char tmp=(1<<TWINT)|(1<<TWEN);
ldi R20,132
.dbline 38
; if(ack) tmp|=(1<<TWEA);
tst R12
breq L24
X5:
.dbline 38
ori R20,64
L24:
.dbline 39
; TWCR=tmp;
out 0x36,R20
.dbline 40
; Wait();
L26:
.dbline 40
L27:
.dbline 40
in R2,0x36
sbrs R2,7
rjmp L26
X6:
.dbline 40
.dbline 40
.dbline 41
; delay_us(100);
ldi R16,100
ldi R17,0
xcall _delay_us
.dbline 42
; *c=TWDR;
in R2,0x3
movw R30,R10
std z+0,R2
.dbline 43
; return TW_STATUS;
in R16,0x1
andi R16,248
.dbline -2
L23:
.dbline 0 ; func end
xjmp pop_xgset303C
.dbsym r tmp 20 c
.dbsym r ack 12 c
.dbsym r c 10 pc
.dbend
.dbfunc e AT24CxxWrite _AT24CxxWrite fc
; temp -> R14
; ICerror -> y+5
; p -> R12,R13
; 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_xgsetF0FC
sbiw R28,6
.dbline -1
.dbline 48
; }
;
; //写入数据,器件型号model,器件地址DevAddr,开始地址addr,数据*P_data,数据长度num
; unsigned char AT24CxxWrite(unsigned int model,unsigned char DevAddr,unsigned int addr,unsigned char *P_data,unsigned char num)
; {
.dbline 49
; unsigned char i,temp,*p,ICerror=0,page_size;
clr R0
std y+5,R0
.dbline 51
; unsigned long next_page_start_addr;
; if(model<=2)
ldi R24,2
ldi R25,0
ldd R0,y+16
ldd R1,y+17
cp R24,R0
cpc R25,R1
brlo L30
X7:
.dbline 52
; page_size=8;
ldi R24,8
std y+4,R24
xjmp L31
L30:
.dbline 53
; else if(model<32)
ldd R24,y+16
ldd R25,y+17
cpi R24,32
ldi R30,0
cpc R25,R30
brsh L32
X8:
.dbline 54
; page_size=16;
ldi R24,16
std y+4,R24
xjmp L33
L32:
.dbline 55
; else if(model<128)
ldd R24,y+16
ldd R25,y+17
cpi R24,128
ldi R30,0
cpc R25,R30
brsh L34
X9:
.dbline 56
; page_size=32;
ldi R24,32
std y+4,R24
xjmp L35
L34:
.dbline 57
; else if(model<512)
ldd R24,y+16
ldd R25,y+17
cpi R24,0
ldi R30,2
cpc R25,R30
brsh L36
X10:
.dbline 58
; page_size=64;
ldi R24,64
std y+4,R24
xjmp L37
L36:
.dbline 60
; else
; page_size=128;
ldi R24,128
std y+4,R24
L37:
L35:
L33:
L31:
.dbline 61
; next_page_start_addr=model;
ldd R2,y+16
ldd R3,y+17
clr R4
clr R5
std y+0,R2
std y+1,R3
std y+2,R4
std y+3,R5
.dbline 62
; next_page_start_addr<<=7;//总容量
ldi R24,7
ldi R25,0
ldd R16,y+0
ldd R17,y+1
ldd R18,y+2
ldd R19,y+3
st -y,R24
xcall lsl32
std y+0,R16
std y+1,R17
std y+2,R18
std y+3,R19
xjmp L39
L38:
.dbline 64
; while(next_page_start_addr)
; {
.dbline 65
; next_page_start_addr-=page_size;
ldd R2,y+4
clr R3
clr R4
clr R5
ldd R6,y+0
ldd R7,y+1
ldd R8,y+2
ldd R9,y+3
sub R6,R2
sbc R7,R3
sbc R8,R4
sbc R9,R5
std y+0,R6
std y+1,R7
std y+2,R8
std y+3,R9
.dbline 66
; if(next_page_start_addr<=addr)
ldd R2,y+20
ldd R3,y+21
clr R4
clr R5
ldd R6,y+0
ldd R7,y+1
ldd R8,y+2
ldd R9,y+3
cp R2,R6
cpc R3,R7
cpc R4,R8
cpc R5,R9
brlo L41
X11:
.dbline 67
; {
.dbline 68
; next_page_start_addr+=page_size;
ldd R2,y+4
clr R3
clr R4
clr R5
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
std y+0,R6
std y+1,R7
std y+2,R8
std y+3,R9
.dbline 69
; break;
xjmp L40
L41:
.dbline 71
; }
; }
L39:
.dbline 63
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
ldd R2,y+0
ldd R3,y+1
ldd R4,y+2
ldd R5,y+3
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brne L38
X12:
L40:
L43:
.dbline 74
;
; Wagain:
; p=P_data;
ldd R12,y+22
ldd R13,y+23
.dbline 75
; i=num;//数据个数
ldd R10,y+24
.dbline 76
; if(ICerror<10)
ldd R24,y+5
cpi R24,10
brlo X24
xjmp L46
X24:
X13:
.dbline 77
; ICerror++;
mov R0,R24
inc R0
std y+5,R0
.dbline 79
; else
; goto Wstop;
L45:
.dbline 80
; twi_start(); //启动
xcall _twi_start
.dbline 81
; temp=0xa0+(DevAddr<<1);
ldd R24,y+18
lsl R24
subi R24,96 ; addi 160
mov R14,R24
.dbline 82
; if(model<16)
ldd R24,y+16
ldd R25,y+17
cpi R24,16
ldi R30,0
cpc R25,R30
brsh L47
X14:
.dbline 83
; temp+=((addr>>7)&0x0e);//器件24c32以下地址高位
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,R14
clr R3
add R2,R24
adc R3,R25
mov R14,R2
L47:
.dbline 84
; if(twi_writebyte(temp)!=0x18)// //头字节
mov R16,R14
xcall _twi_writebyte
cpi R16,24
breq L49
X15:
.dbline 85
; goto Wagain;
xjmp L43
L49:
.dbline 86
; 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 L51
X16:
.dbline 87
; {
.dbline 88
; if((twi_writebyte(addr>>8)!=0x28))//
ldd R16,y+20
ldd R17,y+21
mov R16,R17
clr R17
xcall _twi_writebyte
cpi R16,40
breq L53
X17:
.dbline 89
; goto Wagain;
xjmp L43
L53:
.dbline 90
; }
L51:
.dbline 91
; if((twi_writebyte(addr&0xff)!=0x28)) //写地址低位
ldd R16,y+20
andi R17,0
xcall _twi_writebyte
mov R14,R16
cpi R16,40
breq L58
X18:
.dbline 92
; goto Wagain;
xjmp L43
L57:
.dbline 94
; while(i)//写入数据i个
; {
.dbline 95
; i--;
dec R10
.dbline 96
; if(twi_writebyte(*(p++))!=0x28)//
movw R30,R12
ld R16,Z+
movw R12,R30
xcall _twi_writebyte
mov R14,R16
cpi R16,40
breq L60
X19:
.dbline 97
; goto Wagain;
xjmp L43
L60:
.dbline 98
; addr++;
ldd R24,y+20
ldd R25,y+21
adiw R24,1
std y+21,R25
std y+20,R24
.dbline 99
; if(addr==next_page_start_addr)break;
ldd R2,y+0
ldd R3,y+1
ldd R4,y+2
ldd R5,y+3
movw R6,R24
clr R8
clr R9
cp R6,R2
cpc R7,R3
cpc R8,R4
cpc R9,R5
brne L62
X20:
.dbline 99
xjmp L59
L62:
.dbline 100
; }
L58:
.dbline 93
tst R10
brne L57
X21:
L59:
L46:
.dbline 102
; Wstop:
; Stop();
ldi R24,148
out 0x36,R24
.dbline 103
; if(i)//写到了页末,重新开始写新一页
tst R10
breq L64
X22:
.dbline 104
; {
.dbline 105
; delay_ms(50);
ldi R16,50
ldi R17,0
xcall _delay_ms
.dbline 106
; num=i;
std y+24,R10
.dbline 107
; P_data=p;
std y+23,R13
std y+22,R12
.dbline 108
; next_page_start_addr+=page_size;
ldd R2,y+4
clr R3
clr R4
clr R5
ldd R6,y+0
ldd R7,y+1
ldd R8,y+2
ldd R9,y+3
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
std y+0,R6
std y+1,R7
std y+2,R8
std y+3,R9
.dbline 109
; if(addr==model*128)
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 X25
xjmp L43
X25:
X23:
.dbline 110
; {
.dbline 111
; addr=0;
clr R0
clr R1
std y+21,R1
std y+20,R0
.dbline 112
; next_page_start_addr=page_size;
ldd R2,y+4
clr R3
clr R4
clr R5
std y+0,R2
std y+1,R3
std y+2,R4
std y+3,R5
.dbline 113
; }
.dbline 114
; goto Wagain;
xjmp L43
L64:
.dbline 116
; }
; return ICerror;
ldd R16,y+5
.dbline -2
L29:
.dbline 0 ; func end
adiw R28,6
xcall pop_xgsetF0FC
adiw R28,4
ret
.dbsym r temp 14 c
.dbsym l ICerror 5 c
.dbsym r p 12 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
; temp -> R12
; ICerror -> R20
; p -> R22,R23
; num -> R10
; P_data -> y+17
; addr -> y+15
; DevAddr -> R12
; model -> R14,R15
.even
_AT24CxxRead::
xcall push_xgsetF0FC
mov R12,R18
movw R14,R16
sbiw R28,5
ldd R10,y+19
.dbline -1
.dbline 121
; }
;
; //读数据,器件型号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 123
; unsigned char temp,*p,ICerror;
; p=P_data;
ldd R22,y+17
ldd R23,y+18
.dbline 124
; ICerror=AT24CxxWrite(model,DevAddr,addr,0,0);
clr R2
std y+4,R2
clr R3
std y+3,R3
std y+2,R2
ldd R0,y+15
ldd R1,y+16
std y+1,R1
std y+0,R0
mov R18,R12
movw R16,R14
xcall _AT24CxxWrite
mov R20,R16
.dbline 125
; temp=0xa0+(DevAddr<<1);
mov R24,R12
lsl R24
subi R24,96 ; addi 160
mov R12,R24
.dbline 126
; if(model<16)
movw R24,R14
cpi R24,16
ldi R30,0
cpc R25,R30
brsh L69
X26:
.dbline 127
; temp+=((addr>>7)&0x0e);//器件24c32以下地址高位
ldi R18,7
ldi R19,0
ldd R16,y+15
ldd R17,y+16
xcall lsr16
movw R24,R16
andi R24,14
andi R25,0
mov R2,R12
clr R3
add R2,R24
adc R3,R25
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -