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

📄 avr_gy-29.lst

📁 GY-27资料源码 ADXL345 HMC5883L
💻 LST
📖 第 1 页 / 共 4 页
字号:
(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);
(0036) void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data);
(0037) 
(0038) //-----------------------------------------------------------------------------------------
(0039) 
(0040) #include <macros.h>
(0041) #include "delay.h"
(0042) 
(0043) void LCD_init(void)         //液晶初始化
(0044) {
(0045)   LCD_DATA_DDR|=LCD_DATA;   //数据口方向为输出
_LCD_init:
     147 B38A      IN	R24,0x1A
     148 6F80      ORI	R24,0xF0
     149 BB8A      OUT	0x1A,R24
(0046)   LCD_EN_DDR|=LCD_EN;       //设置EN方向为输出
     14A 9AA7      SBI	0x14,7
(0047)   LCD_RS_DDR|=LCD_RS;       //设置RS方向为输出
     14B 9AA6      SBI	0x14,6
(0048)   LCD_write_command(0x28); 
     14C E208      LDI	R16,0x28
     14D D014      RCALL	_LCD_write_command
(0049)   LCD_en_write();
     14E D00D      RCALL	_LCD_en_write
(0050)   delay_nus(40);
     14F E208      LDI	R16,0x28
     150 E010      LDI	R17,0
     151 DF4D      RCALL	_delay_nus
(0051)   LCD_write_command(0x28);  //4位显示
     152 E208      LDI	R16,0x28
     153 D00E      RCALL	_LCD_write_command
(0052)   LCD_write_command(0x0c);  //显示开
     154 E00C      LDI	R16,0xC
     155 D00C      RCALL	_LCD_write_command
(0053)   LCD_write_command(0x01);  //清屏
     156 E001      LDI	R16,1
     157 D00A      RCALL	_LCD_write_command
(0054)   delay_nms(10);
     158 E00A      LDI	R16,0xA
     159 E010      LDI	R17,0
     15A DF5C      RCALL	_delay_nms
     15B 9508      RET
(0055) }
(0056) 
(0057) void LCD_en_write(void)  //液晶使能
(0058) {
(0059)   LCD_EN_PORT|=LCD_EN;
_LCD_en_write:
     15C 9AAF      SBI	0x15,7
(0060)   delay_nus(1);
     15D E001      LDI	R16,1
     15E E010      LDI	R17,0
     15F DF3F      RCALL	_delay_nus
(0061)   LCD_EN_PORT&=~LCD_EN;
     160 98AF      CBI	0x15,7
     161 9508      RET
_LCD_write_command:
  command              --> R20
     162 934A      ST	R20,-Y
     163 2F40      MOV	R20,R16
(0062) }
(0063) 
(0064) void LCD_write_command(unsigned char command) //写指令
(0065) {
(0066)   //连线为高4位的写法
(0067)   delay_nus(16);
     164 E100      LDI	R16,0x10
     165 E010      LDI	R17,0
     166 DF38      RCALL	_delay_nus
(0068)   LCD_RS_PORT&=~LCD_RS;        //RS=0
     167 98AE      CBI	0x15,6
(0069)   LCD_DATA_PORT&=0X0f;         //清高四位
     168 B38B      IN	R24,0x1B
     169 708F      ANDI	R24,0xF
     16A BB8B      OUT	0x1B,R24
(0070)   LCD_DATA_PORT|=command&0xf0; //写高四位
     16B 2F84      MOV	R24,R20
     16C 7F80      ANDI	R24,0xF0
     16D B22B      IN	R2,0x1B
     16E 2A28      OR	R2,R24
     16F BA2B      OUT	0x1B,R2
(0071)   LCD_en_write();
     170 DFEB      RCALL	_LCD_en_write
(0072)   command=command<<4;          //低四位移到高四位
     171 2F84      MOV	R24,R20
     172 708F      ANDI	R24,0xF
     173 9582      SWAP	R24
     174 2F48      MOV	R20,R24
(0073)   LCD_DATA_PORT&=0x0f;         //清高四位
     175 B38B      IN	R24,0x1B
     176 708F      ANDI	R24,0xF
     177 BB8B      OUT	0x1B,R24
(0074)   LCD_DATA_PORT|=command&0xf0; //写低四位
     178 2F84      MOV	R24,R20
     179 7F80      ANDI	R24,0xF0
     17A B22B      IN	R2,0x1B
     17B 2A28      OR	R2,R24
     17C BA2B      OUT	0x1B,R2
(0075)   LCD_en_write();
     17D DFDE      RCALL	_LCD_en_write
     17E 9149      LD	R20,Y+
     17F 9508      RET
_LCD_write_data:
  data                 --> R20
     180 934A      ST	R20,-Y
     181 2F40      MOV	R20,R16
(0076)  
(0077) /*
(0078)   //连线为低四位的写法
(0079)   delay_nus(16);
(0080)   LCD_RS_PORT&=~LCD_RS;        //RS=0
(0081)   LCD_DATA_PORT&=0xf0;         //清高四位
(0082)   LCD_DATA_PORT|=(command>>4)&0x0f; //写高四位
(0083)   LCD_en_write();
(0084)   LCD_DATA_PORT&=0xf0;         //清高四位
(0085)   LCD_DATA_PORT|=command&0x0f; //写低四位
(0086)   LCD_en_write(); 
(0087) */
(0088)   
(0089) }
(0090) 
(0091) void LCD_write_data(unsigned char data) //写数据
(0092) {
(0093)   //连线为高4位的写法
(0094)   delay_nus(16);
     182 E100      LDI	R16,0x10
     183 E010      LDI	R17,0
     184 DF1A      RCALL	_delay_nus
(0095)   LCD_RS_PORT|=LCD_RS;       //RS=1
     185 9AAE      SBI	0x15,6
(0096)   LCD_DATA_PORT&=0X0f;       //清高四位
     186 B38B      IN	R24,0x1B
     187 708F      ANDI	R24,0xF
     188 BB8B      OUT	0x1B,R24
(0097)   LCD_DATA_PORT|=data&0xf0;  //写高四位
     189 2F84      MOV	R24,R20
     18A 7F80      ANDI	R24,0xF0
     18B B22B      IN	R2,0x1B
     18C 2A28      OR	R2,R24
     18D BA2B      OUT	0x1B,R2
(0098)   LCD_en_write();
     18E DFCD      RCALL	_LCD_en_write
(0099)   data=data<<4;               //低四位移到高四位
     18F 2F84      MOV	R24,R20
     190 708F      ANDI	R24,0xF
     191 9582      SWAP	R24
     192 2F48      MOV	R20,R24
(0100)   LCD_DATA_PORT&=0X0f;        //清高四位
     193 B38B      IN	R24,0x1B
     194 708F      ANDI	R24,0xF
     195 BB8B      OUT	0x1B,R24
(0101)   LCD_DATA_PORT|=data&0xf0;   //写低四位
     196 2F84      MOV	R24,R20
     197 7F80      ANDI	R24,0xF0
     198 B22B      IN	R2,0x1B
     199 2A28      OR	R2,R24
     19A BA2B      OUT	0x1B,R2
(0102)   LCD_en_write();
     19B DFC0      RCALL	_LCD_en_write
     19C 9149      LD	R20,Y+
     19D 9508      RET
_LCD_set_xy:
  address              --> R20
  y                    --> R10
  x                    --> R22
     19E 940E 0389 CALL	push_xgsetF00C
     1A0 2EA2      MOV	R10,R18
     1A1 2F60      MOV	R22,R16
(0103)   
(0104) /*
(0105)   //连线为低四位的写法 
(0106)   delay_nus(16);
(0107)   LCD_RS_PORT|=LCD_RS;       //RS=1
(0108)   LCD_DATA_PORT&=0Xf0;       //清高四位
(0109)   LCD_DATA_PORT|=(data>>4)&0x0f;  //写高四位
(0110)   LCD_en_write();
(0111)  
(0112)   LCD_DATA_PORT&=0Xf0;        //清高四位
(0113)   LCD_DATA_PORT|=data&0x0f;   //写低四位
(0114)   LCD_en_write();
(0115) */
(0116)   
(0117) }
(0118) 
(0119) 
(0120) void LCD_set_xy( unsigned char x, unsigned char y )  //写地址函数
(0121) {
(0122)     unsigned char address;
(0123)     if (y == 0) address = 0x80 + x;
     1A2 20AA      TST	R10
     1A3 F419      BNE	0x01A7
     1A4 2F46      MOV	R20,R22
     1A5 5840      SUBI	R20,0x80
     1A6 C002      RJMP	0x01A9
(0124)     else   address = 0xc0 + x;
     1A7 2F46      MOV	R20,R22
     1A8 5440      SUBI	R20,0x40
(0125)     LCD_write_command( address);
     1A9 2F04      MOV	R16,R20
     1AA DFB7      RCALL	_LCD_write_command
     1AB 940C 0390 JMP	pop_xgsetF00C
_LCD_write_string:
  s                    --> R20
  Y                    --> R12
  X                    --> R10
     1AD 940E 0397 CALL	push_xgset303C
     1AF 2EC2      MOV	R12,R18
     1B0 2EA0      MOV	R10,R16
     1B1 814E      LDD	R20,Y+6
     1B2 815F      LDD	R21,Y+7
(0126) }
(0127)   
(0128) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) //列x=0~15,行y=0,1
(0129) {
(0130)     LCD_set_xy( X, Y ); //写地址    
     1B3 2D2C      MOV	R18,R12
     1B4 2D0A      MOV	R16,R10
     1B5 DFE8      RCALL	_LCD_set_xy
     1B6 C005      RJMP	0x01BC
(0131)     while (*s)  // 写显示字符
(0132)     {
(0133)       LCD_write_data( *s );
     1B7 01FA      MOVW	R30,R20
     1B8 8100      LDD	R16,Z+0
     1B9 DFC6      RCALL	_LCD_write_data
(0134)       s ++;
     1BA 5F4F      SUBI	R20,0xFF
     1BB 4F5F      SBCI	R21,0xFF
     1BC 01FA      MOVW	R30,R20
     1BD 8020      LDD	R2,Z+0
     1BE 2022      TST	R2
     1BF F7B9      BNE	0x01B7
     1C0 940C 039E JMP	pop_xgset303C
_LCD_write_char:
  data                 --> Y,+2
  Y                    --> R12
  X                    --> R10
     1C2 92AA      ST	R10,-Y
     1C3 92CA      ST	R12,-Y
     1C4 2EC2      MOV	R12,R18
     1C5 2EA0      MOV	R10,R16
(0135)     }
(0136)       
(0137) }
(0138) 
(0139) void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data) //列x=0~15,行y=0,1
(0140) {
(0141)   LCD_set_xy( X, Y ); //写地址
     1C6 2D2C      MOV	R18,R12
     1C7 2D0A      MOV	R16,R10
     1C8 DFD5      RCALL	_LCD_set_xy
(0142)   LCD_write_data( data);
     1C9 810A      LDD	R16,Y+2
     1CA DFB5      RCALL	_LCD_write_data
     1CB 90C9      LD	R12,Y+
     1CC 90A9      LD	R10,Y+
     1CD 9508      RET
_conversion:
  i                    --> R10
     1CE 92AA      ST	R10,-Y
     1CF 92BA      ST	R11,-Y
     1D0 0158      MOVW	R10,R16
FILE: D:\MCU_Project\MCU_AVR\AVR_GY-29\AVR_GY-29.c
(0001) /*****************************************
(0002) * 基于AVR单片机GY-29模块通信程序 		 *
(0003) * 功    能:IIC通信读取数据并显示        *
(0004) * 时钟频率:内部1M 						 *
(0005) * 设    计:广运电子					 *
(0006) * 修改日期:2011年4月20日				 *
(0007) * 编译环境:ICC-AVR7.14					 *
(0008) * 实验环境:ATmega16+1602    			 *
(0009) * 使用端口:PC0,PC1,PC6,PC7,PA4~PA7 	 *
(0010) * 参    考:莫锦攀实验程序24c02读取实验  *
(0011) *****************************************/
(0012) #include <iom16v.h>
(0013) #include "I2C.h"
(0014) #include "1602.h"
(0015) #include "delay.h"
(0016) void conversion(unsigned int i);
(0017) void ADXL345_init(void); 
(0018) unsigned char display[4]={0,0,0,'g'};//显示数据
(0019) 
(0020) /*********************************************
(0021) 数据转换,十六进制数据转换成10进制
(0022) 输入十六进制范围:0x0000-0x270f(0-9999)
(0023) 结果分成个十百千位,以ascii存入显示区
(0024) **********************************************/
(0025) void conversion(unsigned int i)  
(0026) {  
(0027)   // 	display[0]=i/10000+0x30 ;
(0028)   //  i=i%10000;    //取余运算
(0029) 	display[0]=i/1000+0x30 ;
     1D1 EE28      LDI	R18,0xE8
     1D2 E033      LDI	R19,3
     1D3 0185      MOVW	R16,R10
     1D4 940E 0351 CALL	div16u
     1D6 01C8      MOVW	R24,R16
     1D7 96C0      ADIW	R24,0x30
     1D8 9380 0200 STS	display,R24
(0030)     i=i%1000;    //取余运算
     1DA EE28      LDI	R18,0xE8
     1DB E033      LDI	R19,3
     1DC 0185      MOVW	R16,R10
     1DD 940E 034F CALL	mod16u
     1DF 0158      MOVW	R10,R16
(0031)     display[1]=i/100+0x30 ;
     1E0 E624      LDI	R18,0x64
     1E1 E030      LDI	R19,0
     1E2 940E 0351 CALL	div16u
     1E4 01C8      MOVW	R24,R16
     1E5 96C0      ADIW	R24,0x30
     1E6 9380 0201 STS	display+1,R24
(0032)     i=i%100;    //取余运算
     1E8 E624      LDI	R18,0x64
     1E9 E030      LDI	R19,0
     1EA 0185      MOVW	R16,R10
     1EB 940E 034F CALL	mod16u
     1ED 0158      MOVW	R10,R16
(0033)     display[2]=i/10+0x30 ;
     1EE E02A      LDI	R18,0xA
     1EF E030      LDI	R19,0
     1F0 940E 0351 CALL	div16u
     1F2 01C8      MOVW	R24,R16
     1F3 96C0      ADIW	R24,0x30
     1F4 9380 0202 STS	display+2,R24
     1F6 90B9      LD	R11,Y+
     1F7 90A9      LD	R10,Y+
     1F8 9508      RET
_display_x:
  temp                 --> Y,+1
  x                    --> R20
     1F9 934A      ST	R20,-Y
     1FA 935A      ST	R21,-Y
     1FB 9725      SBIW	R28,5
(0034)  //  i=i%10;     //取余运算
(0035)  //   display[3]=i+0x30;  
(0036) }
(0037) //*******************************
(0038) //显示x
(0039) void display_x(void)
(0040) {   float temp;
(0041)     int x;
(0042) 
(0043)      x=I2C_Read(0x33);
     1FC E303      LDI	R16,0x33
     1FD E010      LDI	R17,0
     1FE DEFA      RCALL	_I2C_Read
     1FF 2F40      MOV	R20,R16
     200 2755      CLR	R21
(0044) 	 x=(x<<8)+I2C_Read(0x32);
     201 E302      LDI	R16,0x32
     202 E010      LDI	R17,0
     203 DEF5      RCALL	_I2C_Read
     204 2F54      MOV	R21,R20
     205 2F40      MOV	R20,R16
(0045) 	 
(0046) 	if(x<0){
     206 3040      CPI	R20,0
     207 E0E0      LDI	R30,0
     208 075E      CPC	R21,R30
     209 F454      BGE	0x0214
(0047) 	 x=-x;
     20A 9540      COM	R20
     20B 9550      COM	R21
     20C 5F4F      SUBI	R20,0xFF
     20D 4F5F      SBCI	R21,0xFF
(0048)      LCD_write_char(2,0,'-');       //显示负符号位
     20E E28D      LDI	R24,0x2D
     20F 8388      STD	Y+0,R24
     210 2722      CLR	R18
     211 E002      LDI	R16,2
     212 DFAF      RCALL	_LCD_write_char
(0049) 	}
     213 C005      RJMP	0x0219
(0050) 	else 
(0051) 	LCD_write_char(2,0,' ');        //显示空格
     214 E280      LDI	R24,0x20
     215 8388      STD	Y+0,R24
     216 2722      CLR	R18
     217 E002      LDI	R16,2
     218 DFA9      RCALL	_LCD_write_char
(0052)     temp=(float)x*3.9;  //计算数据和显示,查考ADXL345快速入门第4页
     219 EE04      LDI	R16,0xE4
     21A E010      LDI	R17,0
     21B 940E 036B CALL	elpm32
     21D 0118      MOVW	R2,R16
     21E 0129      MOVW	R4,R18
     21F 018A      MOVW	R16,R20
     220 940E 03DC CALL	int2fp
     222 933A      ST	R19,-Y
     223 932A      ST	R18,-Y

⌨️ 快捷键说明

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