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

📄 avr_gy-29.s

📁 GY-27资料源码 ADXL345 HMC5883L
💻 S
📖 第 1 页 / 共 3 页
字号:
	.module AVR_GY-29.c
	.area text(rom, con, rel)
	.dbfile D:\MCU_Project\MCU_AVR\AVR_GY-29\AVR_GY-29.c
	.dbfile D:\MCU_Project\MCU_AVR\AVR_GY-29\delay.h
	.dbfunc e delay_1us _delay_1us fV
	.even
_delay_1us::
	.dbline -1
	.dbline 15
; /*-----------------------------------------------------------------------
; 延时函数
; 编译器:ICC-AVR v6.31A 
; 目标芯片 : M16
; 时钟: 8.0000Mhz
; -----------------------------------------------------------------------*/
; #ifndef __delay_h
; #define __delay_h
; void delay_nus(unsigned int n);
; void delay_nms(unsigned int n);
; void delay_1us(void);
; void delay_1ms(void) ; 
; 
; void delay_1us(void)                 //1us延时函数
;   {
	.dbline 16
;    asm("nop");
	nop
	.dbline 17
;    asm("nop");
	nop
	.dbline 18
;    asm("nop");
	nop
	.dbline 19
;    asm("nop");
	nop
	.dbline 20
;    asm("nop");
	nop
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e delay_nus _delay_nus fV
;              i -> R20,R21
;              n -> R10,R11
	.even
_delay_nus::
	xcall push_xgset300C
	movw R10,R16
	.dbline -1
	.dbline 24
;   }
; 
; void delay_nus(unsigned int n)       //N us延时函数
;   {
	.dbline 25
;    unsigned int i=0;
	clr R20
	clr R21
	.dbline 26
;    for (i=0;i<n;i++)
	xjmp L6
L3:
	.dbline 27
;    delay_1us();
	xcall _delay_1us
L4:
	.dbline 26
	subi R20,255  ; offset = 1
	sbci R21,255
L6:
	.dbline 26
	cp R20,R10
	cpc R21,R11
	brlo L3
X0:
	.dbline -2
L2:
	.dbline 0 ; func end
	xjmp pop_xgset300C
	.dbsym r i 20 i
	.dbsym r n 10 i
	.dbend
	.dbfunc e delay_1ms _delay_1ms fV
;              i -> R16,R17
	.even
_delay_1ms::
	.dbline -1
	.dbline 31
;   }
;   
; void delay_1ms(void)                 //1ms延时函数
;   {
	.dbline 33
;    unsigned int i;
;    for (i=0;i<500;i++);
	clr R16
	clr R17
	xjmp L11
L8:
	.dbline 33
L9:
	.dbline 33
	subi R16,255  ; offset = 1
	sbci R17,255
L11:
	.dbline 33
	cpi R16,244
	ldi R30,1
	cpc R17,R30
	brlo L8
X1:
	.dbline -2
L7:
	.dbline 0 ; func end
	ret
	.dbsym r i 16 i
	.dbend
	.dbfunc e delay_nms _delay_nms fV
;              i -> R20,R21
;              n -> R10,R11
	.even
_delay_nms::
	xcall push_xgset300C
	movw R10,R16
	.dbline -1
	.dbline 37
;   }
;   
; void delay_nms(unsigned int n)       //N ms延时函数
;   {
	.dbline 38
;    unsigned int i=0;
	clr R20
	clr R21
	.dbline 39
;    for (i=0;i<n;i++)
	xjmp L16
L13:
	.dbline 40
;    delay_1ms();
	xcall _delay_1ms
L14:
	.dbline 39
	subi R20,255  ; offset = 1
	sbci R21,255
L16:
	.dbline 39
	cp R20,R10
	cpc R21,R11
	brlo L13
X2:
	.dbline -2
L12:
	.dbline 0 ; func end
	xjmp pop_xgset300C
	.dbsym r i 20 i
	.dbsym r n 10 i
	.dbend
	.dbfile D:\MCU_Project\MCU_AVR\AVR_GY-29\I2C.h
	.dbfunc e I2C_Write _I2C_Write fc
;          Wdata -> R18
;     RegAddress -> R16
	.even
_I2C_Write::
	.dbline -1
	.dbline 41
; #include <macros.h>
; #include "delay.h"
; 
; //使用AVR内部硬件iic,引脚定义
; //PC0->SCL  ;  PC1->SDA
; //I2C 状态定义
; //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_ADDR  0xA7	   //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改
; #define WD_DEVICE_ADDR  0xA6	   //ALT  ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A
; 
; //常用TWI操作(主模式写和读)
; #define Start()			(TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))		//启动I2C
; #define Stop()			(TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))		//停止I2C
; #define Wait()			{while(!(TWCR&(1<<TWINT)));}				//等待中断发生
; #define TestAck()		(TWSR&0xf8)									//观察返回状态
; #define SetAck			(TWCR|=(1<<TWEA))							//做出ACK应答
; #define SetNoAck		(TWCR&=~(1<<TWEA))							//做出Not Ack应答
; #define Twi()			(TWCR=(1<<TWINT)|(1<<TWEN))				    //启动I2C
; #define Write8Bit(x)	{TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);}		//写数据到TWDR
; 
; unsigned char I2C_Write(unsigned char RegAddress,unsigned char Wdata);
; unsigned char I2C_Read(unsigned RegAddress);
; 
; /*********************************************
; I2C总线写一个字节
; 返回0:写成功
; 返回1:写失败
; **********************************************/
; unsigned char I2C_Write(unsigned char RegAddress,unsigned char Wdata)
; {
	.dbline 42
; 	  Start();						//I2C启动
	ldi R24,164
	out 0x36,R24
	.dbline 43
; 	  Wait();
L18:
	.dbline 43
L19:
	.dbline 43
	in R2,0x36
	sbrs R2,7
	rjmp L18
X3:
	.dbline 43
	.dbline 43
	.dbline 44
; 	  if(TestAck()!=START) 
	in R24,0x1
	andi R24,248
	cpi R24,8
	breq L21
X4:
	.dbline 45
; 		return 1;					//ACK
	ldi R16,1
	xjmp L17
L21:
	.dbline 47
; 	  
; 	  Write8Bit(WD_DEVICE_ADDR);	//写I2C从器件地址和写方式
	.dbline 47
	ldi R24,166
	out 0x3,R24
	.dbline 47
	ldi R24,132
	out 0x36,R24
	.dbline 47
	.dbline 47
	.dbline 48
; 	  Wait();
L23:
	.dbline 48
L24:
	.dbline 48
	in R2,0x36
	sbrs R2,7
	rjmp L23
X5:
	.dbline 48
	.dbline 48
	.dbline 49
; 	  if(TestAck()!=MT_SLA_ACK) 
	in R24,0x1
	andi R24,248
	cpi R24,24
	breq L26
X6:
	.dbline 50
; 		return 1;					//ACK
	ldi R16,1
	xjmp L17
L26:
	.dbline 52
; 	  
; 	  Write8Bit(RegAddress);		//写器件相应寄存器地址
	.dbline 52
	out 0x3,R16
	.dbline 52
	ldi R24,132
	out 0x36,R24
	.dbline 52
	.dbline 52
	.dbline 53
; 	  Wait();
L28:
	.dbline 53
L29:
	.dbline 53
	in R2,0x36
	sbrs R2,7
	rjmp L28
X7:
	.dbline 53
	.dbline 53
	.dbline 54
; 	  if(TestAck()!=MT_DATA_ACK) 
	in R24,0x1
	andi R24,248
	cpi R24,40
	breq L31
X8:
	.dbline 55
; 	  	return 1;				    //ACK
	ldi R16,1
	xjmp L17
L31:
	.dbline 57
; 	  
; 	  Write8Bit(Wdata);			 	//写数据到器件相应寄存器
	.dbline 57
	out 0x3,R18
	.dbline 57
	ldi R24,132
	out 0x36,R24
	.dbline 57
	.dbline 57
	.dbline 58
; 	  Wait();
L33:
	.dbline 58
L34:
	.dbline 58
	in R2,0x36
	sbrs R2,7
	rjmp L33
X9:
	.dbline 58
	.dbline 58
	.dbline 59
; 	  if(TestAck()!=MT_DATA_ACK) 
	in R24,0x1
	andi R24,248
	cpi R24,40
	breq L36
X10:
	.dbline 60
; 	  	return 1;				    //ACK	 
	ldi R16,1
	xjmp L17
L36:
	.dbline 61
; 	  Stop();  						//I2C停止
	ldi R24,148
	out 0x36,R24
	.dbline 63
;  	//delay_nms(10);				//延时  
; 	  return 0;
	clr R16
	.dbline -2
L17:
	.dbline 0 ; func end
	ret
	.dbsym r Wdata 18 c
	.dbsym r RegAddress 16 c
	.dbend
	.dbfunc e I2C_Read _I2C_Read fc
;           temp -> R10
;     RegAddress -> R16,R17
	.even
_I2C_Read::
	st -y,R10
	.dbline -1
	.dbline 74
; }
; 
; /*********************************************
; I2C总线读一个字节
; 返回0:读成功
; 返回1:读失败
; **********************************************/
; 
; unsigned char I2C_Read(unsigned RegAddress)
; 
;  {
	.dbline 76
; 	   unsigned char temp;
; 	   Start();//I2C启动
	ldi R24,164
	out 0x36,R24
	.dbline 77
; 	   Wait();
L39:
	.dbline 77
L40:
	.dbline 77
	in R2,0x36
	sbrs R2,7
	rjmp L39
X11:
	.dbline 77
	.dbline 77
	.dbline 78
; 	   if (TestAck()!=START) 
	in R24,0x1
	andi R24,248
	cpi R24,8
	breq L42
X12:
	.dbline 79
; 	   	  return 1;			 		//ACK	   
	ldi R16,1
	xjmp L38
L42:
	.dbline 81
; 	   
; 	   Write8Bit(WD_DEVICE_ADDR);	//写I2C从器件地址和写方式
	.dbline 81
	ldi R24,166
	out 0x3,R24
	.dbline 81
	ldi R24,132
	out 0x36,R24
	.dbline 81
	.dbline 81
	.dbline 82
; 	   Wait(); 
L44:
	.dbline 82
L45:
	.dbline 82
	in R2,0x36
	sbrs R2,7
	rjmp L44
X13:
	.dbline 82
	.dbline 82
	.dbline 83
; 	   if (TestAck()!=MT_SLA_ACK) 
	in R24,0x1
	andi R24,248
	cpi R24,24
	breq L47
X14:
	.dbline 84
; 	   	  return 1;				    //ACK
	ldi R16,1
	xjmp L38
L47:
	.dbline 86
; 	   
; 	   Write8Bit(RegAddress);		//写器件相应寄存器地址
	.dbline 86
	out 0x3,R16
	.dbline 86
	ldi R24,132
	out 0x36,R24
	.dbline 86
	.dbline 86
	.dbline 87
; 	   Wait();
L49:
	.dbline 87
L50:
	.dbline 87
	in R2,0x36
	sbrs R2,7
	rjmp L49
X15:
	.dbline 87
	.dbline 87
	.dbline 88
; 	   if (TestAck()!=MT_DATA_ACK) 
	in R24,0x1
	andi R24,248
	cpi R24,40
	breq L52
X16:
	.dbline 89
; 	   	  return 1;
	ldi R16,1
	xjmp L38
L52:
	.dbline 91
; 	   
; 	   Start();	   				   	//I2C重新启动
	ldi R24,164
	out 0x36,R24
	.dbline 92
; 	   Wait();
L54:
	.dbline 92
L55:
	.dbline 92
	in R2,0x36
	sbrs R2,7
	rjmp L54
X17:
	.dbline 92
	.dbline 92
	.dbline 93
; 	   if (TestAck()!=RE_START)  
	in R24,0x1
	andi R24,248
	cpi R24,16
	breq L57
X18:
	.dbline 94
; 	   	  return 1;
	ldi R16,1
	xjmp L38
L57:
	.dbline 96
; 	   
; 	   Write8Bit(RD_DEVICE_ADDR);	//写I2C从器件地址和读方式
	.dbline 96
	ldi R24,167
	out 0x3,R24
	.dbline 96
	ldi R24,132
	out 0x36,R24
	.dbline 96
	.dbline 96
	.dbline 97
; 	   Wait();
L59:
	.dbline 97
L60:
	.dbline 97
	in R2,0x36
	sbrs R2,7
	rjmp L59
X19:
	.dbline 97
	.dbline 97
	.dbline 98
; 	   if(TestAck()!=MR_SLA_ACK)  
	in R24,0x1
	andi R24,248
	cpi R24,64
	breq L62
X20:
	.dbline 99
; 	   	  return 1;				   //ACK
	ldi R16,1
	xjmp L38
L62:
	.dbline 101
; 	   
; 	   Twi();	 				   //启动主I2C读方式
	ldi R24,132
	out 0x36,R24
	.dbline 102
; 	   Wait();
L64:
	.dbline 102
L65:
	.dbline 102
	in R2,0x36
	sbrs R2,7
	rjmp L64
X21:
	.dbline 102
	.dbline 102
	.dbline 103
; 	   if(TestAck()!=MR_DATA_NOACK) 
	in R24,0x1
	andi R24,248

⌨️ 快捷键说明

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