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