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

📄 avr_gy-29.lst

📁 GY-27资料源码 ADXL345 HMC5883L
💻 LST
📖 第 1 页 / 共 4 页
字号:
__text_start:
__start:
      76 EFCF      LDI	R28,0xFF
      77 E2D1      LDI	R29,0x21
      78 BFCD      OUT	0x3D,R28
      79 BFDE      OUT	0x3E,R29
      7A 51CE      SUBI	R28,0x1E
      7B 40D0      SBCI	R29,0
      7C EA0A      LDI	R16,0xAA
      7D 8308      STD	Y+0,R16
      7E 2400      CLR	R0
      7F E0E4      LDI	R30,4
      80 E0F2      LDI	R31,2
      81 E012      LDI	R17,2
      82 30E4      CPI	R30,4
      83 07F1      CPC	R31,R17
      84 F011      BEQ	0x0087
      85 9201      ST	R0,Z+
      86 CFFB      RJMP	0x0082
      87 8300      STD	Z+0,R16
      88 EEE8      LDI	R30,0xE8
      89 E0F0      LDI	R31,0
      8A E0A0      LDI	R26,0
      8B E0B2      LDI	R27,2
      8C E010      LDI	R17,0
      8D E000      LDI	R16,0
      8E BF0B      OUT	0x3B,R16
      8F 3EEC      CPI	R30,0xEC
      90 07F1      CPC	R31,R17
      91 F021      BEQ	0x0096
      92 95C8      LPM
      93 9631      ADIW	R30,1
      94 920D      ST	R0,X+
      95 CFF9      RJMP	0x008F
      96 940E 0341 CALL	_main
_exit:
      98 CFFF      RJMP	_exit
