?? 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 + -