📄 avr_gy-29.lst
字号:
__text_start:
__start:
76 EFCF LDI R28,0xFF
77 E2D1 LDI R29,0x21
78 BFCD OUT 0x3D,R28
79 BFDE OUT 0x3E,R29
7A 51CE SUBI R28,0x1E
7B 40D0 SBCI R29,0
7C EA0A LDI R16,0xAA
7D 8308 STD Y+0,R16
7E 2400 CLR R0
7F E0E4 LDI R30,4
80 E0F2 LDI R31,2
81 E012 LDI R17,2
82 30E4 CPI R30,4
83 07F1 CPC R31,R17
84 F011 BEQ 0x0087
85 9201 ST R0,Z+
86 CFFB RJMP 0x0082
87 8300 STD Z+0,R16
88 EEE8 LDI R30,0xE8
89 E0F0 LDI R31,0
8A E0A0 LDI R26,0
8B E0B2 LDI R27,2
8C E010 LDI R17,0
8D E000 LDI R16,0
8E BF0B OUT 0x3B,R16
8F 3EEC CPI R30,0xEC
90 07F1 CPC R31,R17
91 F021 BEQ 0x0096
92 95C8 LPM
93 9631 ADIW R30,1
94 920D ST R0,X+
95 CFF9 RJMP 0x008F
96 940E 0341 CALL _main
_exit:
98 CFFF RJMP _exit
FILE: D:\MCU_Project\MCU_AVR\AVR_GY-29\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:
99 0000 NOP
(0017) asm("nop");
9A 0000 NOP
(0018) asm("nop");
9B 0000 NOP
(0019) asm("nop");
9C 0000 NOP
(0020) asm("nop");
9D 0000 NOP
9E 9508 RET
_delay_nus:
i --> R20
n --> R10
9F 940E 037F CALL push_xgset300C
A1 0158 MOVW R10,R16
(0021) }
(0022)
(0023) void delay_nus(unsigned int n) //N us延时函数
(0024) {
(0025) unsigned int i=0;
A2 2744 CLR R20
A3 2755 CLR R21
(0026) for (i=0;i<n;i++)
A4 C003 RJMP 0x00A8
(0027) delay_1us();
A5 DFF3 RCALL _delay_1us
A6 5F4F SUBI R20,0xFF
A7 4F5F SBCI R21,0xFF
A8 154A CP R20,R10
A9 055B CPC R21,R11
AA F3D0 BCS 0x00A5
AB 940C 0384 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
AD 2700 CLR R16
AE 2711 CLR R17
AF C002 RJMP 0x00B2
B0 5F0F SUBI R16,0xFF
B1 4F1F SBCI R17,0xFF
B2 3F04 CPI R16,0xF4
B3 E0E1 LDI R30,1
B4 071E CPC R17,R30
B5 F3D0 BCS 0x00B0
B6 9508 RET
_delay_nms:
i --> R20
n --> R10
B7 940E 037F CALL push_xgset300C
B9 0158 MOVW R10,R16
(0034) }
(0035)
(0036) void delay_nms(unsigned int n) //N ms延时函数
(0037) {
(0038) unsigned int i=0;
BA 2744 CLR R20
BB 2755 CLR R21
(0039) for (i=0;i<n;i++)
BC C003 RJMP 0x00C0
(0040) delay_1ms();
BD DFEF RCALL _delay_1ms
BE 5F4F SUBI R20,0xFF
BF 4F5F SBCI R21,0xFF
C0 154A CP R20,R10
C1 055B CPC R21,R11
C2 F3D0 BCS 0x00BD
C3 940C 0384 JMP pop_xgset300C
FILE: D:\MCU_Project\MCU_AVR\AVR_GY-29\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 0xA7 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改
(0020) #define WD_DEVICE_ADDR 0xA6 //ALT ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A
(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启动
_I2C_Write:
Wdata --> R18
RegAddress --> R16
C5 EA84 LDI R24,0xA4
C6 BF86 OUT 0x36,R24
(0043) Wait();
C7 B626 IN R2,0x36
C8 FE27 SBRS R2,7
C9 CFFD RJMP 0x00C7
(0044) if(TestAck()!=START)
CA B181 IN R24,0x01
CB 7F88 ANDI R24,0xF8
CC 3088 CPI R24,0x8
CD F011 BEQ 0x00D0
(0045) return 1; //ACK
CE E001 LDI R16,1
CF C028 RJMP 0x00F8
(0046)
(0047) Write8Bit(WD_DEVICE_ADDR); //写I2C从器件地址和写方式
D0 EA86 LDI R24,0xA6
D1 B983 OUT 0x03,R24
D2 E884 LDI R24,0x84
D3 BF86 OUT 0x36,R24
(0048) Wait();
D4 B626 IN R2,0x36
D5 FE27 SBRS R2,7
D6 CFFD RJMP 0x00D4
(0049) if(TestAck()!=MT_SLA_ACK)
D7 B181 IN R24,0x01
D8 7F88 ANDI R24,0xF8
D9 3188 CPI R24,0x18
DA F011 BEQ 0x00DD
(0050) return 1; //ACK
DB E001 LDI R16,1
DC C01B RJMP 0x00F8
(0051)
(0052) Write8Bit(RegAddress); //写器件相应寄存器地址
DD B903 OUT 0x03,R16
DE E884 LDI R24,0x84
DF BF86 OUT 0x36,R24
(0053) Wait();
E0 B626 IN R2,0x36
E1 FE27 SBRS R2,7
E2 CFFD RJMP 0x00E0
(0054) if(TestAck()!=MT_DATA_ACK)
E3 B181 IN R24,0x01
E4 7F88 ANDI R24,0xF8
E5 3288 CPI R24,0x28
E6 F011 BEQ 0x00E9
(0055) return 1; //ACK
E7 E001 LDI R16,1
E8 C00F RJMP 0x00F8
(0056)
(0057) Write8Bit(Wdata); //写数据到器件相应寄存器
E9 B923 OUT 0x03,R18
EA E884 LDI R24,0x84
EB BF86 OUT 0x36,R24
(0058) Wait();
EC B626 IN R2,0x36
ED FE27 SBRS R2,7
EE CFFD RJMP 0x00EC
(0059) if(TestAck()!=MT_DATA_ACK)
EF B181 IN R24,0x01
F0 7F88 ANDI R24,0xF8
F1 3288 CPI R24,0x28
F2 F011 BEQ 0x00F5
(0060) return 1; //ACK
F3 E001 LDI R16,1
F4 C003 RJMP 0x00F8
(0061) Stop(); //I2C停止
F5 E984 LDI R24,0x94
F6 BF86 OUT 0x36,R24
(0062) //delay_nms(10); //延时
(0063) return 0;
F7 2700 CLR R16
F8 9508 RET
_I2C_Read:
temp --> R10
RegAddress --> R16
F9 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) Start();//I2C启动
FA EA84 LDI R24,0xA4
FB BF86 OUT 0x36,R24
(0077) Wait();
FC B626 IN R2,0x36
FD FE27 SBRS R2,7
FE CFFD RJMP 0x00FC
(0078) if (TestAck()!=START)
FF B181 IN R24,0x01
100 7F88 ANDI R24,0xF8
101 3088 CPI R24,0x8
102 F011 BEQ 0x0105
(0079) return 1; //ACK
103 E001 LDI R16,1
104 C040 RJMP 0x0145
(0080)
(0081) Write8Bit(WD_DEVICE_ADDR); //写I2C从器件地址和写方式
105 EA86 LDI R24,0xA6
106 B983 OUT 0x03,R24
107 E884 LDI R24,0x84
108 BF86 OUT 0x36,R24
(0082) Wait();
109 B626 IN R2,0x36
10A FE27 SBRS R2,7
10B CFFD RJMP 0x0109
(0083) if (TestAck()!=MT_SLA_ACK)
10C B181 IN R24,0x01
10D 7F88 ANDI R24,0xF8
10E 3188 CPI R24,0x18
10F F011 BEQ 0x0112
(0084) return 1; //ACK
110 E001 LDI R16,1
111 C033 RJMP 0x0145
(0085)
(0086) Write8Bit(RegAddress); //写器件相应寄存器地址
112 B903 OUT 0x03,R16
113 E884 LDI R24,0x84
114 BF86 OUT 0x36,R24
(0087) Wait();
115 B626 IN R2,0x36
116 FE27 SBRS R2,7
117 CFFD RJMP 0x0115
(0088) if (TestAck()!=MT_DATA_ACK)
118 B181 IN R24,0x01
119 7F88 ANDI R24,0xF8
11A 3288 CPI R24,0x28
11B F011 BEQ 0x011E
(0089) return 1;
11C E001 LDI R16,1
11D C027 RJMP 0x0145
(0090)
(0091) Start(); //I2C重新启动
11E EA84 LDI R24,0xA4
11F BF86 OUT 0x36,R24
(0092) Wait();
120 B626 IN R2,0x36
121 FE27 SBRS R2,7
122 CFFD RJMP 0x0120
(0093) if (TestAck()!=RE_START)
123 B181 IN R24,0x01
124 7F88 ANDI R24,0xF8
125 3180 CPI R24,0x10
126 F011 BEQ 0x0129
(0094) return 1;
127 E001 LDI R16,1
128 C01C RJMP 0x0145
(0095)
(0096) Write8Bit(RD_DEVICE_ADDR); //写I2C从器件地址和读方式
129 EA87 LDI R24,0xA7
12A B983 OUT 0x03,R24
12B E884 LDI R24,0x84
12C BF86 OUT 0x36,R24
(0097) Wait();
12D B626 IN R2,0x36
12E FE27 SBRS R2,7
12F CFFD RJMP 0x012D
(0098) if(TestAck()!=MR_SLA_ACK)
130 B181 IN R24,0x01
131 7F88 ANDI R24,0xF8
132 3480 CPI R24,0x40
133 F011 BEQ 0x0136
(0099) return 1; //ACK
134 E001 LDI R16,1
135 C00F RJMP 0x0145
(0100)
(0101) Twi(); //启动主I2C读方式
136 E884 LDI R24,0x84
137 BF86 OUT 0x36,R24
(0102) Wait();
138 B626 IN R2,0x36
139 FE27 SBRS R2,7
13A CFFD RJMP 0x0138
(0103) if(TestAck()!=MR_DATA_NOACK)
13B B181 IN R24,0x01
13C 7F88 ANDI R24,0xF8
13D 3588 CPI R24,0x58
13E F011 BEQ 0x0141
(0104) return 1; //ACK
13F E001 LDI R16,1
140 C004 RJMP 0x0145
(0105)
(0106) temp=TWDR;//读取I2C接收数据
141 B0A3 IN R10,0x03
(0107) Stop();//I2C停止
142 E984 LDI R24,0x94
143 BF86 OUT 0x36,R24
(0108) return temp;
144 2D0A MOV R16,R10
145 90A9 LD R10,Y+
146 9508 RET
FILE: D:\MCU_Project\MCU_AVR\AVR_GY-29\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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -