📄 485.lst
字号:
__start:
__text_start:
003D E5CF LDI R28,0x5F
003E E0D4 LDI R29,4
003F BFCD OUT 0x3D,R28
0040 BFDE OUT 0x3E,R29
0041 51C0 SUBI R28,0x10
0042 40D0 SBCI R29,0
0043 EA0A LDI R16,0xAA
0044 8308 STD Y+0,R16
0045 2400 CLR R0
0046 E8E5 LDI R30,0x85
0047 E0F0 LDI R31,0
0048 E010 LDI R17,0
0049 39EA CPI R30,0x9A
004A 07F1 CPC R31,R17
004B F011 BEQ 0x004E
004C 9201 ST R0,Z+
004D CFFB RJMP 0x0049
004E 8300 STD Z+0,R16
004F E5E4 LDI R30,0x54
0050 E0F0 LDI R31,0
0051 E6A0 LDI R26,0x60
0052 E0B0 LDI R27,0
0053 E010 LDI R17,0
0054 37E9 CPI R30,0x79
0055 07F1 CPC R31,R17
0056 F021 BEQ 0x005B
0057 95C8 LPM
0058 9631 ADIW R30,1
0059 920D ST R0,X+
005A CFF9 RJMP 0x0054
005B 940E0294 CALL _main
_exit:
005D CFFF RJMP _exit
FILE: D:\avr\+++精华+++\485\485_master\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:
005E 0000 NOP
005F 9508 RET
_delay_nus:
i --> R20
n --> R22
0060 940E0329 CALL push_gset2
0062 01B8 MOVW R22,R16
(0017) }
(0018)
(0019) void delay_nus(unsigned int n) //N us延时函数
(0020) {
(0021) unsigned int i=0;
0063 2744 CLR R20
0064 2755 CLR R21
(0022) for (i=0;i<n;i++)
0065 C003 RJMP 0x0069
(0023) delay_1us();
0066 DFF7 RCALL _delay_1us
0067 5F4F SUBI R20,0xFF
0068 4F5F SBCI R21,0xFF
0069 1746 CP R20,R22
006A 0757 CPC R21,R23
006B F3D0 BCS 0x0066
006C 940E031D CALL pop_gset2
006E 9508 RET
(0024) }
(0025)
(0026) void delay_1ms(void) //1ms延时函数
(0027) {
(0028) unsigned int i;
(0029) for (i=0;i<1140;i++);
_delay_1ms:
i --> R16
006F 2700 CLR R16
0070 2711 CLR R17
0071 C002 RJMP 0x0074
0072 5F0F SUBI R16,0xFF
0073 4F1F SBCI R17,0xFF
0074 3704 CPI R16,0x74
0075 E0E4 LDI R30,4
0076 071E CPC R17,R30
0077 F3D0 BCS 0x0072
0078 9508 RET
_delay_nms:
i --> R20
n --> R22
0079 940E0329 CALL push_gset2
007B 01B8 MOVW R22,R16
(0030) }
(0031)
(0032) void delay_nms(unsigned int n) //N ms延时函数
(0033) {
(0034) unsigned int i=0;
007C 2744 CLR R20
007D 2755 CLR R21
(0035) for (i=0;i<n;i++)
007E C003 RJMP 0x0082
(0036) delay_1ms();
007F DFEF RCALL _delay_1ms
0080 5F4F SUBI R20,0xFF
0081 4F5F SBCI R21,0xFF
0082 1746 CP R20,R22
0083 0757 CPC R21,R23
0084 F3D0 BCS 0x007F
0085 940E031D CALL pop_gset2
0087 9508 RET
FILE: D:\avr\+++精华+++\485\485_master\1602.h
(0001)
(0002) /* 用法:
(0003) LCD_init();
(0004) LCD_write_string(列,行,"字符串");
(0005) LCD_write_char(列,行,'字符');
(0006) ---------------------------------------------------------------
(0007) 下面是AVR与LCD连接信息
(0008) PC4 ->RS
(0009) PC5 ->EN
(0010) 地 ->RW
(0011) PC0 ->D4
(0012) PC1 ->D5
(0013) PC2 ->D6
(0014) PC3 ->D7
(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 PORTC //以下3个要设为同一个口
(0022) #define LCD_DATA_DDR DDRC //默认情况下连线必须使用高四位端口,如果不是请注意修改
(0023) #define LCD_DATA_PIN PINC
(0024) #define LCD_RS (1<<PC4) //0x10 portC4 out
(0025) #define LCD_EN (1<<PC5) //0x20 portC5 out
(0026) #define LCD_DATA ((1<<PC0)|(1<<PC1)|(1<<PC2)|(1<<PC3)) //0xf0 portC 0/1/2/3 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)
(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:
0088 B384 IN R24,0x14
0089 608F ORI R24,0xF
008A BB84 OUT 0x14,R24
(0046) LCD_EN_DDR|=LCD_EN; //设置EN方向为输出
008B 9AA5 SBI 0x14,5
(0047) LCD_RS_DDR|=LCD_RS; //设置RS方向为输出
008C 9AA4 SBI 0x14,4
(0048) LCD_write_command(0x28);
008D E208 LDI R16,0x28
008E D014 RCALL _LCD_write_command
(0049) LCD_en_write();
008F D00D RCALL _LCD_en_write
(0050) delay_nus(40);
0090 E208 LDI R16,0x28
0091 E010 LDI R17,0
0092 DFCD RCALL _delay_nus
(0051) LCD_write_command(0x28); //4位显示
0093 E208 LDI R16,0x28
0094 D00E RCALL _LCD_write_command
(0052) LCD_write_command(0x0c); //显示开
0095 E00C LDI R16,0xC
0096 D00C RCALL _LCD_write_command
(0053) LCD_write_command(0x01); //清屏
0097 E001 LDI R16,1
0098 D00A RCALL _LCD_write_command
(0054) delay_nms(2);
0099 E002 LDI R16,2
009A E010 LDI R17,0
009B DFDD RCALL _delay_nms
009C 9508 RET
(0055)
(0056)
(0057)
(0058) }
(0059)
(0060) void LCD_en_write(void) //液晶使能
(0061) {
(0062) LCD_EN_PORT|=LCD_EN;
_LCD_en_write:
009D 9AAD SBI 0x15,5
(0063) delay_nus(1);
009E E001 LDI R16,1
009F E010 LDI R17,0
00A0 DFBF RCALL _delay_nus
(0064) LCD_EN_PORT&=~LCD_EN;
00A1 98AD CBI 0x15,5
00A2 9508 RET
_LCD_write_command:
command --> R20
00A3 940E032B CALL push_gset1
00A5 2F40 MOV R20,R16
(0065) }
(0066)
(0067) void LCD_write_command(unsigned char command) //写指令
(0068) {
(0069) /* //连线为高4位的写法
(0070) delay_nus(16);
(0071) LCD_RS_PORT&=~LCD_RS; //RS=0
(0072) LCD_DATA_PORT&=0X0f; //清高四位
(0073) LCD_DATA_PORT|=command&0xf0; //写高四位
(0074) LCD_en_write();
(0075) command=command<<4; //低四位移到高四位
(0076) LCD_DATA_PORT&=0x0f; //清高四位
(0077) LCD_DATA_PORT|=command&0xf0; //写低四位
(0078) LCD_en_write();
(0079) */
(0080)
(0081) //连线为低四位的写法
(0082) delay_nus(16);
00A6 E100 LDI R16,0x10
00A7 E010 LDI R17,0
00A8 DFB7 RCALL _delay_nus
(0083) LCD_RS_PORT&=~LCD_RS; //RS=0
00A9 98AC CBI 0x15,4
(0084) LCD_DATA_PORT&=0xf0; //清高四位
00AA B385 IN R24,0x15
00AB 7F80 ANDI R24,0xF0
00AC BB85 OUT 0x15,R24
(0085) LCD_DATA_PORT|=(command>>4)&0x0f; //写高四位
00AD 2F84 MOV R24,R20
00AE 9582 SWAP R24
00AF 708F ANDI R24,0xF
00B0 708F ANDI R24,0xF
00B1 B225 IN R2,0x15
00B2 2A28 OR R2,R24
00B3 BA25 OUT 0x15,R2
(0086) LCD_en_write();
00B4 DFE8 RCALL _LCD_en_write
(0087) LCD_DATA_PORT&=0xf0; //清高四位
00B5 B385 IN R24,0x15
00B6 7F80 ANDI R24,0xF0
00B7 BB85 OUT 0x15,R24
(0088) LCD_DATA_PORT|=command&0x0f; //写低四位
00B8 2F84 MOV R24,R20
00B9 708F ANDI R24,0xF
00BA B225 IN R2,0x15
00BB 2A28 OR R2,R24
00BC BA25 OUT 0x15,R2
(0089) LCD_en_write();
00BD DFDF RCALL _LCD_en_write
00BE 940E032E CALL pop_gset1
00C0 9508 RET
_LCD_write_data:
data --> R20
00C1 940E032B CALL push_gset1
00C3 2F40 MOV R20,R16
(0090)
(0091)
(0092) }
(0093)
(0094) void LCD_write_data(unsigned char data) //写数据
(0095) {
(0096) /* //连线为高4位的写法
(0097) delay_nus(16);
(0098) LCD_RS_PORT|=LCD_RS; //RS=1
(0099) LCD_DATA_PORT&=0X0f; //清高四位
(0100) LCD_DATA_PORT|=data&0xf0; //写高四位
(0101) LCD_en_write();
(0102) data=data<<4; //低四位移到高四位
(0103) LCD_DATA_PORT&=0X0f; //清高四位
(0104) LCD_DATA_PORT|=data&0xf0; //写低四位
(0105) LCD_en_write();
(0106) */
(0107)
(0108) //连线为低四位的写法
(0109) delay_nus(16);
00C4 E100 LDI R16,0x10
00C5 E010 LDI R17,0
00C6 DF99 RCALL _delay_nus
(0110) LCD_RS_PORT|=LCD_RS; //RS=1
00C7 9AAC SBI 0x15,4
(0111) LCD_DATA_PORT&=0Xf0; //清高四位
00C8 B385 IN R24,0x15
00C9 7F80 ANDI R24,0xF0
00CA BB85 OUT 0x15,R24
(0112) LCD_DATA_PORT|=(data>>4)&0x0f; //写高四位
00CB 2F84 MOV R24,R20
00CC 9582 SWAP R24
00CD 708F ANDI R24,0xF
00CE 708F ANDI R24,0xF
00CF B225 IN R2,0x15
00D0 2A28 OR R2,R24
00D1 BA25 OUT 0x15,R2
(0113) LCD_en_write();
00D2 DFCA RCALL _LCD_en_write
(0114)
(0115) LCD_DATA_PORT&=0Xf0; //清高四位
00D3 B385 IN R24,0x15
00D4 7F80 ANDI R24,0xF0
00D5 BB85 OUT 0x15,R24
(0116) LCD_DATA_PORT|=data&0x0f; //写低四位
00D6 2F84 MOV R24,R20
00D7 708F ANDI R24,0xF
00D8 B225 IN R2,0x15
00D9 2A28 OR R2,R24
00DA BA25 OUT 0x15,R2
(0117) LCD_en_write();
00DB DFC1 RCALL _LCD_en_write
00DC 940E032E CALL pop_gset1
00DE 9508 RET
_LCD_set_xy:
address --> R20
y --> R20
x --> R22
00DF 940E0329 CALL push_gset2
00E1 2F42 MOV R20,R18
00E2 2F60 MOV R22,R16
(0118)
(0119)
(0120) }
(0121)
(0122)
(0123) void LCD_set_xy( unsigned char x, unsigned char y ) //写地址函数
(0124) {
(0125) unsigned char address;
(0126) if (y == 0) address = 0x80 + x;
00E3 2344 TST R20
00E4 F419 BNE 0x00E8
00E5 2F46 MOV R20,R22
00E6 5840 SUBI R20,0x80
00E7 C002 RJMP 0x00EA
(0127) else address = 0xc0 + x;
00E8 2F46 MOV R20,R22
00E9 5440 SUBI R20,0x40
(0128) LCD_write_command( address);
00EA 2F04 MOV R16,R20
00EB DFB7 RCALL _LCD_write_command
00EC 940E031D CALL pop_gset2
00EE 9508 RET
_LCD_write_string:
s --> R20
Y --> R10
X --> R22
00EF 940E0327 CALL push_gset3
00F1 2EA2 MOV R10,R18
00F2 2F60 MOV R22,R16
00F3 814E LDD R20,Y+6
00F4 815F LDD R21,Y+7
(0129) }
(0130)
(0131) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) //列x=0~15,行y=0,1
(0132) {
(0133) LCD_set_xy( X, Y ); //写地址
00F5 2D2A MOV R18,R10
00F6 2F06 MOV R16,R22
00F7 DFE7 RCALL _LCD_set_xy
00F8 C005 RJMP 0x00FE
(0134) while (*s) // 写显示字符
(0135) {
(0136) LCD_write_data( *s );
00F9 01FA MOVW R30,R20
00FA 8100 LDD R16,Z+0
00FB DFC5 RCALL _LCD_write_data
(0137) s ++;
00FC 5F4F SUBI R20,0xFF
00FD 4F5F SBCI R21,0xFF
00FE 01FA MOVW R30,R20
00FF 8020 LDD R2,Z+0
0100 2022 TST R2
0101 F7B9 BNE 0x00F9
0102 940E0320 CALL pop_gset3
0104 9508 RET
_LCD_write_char:
data --> Y+4
Y --> R22
X --> R20
0105 940E0329 CALL push_gset2
0107 2F62 MOV R22,R18
0108 2F40 MOV R20,R16
(0138) }
(0139)
(0140) }
(0141)
(0142) void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data) //列x=0~15,行y=0,1
(0143) {
(0144) LCD_set_xy( X, Y ); //写地址
0109 2F26 MOV R18,R22
010A 2F04 MOV R16,R20
010B DFD3 RCALL _LCD_set_xy
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -