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

📄 avr_gy-27.lst

📁 GY-27资料源码 ADXL345 HMC5883L
💻 LST
📖 第 1 页 / 共 5 页
字号:
__text_start:
__start:
      AF EFCF      LDI	R28,0xFF
      B0 E2D1      LDI	R29,0x21
      B1 BFCD      OUT	0x3D,R28
      B2 BFDE      OUT	0x3E,R29
      B3 51CE      SUBI	R28,0x1E
      B4 40D0      SBCI	R29,0
      B5 EA0A      LDI	R16,0xAA
      B6 8308      STD	Y+0,R16
      B7 2400      CLR	R0
      B8 E0E5      LDI	R30,5
      B9 E0F2      LDI	R31,2
      BA E012      LDI	R17,2
      BB 30E7      CPI	R30,7
      BC 07F1      CPC	R31,R17
      BD F011      BEQ	0x00C0
      BE 9201      ST	R0,Z+
      BF CFFB      RJMP	0x00BB
      C0 8300      STD	Z+0,R16
      C1 E5E8      LDI	R30,0x58
      C2 E0F1      LDI	R31,1
      C3 E0A0      LDI	R26,0
      C4 E0B2      LDI	R27,2
      C5 E011      LDI	R17,1
      C6 E000      LDI	R16,0
      C7 BF0B      OUT	0x3B,R16
      C8 35ED      CPI	R30,0x5D
      C9 07F1      CPC	R31,R17
      CA F021      BEQ	0x00CF
      CB 95C8      LPM
      CC 9631      ADIW	R30,1
      CD 920D      ST	R0,X+
      CE CFF9      RJMP	0x00C8
      CF 940E 02ED CALL	_main
_exit:
      D1 CFFF      RJMP	_exit
FILE: D:\MCU_Project\MCU_AVR\AVR_GY-27\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:
      D2 0000      NOP
(0017)    asm("nop");
      D3 0000      NOP
(0018)    asm("nop");
      D4 0000      NOP
(0019)    asm("nop");
      D5 0000      NOP
(0020)    asm("nop");
      D6 0000      NOP
      D7 9508      RET
_delay_nus:
  i                    --> R20
  n                    --> R10
      D8 940E 0345 CALL	push_xgset300C
      DA 0158      MOVW	R10,R16