FILE: D:\MCU_Project\MCU_AVR\AVR_GY-29\delay.h
(0001) /*-----------------------------------------------------------------------
(0002) 延时函数
(0003) 编译器:ICC-AVR v6.31A 
(0004) 目标芯片 : M16
(0005) 时钟: 8.0000Mhz
(0006) -----------------------------------------------------------------------*/
(0007) #ifndef __delay_h
(0008) #define __delay_h
(0009) void delay_nus(unsigned int n);
(0010) void delay_nms(unsigned int n);
(0011) void delay_1us(void);
(0012) void delay_1ms(void) ; 
(0013) 
(0014) void delay_1us(void)                 //1us延时函数
(0015)   {
(0016)    asm("nop");
_delay_1us:
      99 0000      NOP
(0017)    asm("nop");
      9A 0000      NOP
(0018)    asm("nop");
      9B 0000      NOP
(0019)    asm("nop");
      9C 0000      NOP
(0020)    asm("nop");
      9D 0000      NOP
      9E 9508      RET
_delay_nus:
  i                    --> R20
  n                    --> R10
      9F 940E 037F CALL	push_xgset300C
      A1 0158      MOVW	R10,R16
(0021)   }
(0022) 
(0023) void delay_nus(unsigned int n)       //N us延时函数
(0024)   {
(0025)    unsigned int i=0;
      A2 2744      CLR	R20
      A3 2755      CLR	R21
(0026)    for (i=0;i<n;i++)
      A4 C003      RJMP	0x00A8
(0027)    delay_1us();
      A5 DFF3      RCALL	_delay_1us
      A6 5F4F      SUBI	R20,0xFF
      A7 4F5F      SBCI	R21,0xFF
      A8 154A      CP	R20,R10
      A9 055B      CPC	R21,R11
      AA F3D0      BCS	0x00A5
      AB 940C 0384 JMP	pop_xgset300C
(0028)   }
(0029)   
(0030) void delay_1ms(void)                 //1ms延时函数
(0031)   {
(0032)    unsigned int i;
(0033)    for (i=0;i<500;i++);
_delay_1ms:
  i                    --> R16
      AD 2700      CLR	R16
      AE 2711      CLR	R17
      AF C002      RJMP	0x00B2
      B0 5F0F      SUBI	R16,0xFF
      B1 4F1F      SBCI	R17,0xFF
      B2 3F04      CPI	R16,0xF4
      B3 E0E1      LDI	R30,1
      B4 071E      CPC	R17,R30
      B5 F3D0      BCS	0x00B0
      B6 9508      RET
_delay_nms:
  i                    --> R20
  n                    --> R10
      B7 940E 037F CALL	push_xgset300C
      B9 0158      MOVW	R10,R16
(0034)   }
(0035)   
(0036) void delay_nms(unsigned int n)       //N ms延时函数
(0037)   {
(0038)    unsigned int i=0;
      BA 2744      CLR	R20
      BB 2755      CLR	R21
(0039)    for (i=0;i<n;i++)
      BC C003      RJMP	0x00C0
(0040)    delay_1ms();
      BD DFEF      RCALL	_delay_1ms
      BE 5F4F      SUBI	R20,0xFF
      BF 4F5F      SBCI	R21,0xFF
      C0 154A      CP	R20,R10
      C1 055B      CPC	R21,R11
      C2 F3D0      BCS	0x00BD
      C3 940C 0384 JMP	pop_xgset300C
FILE: D:\MCU_Project\MCU_AVR\AVR_GY-29\I2C.h
(0001) #include <macros.h>
(0002) #include "delay.h"
(0003) 
(0004) //使用AVR内部硬件iic,引脚定义
(0005) //PC0->SCL  ;  PC1->SDA
(0006) //I2C 状态定义
(0007) //MT 主方式传输 MR 主方式接受
(0008) #define START			0x08
(0009) #define RE_START		0x10
(0010) #define MT_SLA_ACK		0x18
(0011) #define MT_SLA_NOACK 	0x20
(0012) #define MT_DATA_ACK		0x28
(0013) #define MT_DATA_NOACK	0x30
(0014) #define MR_SLA_ACK		0x40
(0015) #define MR_SLA_NOACK	0x48
(0016) #define MR_DATA_ACK		0x50
(0017) #define MR_DATA_NOACK	0x58	
(0018) 	                            
(0019) #define RD_DEVICE_ADDR  0xA7	   //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改
(0020) #define WD_DEVICE_ADDR  0xA6	   //ALT  ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A
(0021) 
(0022) //常用TWI操作(主模式写和读)
(0023) #define Start()			(TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))		//启动I2C
(0024) #define Stop()			(TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))		//停止I2C
(0025) #define Wait()			{while(!(TWCR&(1<<TWINT)));}				//等待中断发生
(0026) #define TestAck()		(TWSR&0xf8)									//观察返回状态
(0027) #define SetAck			(TWCR|=(1<<TWEA))							//做出ACK应答
(0028) #define SetNoAck		(TWCR&=~(1<<TWEA))							//做出Not Ack应答
(0029) #define Twi()			(TWCR=(1<<TWINT)|(1<<TWEN))				    //启动I2C
(0030) #define Write8Bit(x)	{TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);}		//写数据到TWDR
(0031) 
(0032) unsigned char I2C_Write(unsigned char RegAddress,unsigned char Wdata);
(0033) unsigned char I2C_Read(unsigned RegAddress);
(0034) 
(0035) /*********************************************
(0036) I2C总线写一个字节
(0037) 返回0:写成功
(0038) 返回1:写失败
(0039) **********************************************/
(0040) unsigned char I2C_Write(unsigned char RegAddress,unsigned char Wdata)
(0041) {
(0042) 	  Start();						//I2C启动
_I2C_Write:
  Wdata                --> R18
  RegAddress           --> R16
      C5 EA84      LDI	R24,0xA4
      C6 BF86      OUT	0x36,R24
(0043) 	  Wait();
      C7 B626      IN	R2,0x36
      C8 FE27      SBRS	R2,7
      C9 CFFD      RJMP	0x00C7
(0044) 	  if(TestAck()!=START) 
      CA B181      IN	R24,0x01
      CB 7F88      ANDI	R24,0xF8
      CC 3088      CPI	R24,0x8
      CD F011      BEQ	0x00D0
(0045) 		return 1;					//ACK
      CE E001      LDI	R16,1
      CF C028      RJMP	0x00F8
(0046) 	  
(0047) 	  Write8Bit(WD_DEVICE_ADDR);	//写I2C从器件地址和写方式
      D0 EA86      LDI	R24,0xA6
      D1 B983      OUT	0x03,R24
      D2 E884      LDI	R24,0x84
      D3 BF86      OUT	0x36,R24
(0048) 	  Wait();
      D4 B626      IN	R2,0x36
      D5 FE27      SBRS	R2,7
      D6 CFFD      RJMP	0x00D4
(0049) 	  if(TestAck()!=MT_SLA_ACK) 
      D7 B181      IN	R24,0x01
      D8 7F88      ANDI	R24,0xF8
      D9 3188      CPI	R24,0x18
      DA F011      BEQ	0x00DD
(0050) 		return 1;					//ACK
      DB E001      LDI	R16,1
      DC C01B      RJMP	0x00F8
(0051) 	  
(0052) 	  Write8Bit(RegAddress);		//写器件相应寄存器地址
      DD B903      OUT	0x03,R16
      DE E884      LDI	R24,0x84
      DF BF86      OUT	0x36,R24
(0053) 	  Wait();
      E0 B626      IN	R2,0x36
      E1 FE27      SBRS	R2,7
      E2 CFFD      RJMP	0x00E0
(0054) 	  if(TestAck()!=MT_DATA_ACK) 
      E3 B181      IN	R24,0x01
      E4 7F88      ANDI	R24,0xF8
      E5 3288      CPI	R24,0x28
      E6 F011      BEQ	0x00E9
(0055) 	  	return 1;				    //ACK
      E7 E001      LDI	R16,1
      E8 C00F      RJMP	0x00F8
(0056) 	  
(0057) 	  Write8Bit(Wdata);			 	//写数据到器件相应寄存器
      E9 B923      OUT	0x03,R18
      EA E884      LDI	R24,0x84
      EB BF86      OUT	0x36,R24
(0058) 	  Wait();
      EC B626      IN	R2,0x36
      ED FE27      SBRS	R2,7
      EE CFFD      RJMP	0x00EC
(0059) 	  if(TestAck()!=MT_DATA_ACK) 
      EF B181      IN	R24,0x01
      F0 7F88      ANDI	R24,0xF8
      F1 3288      CPI	R24,0x28
      F2 F011      BEQ	0x00F5
(0060) 	  	return 1;				    //ACK	 
      F3 E001      LDI	R16,1
      F4 C003      RJMP	0x00F8
(0061) 	  Stop();  						//I2C停止
      F5 E984      LDI	R24,0x94
      F6 BF86      OUT	0x36,R24
(0062)  	//delay_nms(10);				//延时  
(0063) 	  return 0;
      F7 2700      CLR	R16
      F8 9508      RET
_I2C_Read:
  temp                 --> R10
  RegAddress           --> R16
      F9 92AA      ST	R10,-Y
(0064) }
(0065) 
(0066) /*********************************************
(0067) I2C总线读一个字节
(0068) 返回0:读成功
(0069) 返回1:读失败
(0070) **********************************************/
(0071) 
(0072) unsigned char I2C_Read(unsigned RegAddress)
(0073) 
(0074)  {
(0075) 	   unsigned char temp;
(0076) 	   Start();//I2C启动
      FA EA84      LDI	R24,0xA4
      FB BF86      OUT	0x36,R24
(0077) 	   Wait();
      FC B626      IN	R2,0x36
      FD FE27      SBRS	R2,7
      FE CFFD      RJMP	0x00FC
(0078) 	   if (TestAck()!=START) 
      FF B181      IN	R24,0x01
     100 7F88      ANDI	R24,0xF8
     101 3088      CPI	R24,0x8
     102 F011      BEQ	0x0105
(0079) 	   	  return 1;			 		//ACK	   
     103 E001      LDI	R16,1
     104 C040      RJMP	0x0145
(0080) 	   
(0081) 	   Write8Bit(WD_DEVICE_ADDR);	//写I2C从器件地址和写方式
     105 EA86      LDI	R24,0xA6
     106 B983      OUT	0x03,R24
     107 E884      LDI	R24,0x84
     108 BF86      OUT	0x36,R24
(0082) 	   Wait(); 
     109 B626      IN	R2,0x36
     10A FE27      SBRS	R2,7
     10B CFFD      RJMP	0x0109
(0083) 	   if (TestAck()!=MT_SLA_ACK) 
     10C B181      IN	R24,0x01
     10D 7F88      ANDI	R24,0xF8
     10E 3188      CPI	R24,0x18
     10F F011      BEQ	0x0112
(0084) 	   	  return 1;				    //ACK
     110 E001      LDI	R16,1
     111 C033      RJMP	0x0145
(0085) 	   
(0086) 	   Write8Bit(RegAddress);		//写器件相应寄存器地址
     112 B903      OUT	0x03,R16
     113 E884      LDI	R24,0x84
     114 BF86      OUT	0x36,R24
(0087) 	   Wait();
     115 B626      IN	R2,0x36
     116 FE27      SBRS	R2,7
     117 CFFD      RJMP	0x0115
(0088) 	   if (TestAck()!=MT_DATA_ACK) 
     118 B181      IN	R24,0x01
     119 7F88      ANDI	R24,0xF8
     11A 3288      CPI	R24,0x28
     11B F011      BEQ	0x011E
(0089) 	   	  return 1;
     11C E001      LDI	R16,1
     11D C027      RJMP	0x0145
(0090) 	   
(0091) 	   Start();	   				   	//I2C重新启动
     11E EA84      LDI	R24,0xA4
     11F BF86      OUT	0x36,R24
(0092) 	   Wait();
     120 B626      IN	R2,0x36
     121 FE27      SBRS	R2,7
     122 CFFD      RJMP	0x0120
(0093) 	   if (TestAck()!=RE_START)  
     123 B181      IN	R24,0x01
     124 7F88      ANDI	R24,0xF8
     125 3180      CPI	R24,0x10
     126 F011      BEQ	0x0129
(0094) 	   	  return 1;
     127 E001      LDI	R16,1
     128 C01C      RJMP	0x0145
(0095) 	   
(0096) 	   Write8Bit(RD_DEVICE_ADDR);	//写I2C从器件地址和读方式
     129 EA87      LDI	R24,0xA7
     12A B983      OUT	0x03,R24
     12B E884      LDI	R24,0x84
     12C BF86      OUT	0x36,R24
(0097) 	   Wait();
     12D B626      IN	R2,0x36
     12E FE27      SBRS	R2,7
     12F CFFD      RJMP	0x012D
(0098) 	   if(TestAck()!=MR_SLA_ACK)  
     130 B181      IN	R24,0x01
     131 7F88      ANDI	R24,0xF8
     132 3480      CPI	R24,0x40
     133 F011      BEQ	0x0136
(0099) 	   	  return 1;				   //ACK
     134 E001      LDI	R16,1
     135 C00F      RJMP	0x0145
(0100) 	   
(0101) 	   Twi();	 				   //启动主I2C读方式
     136 E884      LDI	R24,0x84
     137 BF86      OUT	0x36,R24
(0102) 	   Wait();
     138 B626      IN	R2,0x36
     139 FE27      SBRS	R2,7
     13A CFFD      RJMP	0x0138
(0103) 	   if(TestAck()!=MR_DATA_NOACK) 
     13B B181      IN	R24,0x01
     13C 7F88      ANDI	R24,0xF8
     13D 3588      CPI	R24,0x58
     13E F011      BEQ	0x0141
(0104) 	   	 return 1;					//ACK	
     13F E001      LDI	R16,1
     140 C004      RJMP	0x0145
(0105) 	   
(0106) 	   temp=TWDR;//读取I2C接收数据
     141 B0A3      IN	R10,0x03
(0107)        Stop();//I2C停止
     142 E984      LDI	R24,0x94
     143 BF86      OUT	0x36,R24
(0108) 	   return temp;
     144 2D0A      MOV	R16,R10
     145 90A9      LD	R10,Y+
     146 9508      RET
FILE: D:\MCU_Project\MCU_AVR\AVR_GY-29\1602.h
(0001) /* 用法:
(0002)    LCD_init();
(0003)    LCD_write_string(列,行,"字符串");
(0004)    LCD_write_char(列,行,'字符'); 
(0005)  ---------------------------------------------------------------
(0006) 下面是AVR与LCD连接信息
(0007)   PC6 ->RS
(0008)   PC7 ->EN
(0009)   地  ->RW
(0010)   PA4 ->D4
(0011)   PA5 ->D5
(0012)   PA6 ->D6
(0013)   PA7 ->D7
(0014) 使用端口:1602:PC6,PC7,PA4~PA7 	
(0015) 要使用本驱动,改变下面配置信息即可
(0016) -----------------------------------------------------------------*/
(0017) #define LCD_EN_PORT    PORTC   //以下2个要设为同一个口
(0018) #define LCD_EN_DDR     DDRC
(0019) #define LCD_RS_PORT    PORTC   //以下2个要设为同一个口
(0020) #define LCD_RS_DDR     DDRC
(0021) #define LCD_DATA_PORT  PORTA   //以下3个要设为同一个口
(0022) #define LCD_DATA_DDR   DDRA    //默认情况下连线必须使用高四位端口,如果不是请注意修改
(0023) #define LCD_DATA_PIN   PINA
(0024) #define LCD_RS         (1<<PC6) //0x20   portC6       out
(0025) #define LCD_EN         (1<<PC7) //0x40   portC7       out
(0026) #define LCD_DATA       ((1<<PA4)|(1<<PA5)|(1<<PA6)|(1<<PA7)) //0xf0   portA 4/5/6/7 out

⌨️ 快捷键说明

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