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

📄 avr_gy-27.lst

📁 GY-27资料源码 ADXL345 HMC5883L
💻 LST
📖 第 1 页 / 共 5 页
字号:
(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:
     189 B38A      IN	R24,0x1A
     18A 6F80      ORI	R24,0xF0
     18B BB8A      OUT	0x1A,R24
(0046)   LCD_EN_DDR|=LCD_EN;       //设置EN方向为输出
     18C 9AA7      SBI	0x14,7
(0047)   LCD_RS_DDR|=LCD_RS;       //设置RS方向为输出
     18D 9AA6      SBI	0x14,6
(0048)   LCD_write_command(0x28); 
     18E E208      LDI	R16,0x28
     18F D014      RCALL	_LCD_write_command
(0049)   LCD_en_write();
     190 D00D      RCALL	_LCD_en_write
(0050)   delay_nus(40);
     191 E208      LDI	R16,0x28
     192 E010      LDI	R17,0
     193 DF44      RCALL	_delay_nus
(0051)   LCD_write_command(0x28);  //4位显示
     194 E208      LDI	R16,0x28
     195 D00E      RCALL	_LCD_write_command
(0052)   LCD_write_command(0x0c);  //显示开
     196 E00C      LDI	R16,0xC
     197 D00C      RCALL	_LCD_write_command
(0053)   LCD_write_command(0x01);  //清屏
     198 E001      LDI	R16,1
     199 D00A      RCALL	_LCD_write_command
(0054)   delay_nms(10);
     19A E00A      LDI	R16,0xA
     19B E010      LDI	R17,0
     19C DF53      RCALL	_delay_nms
     19D 9508      RET
(0055) }
(0056) 
(0057) void LCD_en_write(void)  //液晶使能
(0058) {
(0059)   LCD_EN_PORT|=LCD_EN;
_LCD_en_write:
     19E 9AAF      SBI	0x15,7
(0060)   delay_nus(1);
     19F E001      LDI	R16,1
     1A0 E010      LDI	R17,0
     1A1 DF36      RCALL	_delay_nus
(0061)   LCD_EN_PORT&=~LCD_EN;
     1A2 98AF      CBI	0x15,7
     1A3 9508      RET
_LCD_write_command:
  command              --> R20
     1A4 934A      ST	R20,-Y
     1A5 2F40      MOV	R20,R16
(0062) }
(0063) 
(0064) void LCD_write_command(unsigned char command) //写指令
(0065) {
(0066)   //连线为高4位的写法
(0067)   delay_nus(16);
     1A6 E100      LDI	R16,0x10
     1A7 E010      LDI	R17,0
     1A8 DF2F      RCALL	_delay_nus
(0068)   LCD_RS_PORT&=~LCD_RS;        //RS=0
     1A9 98AE      CBI	0x15,6
(0069)   LCD_DATA_PORT&=0X0f;         //清高四位
     1AA B38B      IN	R24,0x1B
     1AB 708F      ANDI	R24,0xF
     1AC BB8B      OUT	0x1B,R24
(0070)   LCD_DATA_PORT|=command&0xf0; //写高四位
     1AD 2F84      MOV	R24,R20
     1AE 7F80      ANDI	R24,0xF0
     1AF B22B      IN	R2,0x1B
     1B0 2A28      OR	R2,R24
     1B1 BA2B      OUT	0x1B,R2
(0071)   LCD_en_write();
     1B2 DFEB      RCALL	_LCD_en_write
(0072)   command=command<<4;          //低四位移到高四位
     1B3 2F84      MOV	R24,R20
     1B4 708F      ANDI	R24,0xF
     1B5 9582      SWAP	R24
     1B6 2F48      MOV	R20,R24
(0073)   LCD_DATA_PORT&=0x0f;         //清高四位
     1B7 B38B      IN	R24,0x1B
     1B8 708F      ANDI	R24,0xF
     1B9 BB8B      OUT	0x1B,R24
(0074)   LCD_DATA_PORT|=command&0xf0; //写低四位
     1BA 2F84      MOV	R24,R20
     1BB 7F80      ANDI	R24,0xF0
     1BC B22B      IN	R2,0x1B
     1BD 2A28      OR	R2,R24
     1BE BA2B      OUT	0x1B,R2
(0075)   LCD_en_write();
     1BF DFDE      RCALL	_LCD_en_write
     1C0 9149      LD	R20,Y+
     1C1 9508      RET
_LCD_write_data:
  data                 --> R20
     1C2 934A      ST	R20,-Y
     1C3 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);
     1C4 E100      LDI	R16,0x10
     1C5 E010      LDI	R17,0
     1C6 DF11      RCALL	_delay_nus
(0095)   LCD_RS_PORT|=LCD_RS;       //RS=1
     1C7 9AAE      SBI	0x15,6
(0096)   LCD_DATA_PORT&=0X0f;       //清高四位
     1C8 B38B      IN	R24,0x1B
     1C9 708F      ANDI	R24,0xF
     1CA BB8B      OUT	0x1B,R24
(0097)   LCD_DATA_PORT|=data&0xf0;  //写高四位
     1CB 2F84      MOV	R24,R20
     1CC 7F80      ANDI	R24,0xF0
     1CD B22B      IN	R2,0x1B
     1CE 2A28      OR	R2,R24
     1CF BA2B      OUT	0x1B,R2
(0098)   LCD_en_write();
     1D0 DFCD      RCALL	_LCD_en_write
(0099)   data=data<<4;               //低四位移到高四位
     1D1 2F84      MOV	R24,R20
     1D2 708F      ANDI	R24,0xF
     1D3 9582      SWAP	R24
     1D4 2F48      MOV	R20,R24
(0100)   LCD_DATA_PORT&=0X0f;        //清高四位
     1D5 B38B      IN	R24,0x1B
     1D6 708F      ANDI	R24,0xF
     1D7 BB8B      OUT	0x1B,R24
(0101)   LCD_DATA_PORT|=data&0xf0;   //写低四位
     1D8 2F84      MOV	R24,R20
     1D9 7F80      ANDI	R24,0xF0
     1DA B22B      IN	R2,0x1B
     1DB 2A28      OR	R2,R24
     1DC BA2B      OUT	0x1B,R2
(0102)   LCD_en_write();
     1DD DFC0      RCALL	_LCD_en_write
     1DE 9149      LD	R20,Y+
     1DF 9508      RET
_LCD_set_xy:
  address              --> R20
  y                    --> R10
  x                    --> R22
     1E0 940E 0359 CALL	push_xgsetF00C
     1E2 2EA2      MOV	R10,R18
     1E3 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;
     1E4 20AA      TST	R10
     1E5 F419      BNE	0x01E9
     1E6 2F46      MOV	R20,R22
     1E7 5840      SUBI	R20,0x80
     1E8 C002      RJMP	0x01EB
(0124)     else   address = 0xc0 + x;
     1E9 2F46      MOV	R20,R22
     1EA 5440      SUBI	R20,0x40
(0125)     LCD_write_command( address);
     1EB 2F04      MOV	R16,R20
     1EC DFB7      RCALL	_LCD_write_command
     1ED 940C 0360 JMP	pop_xgsetF00C
_LCD_write_string:
  s                    --> R20
  Y                    --> R12
  X                    --> R10
     1EF 940E 0367 CALL	push_xgset303C
     1F1 2EC2      MOV	R12,R18
     1F2 2EA0      MOV	R10,R16
     1F3 814E      LDD	R20,Y+6
     1F4 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 ); //写地址    
     1F5 2D2C      MOV	R18,R12
     1F6 2D0A      MOV	R16,R10
     1F7 DFE8      RCALL	_LCD_set_xy
     1F8 C005      RJMP	0x01FE
(0131)     while (*s)  // 写显示字符
(0132)     {
(0133)       LCD_write_data( *s );
     1F9 01FA      MOVW	R30,R20
     1FA 8100      LDD	R16,Z+0
     1FB DFC6      RCALL	_LCD_write_data
(0134)       s ++;
     1FC 5F4F      SUBI	R20,0xFF
     1FD 4F5F      SBCI	R21,0xFF
     1FE 01FA      MOVW	R30,R20
     1FF 8020      LDD	R2,Z+0
     200 2022      TST	R2
     201 F7B9      BNE	0x01F9
     202 940C 036E JMP	pop_xgset303C
_LCD_write_char:
  data                 --> Y,+2
  Y                    --> R12
  X                    --> R10
     204 92AA      ST	R10,-Y
     205 92CA      ST	R12,-Y
     206 2EC2      MOV	R12,R18
     207 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 ); //写地址
     208 2D2C      MOV	R18,R12
     209 2D0A      MOV	R16,R10
     20A DFD5      RCALL	_LCD_set_xy
(0142)   LCD_write_data( data);
     20B 810A      LDD	R16,Y+2
     20C DFB5      RCALL	_LCD_write_data
     20D 90C9      LD	R12,Y+
     20E 90A9      LD	R10,Y+
     20F 9508      RET
_conversion:
  i                    --> R20
     210 934A      ST	R20,-Y
     211 935A      ST	R21,-Y
     212 01A8      MOVW	R20,R16
