?? main.lst
字號:
__start:
__text_start:
0116 E5CF LDI R28,0x5F
0117 E0D4 LDI R29,4
0118 BFCD OUT 0x3D,R28
0119 BFDE OUT 0x3E,R29
011A 51C0 SUBI R28,0x10
011B 40D0 SBCI R29,0
011C EA0A LDI R16,0xAA
011D 8308 STD Y+0,R16
011E 2400 CLR R0
011F E3E0 LDI R30,0x30
0120 E0F2 LDI R31,2
0121 E012 LDI R17,2
0122 33E3 CPI R30,0x33
0123 07F1 CPC R31,R17
0124 F011 BEQ 0x0127
0125 9201 ST R0,Z+
0126 CFFB RJMP 0x0122
0127 8300 STD Z+0,R16
0128 E5EC LDI R30,0x5C
0129 E0F0 LDI R31,0
012A E6A0 LDI R26,0x60
012B E0B0 LDI R27,0
012C E012 LDI R17,2
012D 32EC CPI R30,0x2C
012E 07F1 CPC R31,R17
012F F021 BEQ 0x0134
0130 95C8 LPM
0131 9631 ADIW R30,1
0132 920D ST R0,X+
0133 CFF9 RJMP 0x012D
0134 940E02CC CALL _main
_exit:
0136 CFFF RJMP _exit
FILE: C:\DOCUME~1\Administrator\桌面\Menu\delay.h
(0001) /*-----------------------------------------------------------------------
(0002) 延時函數
(0003) 編譯器:ICC-AVR v6.31A 日期: 2005-11-24 20:29:57
(0004) 目標芯片 : M16
(0005) 時鐘: 8.0000Mhz
(0006) 作者:archeng504
(0007) -----------------------------------------------------------------------*/
(0008)
(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) #ifndef __delay_h
(0014) #define __delay_h
(0015)
(0016) void delay_1us(void) //1us延時函數
(0017) {
(0018) asm("nop");
_delay_1us:
0137 0000 NOP
0138 9508 RET
_delay_nus:
i --> R20
n --> R22
0139 940E045B CALL push_gset2
013B 01B8 MOVW R22,R16
(0019) }
(0020)
(0021) void delay_nus(unsigned int n) //N us延時函數
(0022) {
(0023) unsigned int i=0;
013C 2744 CLR R20
013D 2755 CLR R21
(0024) for (i=0;i<n;i++)
013E C003 RJMP 0x0142
(0025) delay_1us();
013F DFF7 RCALL _delay_1us
0140 5F4F SUBI R20,0xFF
0141 4F5F SBCI R21,0xFF
0142 1746 CP R20,R22
0143 0757 CPC R21,R23
0144 F3D0 BCS 0x013F
0145 940E044F CALL pop_gset2
0147 9508 RET
(0026) }
(0027)
(0028) void delay_1ms(void) //1ms延時函數
(0029) {
(0030) unsigned int i;
(0031) for (i=0;i<1140;i++);
_delay_1ms:
i --> R16
0148 2700 CLR R16
0149 2711 CLR R17
014A C002 RJMP 0x014D
014B 5F0F SUBI R16,0xFF
014C 4F1F SBCI R17,0xFF
014D 3704 CPI R16,0x74
014E E0E4 LDI R30,4
014F 071E CPC R17,R30
0150 F3D0 BCS 0x014B
0151 9508 RET
_delay_nms:
i --> R20
n --> R22
0152 940E045B CALL push_gset2
0154 01B8 MOVW R22,R16
(0032) }
(0033)
(0034) void delay_nms(unsigned int n) //N ms延時函數
(0035) {
(0036) unsigned int i=0;
0155 2744 CLR R20
0156 2755 CLR R21
(0037) for (i=0;i<n;i++)
0157 C003 RJMP 0x015B
(0038) delay_1ms();
0158 DFEF RCALL _delay_1ms
0159 5F4F SUBI R20,0xFF
015A 4F5F SBCI R21,0xFF
015B 1746 CP R20,R22
015C 0757 CPC R21,R23
015D F3D0 BCS 0x0158
015E 940E044F CALL pop_gset2
0160 9508 RET
FILE: C:\DOCUME~1\Administrator\桌面\Menu\1602.h
(0001)
(0002) /* 用法:
(0003) LCD_init();
(0004) LCD_write_string(列,行,"字符串");
(0005) LCD_write_char(列,行,'字符');
(0006) ---------------------------------------------------------------
(0007) 下面是AVR與LCD連接信息
(0008) PA2 ->RS
(0009) PA3 ->EN
(0010) 地 ->RW
(0011) PA4 ->D4
(0012) PA5 ->D5
(0013) PA6 ->D6
(0014) PA7 ->D7
(0015) 要使用本驅動,改變下面配置信息即可
(0016) -----------------------------------------------------------------*/
(0017) #define LCD_EN_PORT PORTA //以下2個要設為同一個口
(0018) #define LCD_EN_DDR DDRA
(0019) #define LCD_RS_PORT PORTA //以下2個要設為同一個口
(0020) #define LCD_RS_DDR DDRA
(0021) #define LCD_DATA_PORT PORTA //以下3個要設為同一個口
(0022) #define LCD_DATA_DDR DDRA //一定要用高4位
(0023) #define LCD_DATA_PIN PINA
(0024) #define LCD_RS (1<<PA2) //0x04 portA2 out
(0025) #define LCD_EN (1<<PA3) //0x08 portA3 out
(0026) #define LCD_DATA ((1<<PA4)|(1<<PA5)|(1<<PA6)|(1<<PA7)) //0xf0 portA4/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);
(0036) void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data);
(0037) #ifndef __1602_h
(0038) #define __1602_h
(0039) //-----------------------------------------------------------------------------------------
(0040) #include "delay.h"
(0041)
(0042) void LCD_init(void) //液晶初始化
(0043) {
(0044) LCD_DATA_DDR|=LCD_DATA; //數據口方向為輸出
_LCD_init:
0161 B38A IN R24,0x1A
0162 6F80 ORI R24,0xF0
0163 BB8A OUT 0x1A,R24
(0045) LCD_EN_DDR|=LCD_EN; //設置EN方向為輸出
0164 9AD3 SBI 0x1A,3
(0046) LCD_RS_DDR|=LCD_RS; //設置RS方向為輸出
0165 9AD2 SBI 0x1A,2
(0047) LCD_write_command(0x28);
0166 E208 LDI R16,0x28
0167 D014 RCALL _LCD_write_command
(0048) LCD_en_write();
0168 D00D RCALL _LCD_en_write
(0049) delay_nus(40);
0169 E208 LDI R16,0x28
016A E010 LDI R17,0
016B DFCD RCALL _delay_nus
(0050) LCD_write_command(0x28); //4位顯示
016C E208 LDI R16,0x28
016D D00E RCALL _LCD_write_command
(0051) LCD_write_command(0x0c); //顯示開
016E E00C LDI R16,0xC
016F D00C RCALL _LCD_write_command
(0052) LCD_write_command(0x01); //清屏
0170 E001 LDI R16,1
0171 D00A RCALL _LCD_write_command
(0053) delay_nms(2);
0172 E002 LDI R16,2
0173 E010 LDI R17,0
0174 DFDD RCALL _delay_nms
0175 9508 RET
(0054) }
(0055)
(0056) void LCD_en_write(void) //液晶使能
(0057) {
(0058) LCD_EN_PORT|=LCD_EN;
_LCD_en_write:
0176 9ADB SBI 0x1B,3
(0059) delay_nus(1);
0177 E001 LDI R16,1
0178 E010 LDI R17,0
0179 DFBF RCALL _delay_nus
(0060) LCD_EN_PORT&=~LCD_EN;
017A 98DB CBI 0x1B,3
017B 9508 RET
_LCD_write_command:
command --> R20
017C 940E045D CALL push_gset1
017E 2F40 MOV R20,R16
(0061) }
(0062)
(0063) void LCD_write_command(unsigned char command) //寫指令
(0064) {
(0065) delay_nus(16);
017F E100 LDI R16,0x10
0180 E010 LDI R17,0
0181 DFB7 RCALL _delay_nus
(0066) LCD_RS_PORT&=~LCD_RS; //RS=0
0182 98DA CBI 0x1B,2
(0067) LCD_DATA_PORT&=0X0f; //清高四位
0183 B38B IN R24,0x1B
0184 708F ANDI R24,0xF
0185 BB8B OUT 0x1B,R24
(0068) LCD_DATA_PORT|=command&0xf0; //寫高四位
0186 2F84 MOV R24,R20
0187 7F80 ANDI R24,0xF0
0188 B22B IN R2,0x1B
0189 2A28 OR R2,R24
018A BA2B OUT 0x1B,R2
(0069) LCD_en_write();
018B DFEA RCALL _LCD_en_write
(0070) command=command<<4; //低四位移到高四位
018C 2F84 MOV R24,R20
018D 708F ANDI R24,0xF
018E 9582 SWAP R24
018F 2F48 MOV R20,R24
(0071) LCD_DATA_PORT&=0x0f; //清高四位
0190 B38B IN R24,0x1B
0191 708F ANDI R24,0xF
0192 BB8B OUT 0x1B,R24
(0072) LCD_DATA_PORT|=command&0xf0; //寫低四位
0193 2F84 MOV R24,R20
0194 7F80 ANDI R24,0xF0
0195 B22B IN R2,0x1B
0196 2A28 OR R2,R24
0197 BA2B OUT 0x1B,R2
(0073) LCD_en_write();
0198 DFDD RCALL _LCD_en_write
0199 940E0460 CALL pop_gset1
019B 9508 RET
_LCD_write_data:
data --> R20
019C 940E045D CALL push_gset1
019E 2F40 MOV R20,R16
(0074)
(0075) }
(0076)
(0077) void LCD_write_data(unsigned char data) //寫數據
(0078) {
(0079) delay_nus(16);
019F E100 LDI R16,0x10
01A0 E010 LDI R17,0
01A1 DF97 RCALL _delay_nus
(0080) LCD_RS_PORT|=LCD_RS; //RS=1
01A2 9ADA SBI 0x1B,2
(0081) LCD_DATA_PORT&=0X0f; //清高四位
01A3 B38B IN R24,0x1B
01A4 708F ANDI R24,0xF
01A5 BB8B OUT 0x1B,R24
(0082) LCD_DATA_PORT|=data&0xf0; //寫高四位
01A6 2F84 MOV R24,R20
01A7 7F80 ANDI R24,0xF0
01A8 B22B IN R2,0x1B
01A9 2A28 OR R2,R24
01AA BA2B OUT 0x1B,R2
(0083) LCD_en_write();
01AB DFCA RCALL _LCD_en_write
(0084) data=data<<4; //低四位移到高四位
01AC 2F84 MOV R24,R20
01AD 708F ANDI R24,0xF
01AE 9582 SWAP R24
01AF 2F48 MOV R20,R24
(0085) LCD_DATA_PORT&=0X0f; //清高四位
01B0 B38B IN R24,0x1B
01B1 708F ANDI R24,0xF
01B2 BB8B OUT 0x1B,R24
(0086) LCD_DATA_PORT|=data&0xf0; //寫低四位
01B3 2F84 MOV R24,R20
01B4 7F80 ANDI R24,0xF0
01B5 B22B IN R2,0x1B
01B6 2A28 OR R2,R24
01B7 BA2B OUT 0x1B,R2
(0087) LCD_en_write();
01B8 DFBD RCALL _LCD_en_write
01B9 940E0460 CALL pop_gset1
01BB 9508 RET
_LCD_set_xy:
address --> R20
y --> R20
x --> R22
01BC 940E045B CALL push_gset2
01BE 2F42 MOV R20,R18
01BF 2F60 MOV R22,R16
(0088) }
(0089)
(0090)
(0091) void LCD_set_xy( unsigned char x, unsigned char y ) //寫地址函數
(0092) {
(0093) unsigned char address;
(0094) if (y == 0) address = 0x80 + x;
01C0 2344 TST R20
01C1 F419 BNE 0x01C5
01C2 2F46 MOV R20,R22
01C3 5840 SUBI R20,0x80
01C4 C002 RJMP 0x01C7
(0095) else address = 0xc0 + x;
01C5 2F46 MOV R20,R22
01C6 5440 SUBI R20,0x40
(0096) LCD_write_command( address);
01C7 2F04 MOV R16,R20
01C8 DFB3 RCALL _LCD_write_command
01C9 940E044F CALL pop_gset2
01CB 9508 RET
_LCD_write_string:
s --> R20
Y --> R10
X --> R22
01CC 940E0459 CALL push_gset3
01CE 2EA2 MOV R10,R18
01CF 2F60 MOV R22,R16
01D0 814E LDD R20,Y+6
01D1 815F LDD R21,Y+7
(0097) }
(0098)
(0099) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) //列x=0~15,行y=0,1
(0100) {
(0101) LCD_set_xy( X, Y ); //寫地址
01D2 2D2A MOV R18,R10
01D3 2F06 MOV R16,R22
01D4 DFE7 RCALL _LCD_set_xy
01D5 C005 RJMP 0x01DB
(0102) while (*s) // 寫顯示字符
(0103) {
(0104) LCD_write_data( *s );
01D6 01FA MOVW R30,R20
01D7 8100 LDD R16,Z+0
01D8 DFC3 RCALL _LCD_write_data
(0105) s ++;
01D9 5F4F SUBI R20,0xFF
01DA 4F5F SBCI R21,0xFF
01DB 01FA MOVW R30,R20
01DC 8020 LDD R2,Z+0
01DD 2022 TST R2
01DE F7B9 BNE 0x01D6
01DF 940E0452 CALL pop_gset3
01E1 9508 RET
_LCD_write_char:
data --> Y+4
Y --> R22
X --> R20
01E2 940E045B CALL push_gset2
01E4 2F62 MOV R22,R18
01E5 2F40 MOV R20,R16
(0106) }
(0107)
(0108) }
(0109)
(0110) void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data) //列x=0~15,行y=0,1
(0111) {
(0112) LCD_set_xy( X, Y ); //寫地址
01E6 2F26 MOV R18,R22
01E7 2F04 MOV R16,R20
01E8 DFD3 RCALL _LCD_set_xy
(0113) LCD_write_data( data);
01E9 810C LDD R16,Y+4
01EA DFB1 RCALL _LCD_write_data
01EB 940E044F CALL pop_gset2
01ED 9508 RET
_key_read:
i --> R20
01EE 940E045D CALL push_gset1
FILE: C:\DOCUME~1\Administrator\桌面\Menu\key.h
(0001)
(0002)
(0003) //函數說明
(0004) //--------------------------------
(0005) unsigned char get_key(void);
(0006) //--------------------------------
(0007) #ifndef __key_h
(0008) #define __key_h
(0009) unsigned char key_read(void)
(0010) {
(0011) unsigned char i;
(0012) /*獲取列地址*/
(0013) DDRB=0xf0; //高4位輸出,低4位輸入
01F0 EF80 LDI R24,0xF0
01F1 BB87 OUT 0x17,R24
(0014) PORTB=0x0f;//高4位輸出0,低4位帶上拉輸入
01F2 E08F LDI R24,0xF
01F3 BB88 OUT 0x18,R24
(0015) delay_nms(1);
01F4 E001 LDI R16,1
01F5 E010 LDI R17,0
01F6 DF5B RCALL _delay_nms
(0016)
(0017) i=PINB&0x0f;
01F7 B346 IN R20,0x16
01F8 704F ANDI R20,0xF
(0018)
(0019) /*獲取行地址*/
(0020) DDRB=0x0f;//高4位輸入,低4位輸出
01F9 E08F LDI R24,0xF
01FA BB87 OUT 0x17,R24
(0021) PORTB=0xf0;//低4位輸出0,高4位帶上拉輸入
01FB EF80 LDI R24,0xF0
01FC BB88 OUT 0x18,R24
(0022) delay_nms(1);
01FD E001 LDI R16,1
01FE E010 LDI R17,0
01FF DF52 RCALL _delay_nms
(0023)
(0024) i|=PINB&0xf0;
0200 B386 IN R24,0x16
0201 7F80 ANDI R24,0xF0
0202 2B48 OR R20,R24
(0025)
(0026) switch(i)
0203 2755 CLR R21
0204 3D47 CPI R20,0xD7
0205 E0E0 LDI R30,0
0206 075E CPC R21,R30
0207 F409 BNE 0x0209
0208 C075 RJMP 0x027E
0209 3D4B CPI R20,0xDB
020A E0E0 LDI R30,0
020B 075E CPC R21,R30
020C F409 BNE 0x020E
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -