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