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

📄 ac15-3.s

📁 AVR的MEGA16通过TWI接口读写AT24C02
💻 S
字号:
	.module ac15-3.c
	.area lit(rom, con, rel)
_dis_7::
	.byte 192,249
	.byte 164,176
	.byte 153,146
	.byte 130,248
	.byte 128,144
	.dbfile D:\programe\AVR实验\I2C\TWI-at2401\ac15-3.c
	.dbsym e dis_7 _dis_7 A[10:10]kc
_position::
	.byte 16,32
	.dbsym e position _position A[2:2]kc
	.area data(ram, con, rel)
	.dbfile D:\programe\AVR实验\I2C\TWI-at2401\ac15-3.c
_dis_buff::
	.blkb 2
	.area idata
	.byte 0,0
	.area data(ram, con, rel)
	.dbfile D:\programe\AVR实验\I2C\TWI-at2401\ac15-3.c
	.dbsym e dis_buff _dis_buff A[2:2]c
	.area text(rom, con, rel)
	.dbfile D:\programe\AVR实验\I2C\TWI-at2401\ac15-3.c
	.dbfunc e Delay_2us _Delay_2us fV
	.even
_Delay_2us::
	.dbline -1
	.dbline 53
; #include <iom8v.h>			
; #include <macros.h>
; //-----------------------------------------------
; #define uchar unsigned char	
; #define uint unsigned int
; 
; //TWI状态定义
; //MT 主方式传输  MR 主方式接收
; #define START 0x08 
; #define RE_START 0x10
; #define MT_SLA_ACK 0x18
; #define MT_SLA_NOACK 0x20
; #define MT_DATA_ACK  0x28
; #define MT_DATA_NOACK 0x30
; #define MR_SLA_ACK  0x40
; #define MR_SLA_NOACK 0x48
; #define MR_DATA_ACK 0x50
; #define MR_DATA_NOACK 0x58
; 
; 
; #define rd_device_add 0xa1
; #define wr_device_add 0xa0
; 
; #define DS12_CONTROL_PORT        PORTB 
; #define CS                       PB3 
; #define CS_ON()   ( DS12_CONTROL_PORT &= ~(1<<CS) ) 
; #define CS_OFF()  ( DS12_CONTROL_PORT |=  (1<<CS) )
; 
; //常用TWI操作(主模式写和主模式读)
; #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 TestAck() 	  (TWSR&0xf8)
; #define SetAck()	  (TWCR|=(1<<TWEA))
; #define SetNoAck()    (TWCR&=~(1<<TWEA))
; #define Twi()	  	  (TWCR=(1<<TWINT)|(1<<TWEN))
; #define Write8Bit(x)  {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);} 	
; 	
; #define xtal 8   			
; 
; flash unsigned char dis_7[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; 
; flash unsigned char position[]={0x10,0x20};
; unsigned char dis_buff[2]={0,0},posit;
; 
; //========函数声明=========
; 
; void port_init(void);
; void delay_ms(unsigned int time);
; void delay_us(int time);
; //=======================
; 
; void Delay_2us()
; {
	.dbline 54
; 	NOP();NOP();NOP();
	nop
	.dbline 54
	nop
	.dbline 54
	nop
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e _delay_us __delay_us fV
;            xus -> R20,R21
	.even
__delay_us::
	xcall push_gset1
	movw R20,R16
	.dbline -1
	.dbline 58
; }
; 
; void _delay_us(unsigned int xus)
; {
	xjmp L4
L3:
	.dbline 60
	xcall _Delay_2us
L4:
	.dbline 59
; 	 while (xus--)
	movw R2,R20
	subi R20,1
	sbci R21,0
	tst R2
	brne L3
	tst R3
	brne L3
X0:
	.dbline -2
L2:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r xus 20 i
	.dbend
	.dbfunc e delay_ms _delay_ms fV
;              i -> R20,R21
;              j -> R22,R23
;            xms -> R16,R17
	.even
_delay_ms::
	xcall push_gset2
	.dbline -1
	.dbline 64
;        	Delay_2us();
; }
; 
; void delay_ms(unsigned int  xms) //crystal=8MHz
; {
	.dbline 66
; 	unsigned int i,j; //variable:declare Word
; 	for(i=0; i<xms; i++)
	clr R20
	clr R21
	xjmp L10
L7:
	.dbline 67
; 		for(j=0; j<498;j++)
	clr R22
	clr R23
	xjmp L14
L11:
	.dbline 68
	.dbline 69
	nop
	.dbline 69
	nop
	.dbline 69
	nop
	.dbline 69
	nop
	.dbline 70
	nop
	.dbline 70
	nop
	.dbline 70
	nop
	.dbline 70
	nop
	.dbline 70
	nop
	.dbline 72
L12:
	.dbline 67
	subi R22,255  ; offset = 1
	sbci R23,255
L14:
	.dbline 67
	cpi R22,242
	ldi R30,1
	cpc R23,R30
	brlo L11
L8:
	.dbline 66
	subi R20,255  ; offset = 1
	sbci R21,255
L10:
	.dbline 66
	cp R20,R16
	cpc R21,R17
	brlo L7
	.dbline -2
L6:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r j 22 i
	.dbsym r xms 16 i
	.dbend
	.dbfunc e display _display fV
;           adc1 -> R20
	.even
_display::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 76
; 		{
; 			NOP();NOP();NOP();NOP();
; 			NOP();NOP();NOP();NOP();NOP();		
; 			
; 		}
; }
; 
; void display(unsigned char adc1) // 2 位LED 数码管动态扫描函数
; {
	.dbline 77
;    dis_buff[1]=adc1 /10;
	ldi R17,10
	mov R16,R20
	xcall div8u
	sts _dis_buff+1,R16
	.dbline 79
; 
;     dis_buff[0]=adc1 %10;
	ldi R17,10
	mov R16,R20
	xcall mod8u
	sts _dis_buff,R16
	.dbline 82
;   
;   //PORTB = 0x00;
;   for(posit=0; posit<2;posit++)
	clr R2
	sts _posit,R2
	xjmp L20
L17:
	.dbline 83
	.dbline 85
	ldi R24,<_dis_buff
	ldi R25,>_dis_buff
	lds R30,_posit
	clr R31
	add R30,R24
	adc R31,R25
	ldd R30,z+0
	clr R31
	ldi R24,<_dis_7
	ldi R25,>_dis_7
	add R30,R24
	adc R31,R25
	lpm R30,Z
	out 0x12,R30
	.dbline 86
	ldi R24,<_position
	ldi R25,>_position
	lds R30,_posit
	clr R31
	add R30,R24
	adc R31,R25
	lpm R30,Z
	out 0x18,R30
	.dbline 88
	ldi R16,100
	ldi R17,0
	xcall __delay_us
	.dbline 91
L18:
	.dbline 82
	lds R24,_posit
	subi R24,255    ; addi 1
	sts _posit,R24
L20:
	.dbline 82
	lds R24,_posit
	cpi R24,2
	brlo L17
	.dbline -2
L15:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r adc1 20 c
	.dbend
	.dbfunc e port_init _port_init fV
	.even
_port_init::
	.dbline -1
	.dbline 96
;   {
;    
;    PORTD = dis_7[dis_buff[posit]];
;    PORTB = position[posit];
;    
;   _delay_us(100);
;    //PORTB &= ~position[posit];
;   
;   }
; }
; 
; /********************端口初始化******************/
; void port_init(void)
; {
	.dbline 100
;  //PORTA = 0x00;
;  //DDRA  = 0xFF;
; // PORTB = 0x00;
;  DDRB  = 0xFF;
	ldi R24,255
	out 0x17,R24
	.dbline 102
; // PORTC = 0x00; 
;  DDRC  = 0x30;
	ldi R24,48
	out 0x14,R24
	.dbline 104
; // PORTD = 0xFF;
;  DDRD  = 0xFF;
	ldi R24,255
	out 0x11,R24
	.dbline -2
L21:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e i2c_Read _i2c_Read fc
;           temp -> R20
;     RomAddress -> R16
	.even
_i2c_Read::
	xcall push_gset1
	.dbline -1
	.dbline 113
; }
; 
; 
; /******************************************
;                I2C总线读一个字节
; 			   如果读失败返回0
; *******************************************/
; unsigned char i2c_Read(unsigned char RomAddress) 
;       {
	.dbline 115
; 	   unsigned char temp;
; 	   Start();
	ldi R24,164
	out 0x36,R24
	.dbline 116
L23:
	.dbline 116
L24:
	.dbline 116
; 	   Wait();
	in R2,0x36
	sbrs R2,7
	rjmp L23
	.dbline 116
	.dbline 116
	.dbline 117
; 	   if (TestAck()!=START) return 0;	   
	in R24,0x1
	andi R24,248
	cpi R24,8
	breq L26
	.dbline 117
	clr R16
	xjmp L22
L26:
	.dbline 118
; 	   Write8Bit(wr_device_add);
	.dbline 118
	ldi R24,160
	out 0x3,R24
	.dbline 118
	ldi R24,132
	out 0x36,R24
	.dbline 118
	.dbline 118
	.dbline 119
L28:
	.dbline 119
L29:
	.dbline 119
; 	   Wait(); 
	in R2,0x36
	sbrs R2,7
	rjmp L28
	.dbline 119
	.dbline 119
	.dbline 120
; 	   if (TestAck()!=MT_SLA_ACK) return 0;
	in R24,0x1
	andi R24,248
	cpi R24,24
	breq L31
	.dbline 120
	clr R16
	xjmp L22
L31:
	.dbline 121
; 	   Write8Bit(RomAddress);
	.dbline 121
	out 0x3,R16
	.dbline 121
	ldi R24,132
	out 0x36,R24
	.dbline 121
	.dbline 121
	.dbline 122
L33:
	.dbline 122
L34:
	.dbline 122
; 	   Wait();
	in R2,0x36
	sbrs R2,7
	rjmp L33
	.dbline 122
	.dbline 122
	.dbline 123
; 	   if (TestAck()!=MT_DATA_ACK) return 0;
	in R24,0x1
	andi R24,248
	cpi R24,40
	breq L36
	.dbline 123
	clr R16
	xjmp L22
L36:
	.dbline 124
; 	   Start();
	ldi R24,164
	out 0x36,R24
	.dbline 125
L38:
	.dbline 125
L39:
	.dbline 125
; 	   Wait();
	in R2,0x36
	sbrs R2,7
	rjmp L38
	.dbline 125
	.dbline 125
	.dbline 126
; 	   if (TestAck()!=RE_START)  return 0;
	in R24,0x1
	andi R24,248
	cpi R24,16
	breq L41
	.dbline 126
	clr R16
	xjmp L22
L41:
	.dbline 127
; 	   Write8Bit(rd_device_add);
	.dbline 127
	ldi R24,161
	out 0x3,R24
	.dbline 127
	ldi R24,132
	out 0x36,R24
	.dbline 127
	.dbline 127
	.dbline 128
L43:
	.dbline 128
L44:
	.dbline 128
; 	   Wait();
	in R2,0x36
	sbrs R2,7
	rjmp L43
	.dbline 128
	.dbline 128
	.dbline 129
; 	   if(TestAck()!=MR_SLA_ACK)  return 0;
	in R24,0x1
	andi R24,248
	cpi R24,64
	breq L46
	.dbline 129
	clr R16
	xjmp L22
L46:
	.dbline 130
; 	   Twi();
	ldi R24,132
	out 0x36,R24
	.dbline 131
L48:
	.dbline 131
L49:
	.dbline 131
; 	   Wait();
	in R2,0x36
	sbrs R2,7
	rjmp L48
	.dbline 131
	.dbline 131
	.dbline 132
; 	   if(TestAck()!=MR_DATA_NOACK) return 0;	
	in R24,0x1
	andi R24,248
	cpi R24,88
	breq L51
	.dbline 132
	clr R16
	xjmp L22
L51:
	.dbline 133
; 	   temp=TWDR;
	in R20,0x3
	.dbline 134
;        Stop();
	ldi R24,148
	out 0x36,R24
	.dbline 135
; 	   return temp;
	mov R16,R20
	.dbline -2
L22:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r temp 20 c
	.dbsym r RomAddress 16 c
	.dbend
	.dbfunc e i2c_Write _i2c_Write fc
;          Wdata -> R20
;     RomAddress -> R22
	.even
_i2c_Write::
	xcall push_gset2
	mov R20,R18
	mov R22,R16
	.dbline -1
	.dbline 144
;       }
; 	  
; /******************************************
;                I2C总线写一个字节
; 			    返回0:写成功
; 				返回非0:写失败
; *******************************************/
; unsigned char i2c_Write(unsigned char RomAddress,unsigned char Wdata) 
; {
	.dbline 145
; 	  Start();
	ldi R24,164
	out 0x36,R24
	.dbline 146
L54:
	.dbline 146
L55:
	.dbline 146
; 	  Wait();
	in R2,0x36
	sbrs R2,7
	rjmp L54
	.dbline 146
	.dbline 146
	.dbline 147
; 	  if(TestAck()!=START) return 1;
	in R24,0x1
	andi R24,248
	cpi R24,8
	breq L57
	.dbline 147
	ldi R16,1
	xjmp L53
L57:
	.dbline 148
; 	  Write8Bit(wr_device_add);
	.dbline 148
	ldi R24,160
	out 0x3,R24
	.dbline 148
	ldi R24,132
	out 0x36,R24
	.dbline 148
	.dbline 148
	.dbline 149
L59:
	.dbline 149
L60:
	.dbline 149
; 	  Wait();
	in R2,0x36
	sbrs R2,7
	rjmp L59
	.dbline 149
	.dbline 149
	.dbline 150
; 	  if(TestAck()!=MT_SLA_ACK) return 1;
	in R24,0x1
	andi R24,248
	cpi R24,24
	breq L62
	.dbline 150
	ldi R16,1
	xjmp L53
L62:
	.dbline 151
; 	  Write8Bit(RomAddress);
	.dbline 151
	out 0x3,R22
	.dbline 151
	ldi R24,132
	out 0x36,R24
	.dbline 151
	.dbline 151
	.dbline 152
L64:
	.dbline 152
L65:
	.dbline 152
; 	  Wait();
	in R2,0x36
	sbrs R2,7
	rjmp L64
	.dbline 152
	.dbline 152
	.dbline 153
; 	  if(TestAck()!=MT_DATA_ACK) return 1;
	in R24,0x1
	andi R24,248
	cpi R24,40
	breq L67
	.dbline 153
	ldi R16,1
	xjmp L53
L67:
	.dbline 154
; 	  Write8Bit(Wdata);
	.dbline 154
	out 0x3,R20
	.dbline 154
	ldi R24,132
	out 0x36,R24
	.dbline 154
	.dbline 154
	.dbline 155
L69:
	.dbline 155
L70:
	.dbline 155
; 	  Wait();
	in R2,0x36
	sbrs R2,7
	rjmp L69
	.dbline 155
	.dbline 155
	.dbline 156
; 	  if(TestAck()!=MT_DATA_ACK) return 1;	
	in R24,0x1
	andi R24,248
	cpi R24,40
	breq L72
	.dbline 156
	ldi R16,1
	xjmp L53
L72:
	.dbline 157
; 	  Stop();
	ldi R24,148
	out 0x36,R24
	.dbline 158
;  	  delay_ms(10);
	ldi R16,10
	ldi R17,0
	xcall _delay_ms
	.dbline 159
; 	  return 0;
	clr R16
	.dbline -2
L53:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r Wdata 20 c
	.dbsym r RomAddress 22 c
	.dbend
	.dbfunc e twi_init _twi_init fV
	.even
_twi_init::
	.dbline -1
	.dbline 164
; }
; 
; 
; void twi_init(void)
; {
	.dbline 165
;  	  TWCR= 0X00; //disable twi 
	clr R2
	out 0x36,R2
	.dbline 166
;     TWBR= 0x12; //set bit rate 
	ldi R24,18
	out 0x0,R24
	.dbline 167
;     TWSR= 0x01; //set prescale 
	ldi R24,1
	out 0x1,R24
	.dbline 168
;     TWCR= 0x04; //enable twi 
	ldi R24,4
	out 0x36,R24
	.dbline -2
L74:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e main _main fV
;              i -> <dead>
;        key_val -> <dead>
;         wr_val -> R20
;              j -> R20
;         rd_val -> R22
;              k -> R10,R11
	.even
_main::
	.dbline -1
	.dbline 175
; 
; 
; 
; }
; //******************************************
; void main(void)				
; {
	.dbline 176
;  	uchar key_val,wr_val=0,rd_val,i,j;	
	clr R20
	.dbline 178
; 	uint k;
; 	port_init();
	xcall _port_init
	.dbline 179
; 	CS_OFF();
	sbi 0x18,3
	.dbline 180
;     delay_ms(10);			
	ldi R16,10
	ldi R17,0
	xcall _delay_ms
	.dbline 181
; 	delay_ms(10);
	ldi R16,10
	ldi R17,0
	xcall _delay_ms
	xjmp L77
L76:
	.dbline 184
; 	//twi_init();
; 		while(1)              
; 		{
	.dbline 185
; 	   	   	rd_val=12;	
	ldi R22,12
	.dbline 196
; 	   		 
; 			//for(i=1; i<255;i++)
; 			//{
; 			// i2c_Write(i,i);
; 			//  _delay_us(20);
; 	   		  
; 			  //adc_to_disbuffer1(16);	
; 	   		 	
; 			 // 
; 			//}
; 			for( j=1; j<255;j++)
	ldi R20,1
	xjmp L82
L79:
	.dbline 197
; 			{
	.dbline 198
; 			  for( k=1; k<1025;k++)
	ldi R24,1
	ldi R25,0
	movw R10,R24
	xjmp L86
L83:
	.dbline 199
	.dbline 200
	mov R16,R20
	xcall _i2c_Read
	mov R22,R16
	.dbline 201
	xcall _display
	.dbline 204
L84:
	.dbline 198
	movw R24,R10
	adiw R24,1
	movw R10,R24
L86:
	.dbline 198
	movw R24,R10
	cpi R24,1
	ldi R30,4
	cpc R25,R30
	brlo L83
	.dbline 205
L80:
	.dbline 196
	inc R20
L82:
	.dbline 196
	cpi R20,255
	brlo L79
	.dbline 206
L77:
	.dbline 183
	xjmp L76
X1:
	.dbline -2
L75:
	.dbline 0 ; func end
	ret
	.dbsym l i 1 c
	.dbsym l key_val 1 c
	.dbsym r wr_val 20 c
	.dbsym r j 20 c
	.dbsym r rd_val 22 c
	.dbsym r k 10 i
	.dbend
	.area bss(ram, con, rel)
	.dbfile D:\programe\AVR实验\I2C\TWI-at2401\ac15-3.c
_posit::
	.blkb 1
	.dbsym e posit _posit c

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -