📄 avr_gy-27.lst
字号:
(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 + -