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

📄 avr_gy-27.s

📁 GY-27资料源码 ADXL345 HMC5883L
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module AVR_GY-27.c
	.area text(rom, con, rel)
	.dbfile D:\MCU_Project\MCU_AVR\AVR_GY-27\AVR_GY-27.c
	.dbfile D:\MCU_Project\MCU_AVR\AVR_GY-27\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-27\I2C.h
	.dbfunc e I2C_Write _I2C_Write fc
;          Wdata -> R10
;     RegAddress -> R12
	.even
_I2C_Write::
	st -y,R10
	st -y,R12
	mov R10,R18
	mov R12,R16
	.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  0x3D	   
; #define WD_DEVICE_ADDR  0x3C	   
; 
; //常用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,60
	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,R12
	.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,R10
	.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 62
;  	delay_nms(10);				//延时  
	ldi R16,10
	ldi R17,0
	xcall _delay_nms
	.dbline 63
; 	  return 0;
	clr R16
	.dbline -2
L17:
	.dbline 0 ; func end
	ld R12,y+
	ld R10,y+
	ret
	.dbsym r Wdata 10 c
	.dbsym r RegAddress 12 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 77
; 	 unsigned  char  temp;
; 
; 	   Start();//I2C启动
	ldi R24,164
	out 0x36,R24
	.dbline 78
; 	   Wait();
L39:
	.dbline 78
L40:
	.dbline 78
	in R2,0x36
	sbrs R2,7
	rjmp L39
X11:
	.dbline 78
	.dbline 78
	.dbline 79
; 	   if (TestAck()!=START) 
	in R24,0x1
	andi R24,248
	cpi R24,8
	breq L42
X12:
	.dbline 80
; 	   	  return 1;			 		//ACK	   
	ldi R16,1
	xjmp L38
L42:
	.dbline 82
; 	   
; 	   Write8Bit(WD_DEVICE_ADDR);	//写I2C从器件地址和写方式
	.dbline 82
	ldi R24,60
	out 0x3,R24
	.dbline 82
	ldi R24,132
	out 0x36,R24
	.dbline 82
	.dbline 82
	.dbline 83
; 	   Wait(); 
L44:
	.dbline 83
L45:
	.dbline 83
	in R2,0x36
	sbrs R2,7
	rjmp L44
X13:
	.dbline 83
	.dbline 83
	.dbline 84
; 	   if (TestAck()!=MT_SLA_ACK) 
	in R24,0x1
	andi R24,248
	cpi R24,24
	breq L47
X14:
	.dbline 85
; 	   	  return 1;				    //ACK
	ldi R16,1
	xjmp L38
L47:
	.dbline 87
; 	   
; 	   Write8Bit(RegAddress);		//写器件相应寄存器地址
	.dbline 87
	out 0x3,R16
	.dbline 87
	ldi R24,132
	out 0x36,R24
	.dbline 87
	.dbline 87
	.dbline 88
; 	   Wait();
L49:
	.dbline 88
L50:
	.dbline 88
	in R2,0x36
	sbrs R2,7
	rjmp L49
X15:
	.dbline 88
	.dbline 88
	.dbline 89
; 	   if (TestAck()!=MT_DATA_ACK) 
	in R24,0x1
	andi R24,248
	cpi R24,40
	breq L52
X16:
	.dbline 90
; 	   	  return 1;
	ldi R16,1
	xjmp L38
L52:
	.dbline 92
; 
; 	    Start();	   				   	//I2C重新启动
	ldi R24,164
	out 0x36,R24
	.dbline 93
; 	   Wait();
L54:
	.dbline 93
L55:
	.dbline 93
	in R2,0x36
	sbrs R2,7
	rjmp L54
X17:
	.dbline 93
	.dbline 93
	.dbline 94
; 	   if (TestAck()!=RE_START)  
	in R24,0x1
	andi R24,248
	cpi R24,16
	breq L57
X18:
	.dbline 95
; 	   	return 1;
	ldi R16,1
	xjmp L38
L57:
	.dbline 96
; 	   Write8Bit(RD_DEVICE_ADDR);	//写I2C从器件地址和读方式
	.dbline 96
	ldi R24,61
	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
	cpi R24,88
	breq L67
X22:
	.dbline 104
; 	   	 return 1;					//ACK	
	ldi R16,1
	xjmp L38
