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

📄 24cxx_test.s

📁 24IIC的源代码
💻 S
📖 第 1 页 / 共 2 页
字号:
	.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 + -