FILE: D:\MCU_Project\MCU_AVR\AVR_GY-27\AVR_GY-27.c
(0001) /*****************************************
(0002) * 基于AVR单片机GY-27模块通信程序 		 *
(0003) * HMC5883L+ADXL345 通信程序              *
(0004) * 功    能:IIC通信读取数据并显示        *
(0005) * 时钟频率:内部1M 						 *
(0006) * 设    计:广运电子					 *
(0007) * 修改日期:2011年4月20日				 *
(0008) * 编译环境:ICC-AVR7.14					 *
(0009) * 实验环境:ATmega16+1602    			 *
(0010) * 使用端口:PC0,PC1,PC6,PC7,PA4~PA7 	 *
(0011) * 参    考:莫锦攀实验程序24c02读取实验  *
(0012) *****************************************/
(0013) #include <iom16v.h>
(0014) #include "I2C.h"
(0015) #include "1602.h"
(0016) #include "delay.h"
(0017) #include  "math.h"  
(0018) #include  "stdio.h"  
(0019) void conversion(unsigned int i);
(0020) unsigned char display[5]={0,0,0,0,0};//显示数据
(0021) 
(0022) /*********************************************
(0023) 数据转换,十六进制数据转换成10进制
(0024) 输入十六进制范围:0x0000-0x270f(0-9999)
(0025) 结果分成个十百千位,以ascii存入显示区
(0026) **********************************************/
(0027) void conversion(unsigned int i)  
(0028) {  
(0029)  	display[0]=i/10000+0x30 ;
     213 E120      LDI	R18,0x10
     214 E237      LDI	R19,0x27
     215 018A      MOVW	R16,R20
     216 940E 0305 CALL	div16u
     218 01C8      MOVW	R24,R16
     219 96C0      ADIW	R24,0x30
     21A 9380 0200 STS	display,R24
(0030)     i=i%10000;    //取余运算
     21C E120      LDI	R18,0x10
     21D E237      LDI	R19,0x27
     21E 018A      MOVW	R16,R20
     21F 940E 0303 CALL	mod16u
     221 01A8      MOVW	R20,R16
(0031) 	display[1]=i/1000+0x30 ;
     222 EE28      LDI	R18,0xE8
     223 E033      LDI	R19,3
     224 940E 0305 CALL	div16u
     226 01C8      MOVW	R24,R16
     227 96C0      ADIW	R24,0x30
     228 9380 0201 STS	display+1,R24
(0032)     i=i%1000;    //取余运算
     22A EE28      LDI	R18,0xE8
     22B E033      LDI	R19,3
     22C 018A      MOVW	R16,R20
     22D 940E 0303 CALL	mod16u
     22F 01A8      MOVW	R20,R16
(0033)     display[2]=i/100+0x30 ;
     230 E624      LDI	R18,0x64
     231 E030      LDI	R19,0
     232 940E 0305 CALL	div16u
     234 01C8      MOVW	R24,R16
     235 96C0      ADIW	R24,0x30
     236 9380 0202 STS	display+2,R24
(0034)     i=i%100;    //取余运算
     238 E624      LDI	R18,0x64
     239 E030      LDI	R19,0
     23A 018A      MOVW	R16,R20
     23B 940E 0303 CALL	mod16u
     23D 01A8      MOVW	R20,R16
(0035)     display[3]=i/10+0x30 ;
     23E E02A      LDI	R18,0xA
     23F E030      LDI	R19,0
     240 940E 0305 CALL	div16u
     242 01C8      MOVW	R24,R16
     243 96C0      ADIW	R24,0x30
     244 9380 0203 STS	display+3,R24
(0036)    i=i%10;     //取余运算
     246 E02A      LDI	R18,0xA
     247 E030      LDI	R19,0
     248 018A      MOVW	R16,R20
     249 940E 0303 CALL	mod16u
     24B 01A8      MOVW	R20,R16
(0037)     display[4]=i+0x30;  
     24C 01CA      MOVW	R24,R20
     24D 96C0      ADIW	R24,0x30
     24E 9380 0204 STS	0x0204,R24
     250 9159      LD	R21,Y+
     251 9149      LD	R20,Y+
     252 9508      RET
_display_angle:
  temp                 --> Y,+8
  angle                --> Y,+4
  y                    --> R10
  x                    --> R12
     253 940E 033E CALL	push_xgset00FC
     255 972C      SBIW	R28,0xC
(0038) }
(0039) //*******************************
(0040) //显示角度
(0041) void display_angle(void)
(0042) {   float temp;
(0043)       int x,y;
(0044) 	 double angle;
(0045) 
(0046)      x=I2C_Read(0x03);
     256 E003      LDI	R16,3
     257 E010      LDI	R17,0
     258 DEE2      RCALL	_I2C_Read
     259 2EC0      MOV	R12,R16
     25A 24DD      CLR	R13
(0047)      x=(x<<8)+I2C_Read(0x04);
     25B E004      LDI	R16,4
     25C E010      LDI	R17,0
     25D DEDD      RCALL	_I2C_Read
     25E 2CDC      MOV	R13,R12
     25F 2EC0      MOV	R12,R16
(0048) 	 
(0049) 	 y=I2C_Read(0x07);
     260 E007      LDI	R16,7
     261 E010      LDI	R17,0
     262 DED8      RCALL	_I2C_Read
     263 2EA0      MOV	R10,R16
     264 24BB      CLR	R11
(0050)      y=(y<<8)+I2C_Read(0x08);
     265 E008      LDI	R16,0x8
     266 E010      LDI	R17,0
     267 DED3      RCALL	_I2C_Read
     268 2EE0      MOV	R14,R16
     269 2CBA      MOV	R11,R10
     26A 2CAE      MOV	R10,R14
(0051) 	
(0052) 	 
(0053)      angle= atan2((double)y,(double)x) * (180 / 3.14159265) + 180; // angle in degrees
     26B 0186      MOVW	R16,R12
     26C 940E 045B CALL	int2fp
     26E 8308      STD	Y+0,R16
     26F 8319      STD	Y+1,R17
     270 832A      STD	Y+2,R18
     271 833B      STD	Y+3,R19
     272 0185      MOVW	R16,R10
     273 940E 045B CALL	int2fp
     275 940E 07C3 CALL	_atan2f
     277 0118      MOVW	R2,R16
     278 0129      MOVW	R4,R18
     279 EE0C      LDI	R16,0xEC
     27A E010      LDI	R17,0
     27B 940E 031F CALL	elpm32
     27D 925A      ST	R5,-Y
     27E 924A      ST	R4,-Y
     27F 923A      ST	R3,-Y
     280 922A      ST	R2,-Y
     281 940E 060B CALL	fpmule2
     283 0118      MOVW	R2,R16
     284 0129      MOVW	R4,R18
     285 EE08      LDI	R16,0xE8
     286 E010      LDI	R17,0

⌨️ 快捷键说明

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