⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.s

📁 AT24C256 读写 atmega16单片机( ICC )
💻 S
📖 第 1 页 / 共 2 页
字号:
	.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 + -