(0021)   }
(0022) 
(0023) void delay_nus(unsigned int n)       //N us延时函数
(0024)   {
(0025)    unsigned int i=0;
      DB 2744      CLR	R20
      DC 2755      CLR	R21
(0026)    for (i=0;i<n;i++)
      DD C003      RJMP	0x00E1
(0027)    delay_1us();
      DE DFF3      RCALL	_delay_1us
      DF 5F4F      SUBI	R20,0xFF
      E0 4F5F      SBCI	R21,0xFF
      E1 154A      CP	R20,R10
      E2 055B      CPC	R21,R11
      E3 F3D0      BCS	0x00DE
      E4 940C 034A 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
      E6 2700      CLR	R16
      E7 2711      CLR	R17
      E8 C002      RJMP	0x00EB
      E9 5F0F      SUBI	R16,0xFF
      EA 4F1F      SBCI	R17,0xFF
      EB 3F04      CPI	R16,0xF4
      EC E0E1      LDI	R30,1
      ED 071E      CPC	R17,R30
      EE F3D0      BCS	0x00E9
      EF 9508      RET
_delay_nms:
  i                    --> R20
  n                    --> R10
      F0 940E 0345 CALL	push_xgset300C
      F2 0158      MOVW	R10,R16
(0034)   }
(0035)   
(0036) void delay_nms(unsigned int n)       //N ms延时函数
(0037)   {
(0038)    unsigned int i=0;
      F3 2744      CLR	R20
      F4 2755      CLR	R21
(0039)    for (i=0;i<n;i++)
      F5 C003      RJMP	0x00F9
(0040)    delay_1ms();
      F6 DFEF      RCALL	_delay_1ms
      F7 5F4F      SUBI	R20,0xFF
      F8 4F5F      SBCI	R21,0xFF
      F9 154A      CP	R20,R10
      FA 055B      CPC	R21,R11
      FB F3D0      BCS	0x00F6
      FC 940C 034A JMP	pop_xgset300C
_I2C_Write:
  Wdata                --> R10
  RegAddress           --> R12
      FE 92AA      ST	R10,-Y
      FF 92CA      ST	R12,-Y
     100 2EA2      MOV	R10,R18
     101 2EC0      MOV	R12,R16
FILE: D:\MCU_Project\MCU_AVR\AVR_GY-27\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  0x3D	   
(0020) #define WD_DEVICE_ADDR  0x3C	   
(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启动
     102 EA84      LDI	R24,0xA4
     103 BF86      OUT	0x36,R24
(0043) 	  Wait();
     104 B626      IN	R2,0x36
     105 FE27      SBRS	R2,7
     106 CFFD      RJMP	0x0104
(0044) 	  if(TestAck()!=START) 
     107 B181      IN	R24,0x01
     108 7F88      ANDI	R24,0xF8
     109 3088      CPI	R24,0x8
     10A F011      BEQ	0x010D
(0045) 		return 1;					//ACK
     10B E001      LDI	R16,1
     10C C02B      RJMP	0x0138
(0046) 	  
(0047) 	  Write8Bit(WD_DEVICE_ADDR);	//写I2C从器件地址和写方式
     10D E38C      LDI	R24,0x3C
     10E B983      OUT	0x03,R24
     10F E884      LDI	R24,0x84
     110 BF86      OUT	0x36,R24
(0048) 	  Wait();
     111 B626      IN	R2,0x36
     112 FE27      SBRS	R2,7
     113 CFFD      RJMP	0x0111
(0049) 	  if(TestAck()!=MT_SLA_ACK) 
     114 B181      IN	R24,0x01
     115 7F88      ANDI	R24,0xF8
     116 3188      CPI	R24,0x18
     117 F011      BEQ	0x011A
(0050) 		return 1;					//ACK
     118 E001      LDI	R16,1
     119 C01E      RJMP	0x0138
(0051) 	  
(0052) 	  Write8Bit(RegAddress);		//写器件相应寄存器地址
     11A B8C3      OUT	0x03,R12
     11B E884      LDI	R24,0x84
     11C BF86      OUT	0x36,R24
(0053) 	  Wait();
     11D B626      IN	R2,0x36
     11E FE27      SBRS	R2,7
     11F CFFD      RJMP	0x011D
(0054) 	  if(TestAck()!=MT_DATA_ACK) 
     120 B181      IN	R24,0x01
     121 7F88      ANDI	R24,0xF8
     122 3288      CPI	R24,0x28
     123 F011      BEQ	0x0126
(0055) 	  	return 1;				    //ACK
     124 E001      LDI	R16,1
     125 C012      RJMP	0x0138
(0056) 	  
(0057) 	  Write8Bit(Wdata);			 	//写数据到器件相应寄存器
     126 B8A3      OUT	0x03,R10
     127 E884      LDI	R24,0x84
     128 BF86      OUT	0x36,R24
(0058) 	  Wait();
     129 B626      IN	R2,0x36
     12A FE27      SBRS	R2,7
     12B CFFD      RJMP	0x0129
(0059) 	  if(TestAck()!=MT_DATA_ACK) 
     12C B181      IN	R24,0x01
     12D 7F88      ANDI	R24,0xF8
     12E 3288      CPI	R24,0x28
     12F F011      BEQ	0x0132
(0060) 	  	return 1;				    //ACK	 
     130 E001      LDI	R16,1
     131 C006      RJMP	0x0138
(0061) 	  Stop();  						//I2C停止
     132 E984      LDI	R24,0x94
     133 BF86      OUT	0x36,R24
(0062)  	delay_nms(10);				//延时  
     134 E00A      LDI	R16,0xA
     135 E010      LDI	R17,0
     136 DFB9      RCALL	_delay_nms
(0063) 	  return 0;
     137 2700      CLR	R16
     138 90C9      LD	R12,Y+
     139 90A9      LD	R10,Y+
     13A 9508      RET
_I2C_Read:
  temp                 --> R10
  RegAddress           --> R16
     13B 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) 
(0077) 	   Start();//I2C启动
     13C EA84      LDI	R24,0xA4
     13D BF86      OUT	0x36,R24
(0078) 	   Wait();
     13E B626      IN	R2,0x36
     13F FE27      SBRS	R2,7
     140 CFFD      RJMP	0x013E
(0079) 	   if (TestAck()!=START) 
     141 B181      IN	R24,0x01
     142 7F88      ANDI	R24,0xF8
     143 3088      CPI	R24,0x8
     144 F011      BEQ	0x0147
(0080) 	   	  return 1;			 		//ACK	   
     145 E001      LDI	R16,1
     146 C040      RJMP	0x0187
(0081) 	   
(0082) 	   Write8Bit(WD_DEVICE_ADDR);	//写I2C从器件地址和写方式
     147 E38C      LDI	R24,0x3C
     148 B983      OUT	0x03,R24
     149 E884      LDI	R24,0x84
     14A BF86      OUT	0x36,R24
(0083) 	   Wait(); 
     14B B626      IN	R2,0x36
     14C FE27      SBRS	R2,7
     14D CFFD      RJMP	0x014B
(0084) 	   if (TestAck()!=MT_SLA_ACK) 
     14E B181      IN	R24,0x01
     14F 7F88      ANDI	R24,0xF8
     150 3188      CPI	R24,0x18
     151 F011      BEQ	0x0154
(0085) 	   	  return 1;				    //ACK
     152 E001      LDI	R16,1
     153 C033      RJMP	0x0187
(0086) 	   
(0087) 	   Write8Bit(RegAddress);		//写器件相应寄存器地址
     154 B903      OUT	0x03,R16
     155 E884      LDI	R24,0x84
     156 BF86      OUT	0x36,R24
(0088) 	   Wait();
     157 B626      IN	R2,0x36
     158 FE27      SBRS	R2,7
     159 CFFD      RJMP	0x0157
(0089) 	   if (TestAck()!=MT_DATA_ACK) 
     15A B181      IN	R24,0x01
     15B 7F88      ANDI	R24,0xF8
     15C 3288      CPI	R24,0x28
     15D F011      BEQ	0x0160
(0090) 	   	  return 1;
     15E E001      LDI	R16,1
     15F C027      RJMP	0x0187
(0091) 
(0092) 	    Start();	   				   	//I2C重新启动
     160 EA84      LDI	R24,0xA4
     161 BF86      OUT	0x36,R24
(0093) 	   Wait();
     162 B626      IN	R2,0x36
     163 FE27      SBRS	R2,7
     164 CFFD      RJMP	0x0162
(0094) 	   if (TestAck()!=RE_START)  
     165 B181      IN	R24,0x01
     166 7F88      ANDI	R24,0xF8
     167 3180      CPI	R24,0x10
     168 F011      BEQ	0x016B
(0095) 	   	return 1;
     169 E001      LDI	R16,1
     16A C01C      RJMP	0x0187
(0096) 	   Write8Bit(RD_DEVICE_ADDR);	//写I2C从器件地址和读方式
     16B E38D      LDI	R24,0x3D
     16C B983      OUT	0x03,R24
     16D E884      LDI	R24,0x84
     16E BF86      OUT	0x36,R24
(0097) 	   Wait();
     16F B626      IN	R2,0x36
     170 FE27      SBRS	R2,7
     171 CFFD      RJMP	0x016F
(0098) 	   if(TestAck()!=MR_SLA_ACK)  
     172 B181      IN	R24,0x01
     173 7F88      ANDI	R24,0xF8
     174 3480      CPI	R24,0x40
     175 F011      BEQ	0x0178
(0099) 	   	  return 1;				   //ACK
     176 E001      LDI	R16,1
     177 C00F      RJMP	0x0187
(0100) 	   
(0101) 	   Twi();	 				   //启动主I2C读方式
     178 E884      LDI	R24,0x84
     179 BF86      OUT	0x36,R24
(0102) 	   Wait();
     17A B626      IN	R2,0x36
     17B FE27      SBRS	R2,7
     17C CFFD      RJMP	0x017A
(0103) 	   if(TestAck()!=MR_DATA_NOACK) 
     17D B181      IN	R24,0x01
     17E 7F88      ANDI	R24,0xF8
     17F 3588      CPI	R24,0x58
     180 F011      BEQ	0x0183
(0104) 	   	 return 1;					//ACK	
     181 E001      LDI	R16,1
     182 C004      RJMP	0x0187
(0105) 	   
(0106) 	   temp=TWDR;//读取I2C接收数据
     183 B0A3      IN	R10,0x03
(0107)        Stop();//I2C停止
     184 E984      LDI	R24,0x94
     185 BF86      OUT	0x36,R24
(0108) 	   return temp;
     186 2D0A      MOV	R16,R10
     187 90A9      LD	R10,Y+
     188 9508      RET
FILE: D:\MCU_Project\MCU_AVR\AVR_GY-27\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
(0027) /*--------------------------------------------------------------------------------------------------
(0028) 函数说明
(0029) --------------------------------------------------------------------------------------------------*/
(0030) void LCD_init(void);
(0031) void LCD_en_write(void);
(0032) void LCD_write_command(unsigned  char command) ;
(0033) void LCD_write_data(unsigned char data);
(0034) void LCD_set_xy (unsigned char x, unsigned char y);
(0035) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);

⌨️ 快捷键说明

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