L67:
	.dbline 106
; 	   
; 	   temp=TWDR;//读取I2C接收数据
	in R10,0x3
	.dbline 107
;        Stop();//I2C停止
	ldi R24,148
	out 0x36,R24
	.dbline 108
; 	   return temp;
	mov R16,R10
	.dbline -2
L38:
	.dbline 0 ; func end
	ld R10,y+
	ret
	.dbsym r temp 10 c
	.dbsym r RegAddress 16 i
	.dbend
	.dbfile D:\MCU_Project\MCU_AVR\AVR_GY-27\1602.h
	.dbfunc e LCD_init _LCD_init fV
	.even
_LCD_init::
	.dbline -1
	.dbline 44
; /* 用法:
;    LCD_init();
;    LCD_write_string(列,行,"字符串");
;    LCD_write_char(列,行,'字符'); 
;  ---------------------------------------------------------------
; 下面是AVR与LCD连接信息
;   PC6 ->RS
;   PC7 ->EN
;   地  ->RW
;   PA4 ->D4
;   PA5 ->D5
;   PA6 ->D6
;   PA7 ->D7
; 使用端口:1602:PC6,PC7,PA4~PA7 	
; 要使用本驱动,改变下面配置信息即可
; -----------------------------------------------------------------*/
; #define LCD_EN_PORT    PORTC   //以下2个要设为同一个口
; #define LCD_EN_DDR     DDRC
; #define LCD_RS_PORT    PORTC   //以下2个要设为同一个口
; #define LCD_RS_DDR     DDRC
; #define LCD_DATA_PORT  PORTA   //以下3个要设为同一个口
; #define LCD_DATA_DDR   DDRA    //默认情况下连线必须使用高四位端口,如果不是请注意修改
; #define LCD_DATA_PIN   PINA
; #define LCD_RS         (1<<PC6) //0x20   portC6       out
; #define LCD_EN         (1<<PC7) //0x40   portC7       out
; #define LCD_DATA       ((1<<PA4)|(1<<PA5)|(1<<PA6)|(1<<PA7)) //0xf0   portA 4/5/6/7 out
; /*--------------------------------------------------------------------------------------------------
; 函数说明
; --------------------------------------------------------------------------------------------------*/
; void LCD_init(void);
; void LCD_en_write(void);
; void LCD_write_command(unsigned  char command) ;
; void LCD_write_data(unsigned char data);
; void LCD_set_xy (unsigned char x, unsigned char y);
; void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);
; void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data);
; 
; //-----------------------------------------------------------------------------------------
; 
; #include <macros.h>
; #include "delay.h"
; 
; void LCD_init(void)         //液晶初始化
; {
	.dbline 45
;   LCD_DATA_DDR|=LCD_DATA;   //数据口方向为输出
	in R24,0x1a
	ori R24,240
	out 0x1a,R24
	.dbline 46
;   LCD_EN_DDR|=LCD_EN;       //设置EN方向为输出
	sbi 0x14,7
	.dbline 47
;   LCD_RS_DDR|=LCD_RS;       //设置RS方向为输出
	sbi 0x14,6
	.dbline 48
;   LCD_write_command(0x28); 
	ldi R16,40
	xcall _LCD_write_command
	.dbline 49
;   LCD_en_write();
	xcall _LCD_en_write
	.dbline 50
;   delay_nus(40);
	ldi R16,40
	ldi R17,0
	xcall _delay_nus
	.dbline 51
;   LCD_write_command(0x28);  //4位显示
	ldi R16,40
	xcall _LCD_write_command
	.dbline 52
;   LCD_write_command(0x0c);  //显示开
	ldi R16,12
	xcall _LCD_write_command
	.dbline 53
;   LCD_write_command(0x01);  //清屏
	ldi R16,1
	xcall _LCD_write_command
	.dbline 54
;   delay_nms(10);
	ldi R16,10
	ldi R17,0
	xcall _delay_nms
	.dbline -2
L69:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e LCD_en_write _LCD_en_write fV
	.even
_LCD_en_write::
	.dbline -1
	.dbline 58
; }
; 
; void LCD_en_write(void)  //液晶使能
; {
	.dbline 59
;   LCD_EN_PORT|=LCD_EN;
	sbi 0x15,7
	.dbline 60
;   delay_nus(1);
	ldi R16,1

⌨️ 快捷键说明

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