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

📄 main.s

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