📄 mater.lst
字号:
__start:
__text_start:
0030 E5CF LDI R28,0x5F
0031 E0D4 LDI R29,4
0032 BFCD OUT 0x3D,R28
0033 BFDE OUT 0x3E,R29
0034 51C0 SUBI R28,0x10
0035 40D0 SBCI R29,0
0036 EA0A LDI R16,0xAA
0037 8308 STD Y+0,R16
0038 2400 CLR R0
0039 E6EC LDI R30,0x6C
003A E0F0 LDI R31,0
003B E010 LDI R17,0
003C 38E0 CPI R30,0x80
003D 07F1 CPC R31,R17
003E F011 BEQ 0x0041
003F 9201 ST R0,Z+
0040 CFFB RJMP 0x003C
0041 8300 STD Z+0,R16
0042 E5E4 LDI R30,0x54
0043 E0F0 LDI R31,0
0044 E6A0 LDI R26,0x60
0045 E0B0 LDI R27,0
0046 E010 LDI R17,0
0047 36E0 CPI R30,0x60
0048 07F1 CPC R31,R17
0049 F021 BEQ 0x004E
004A 95C8 LPM
004B 9631 ADIW R30,1
004C 920D ST R0,X+
004D CFF9 RJMP 0x0047
004E 940E018E CALL _main
_exit:
0050 CFFF RJMP _exit
FILE: F:\ChengXuCunFang\ChengXU\AVR单片机程序存放\max485多机通讯1\主机\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:
0051 0000 NOP
0052 9508 RET
_delay_nus:
i --> R20
n --> R22
0053 940E01E8 CALL push_gset2
0055 01B8 MOVW R22,R16
(0017) }
(0018)
(0019) void delay_nus(unsigned int n) //N us延时函数
(0020) {
(0021) unsigned int i=0;
0056 2744 CLR R20
0057 2755 CLR R21
(0022) for (i=0;i<n;i++)
0058 C003 RJMP 0x005C
(0023) delay_1us();
0059 DFF7 RCALL _delay_1us
005A 5F4F SUBI R20,0xFF
005B 4F5F SBCI R21,0xFF
005C 1746 CP R20,R22
005D 0757 CPC R21,R23
005E F3D0 BCS 0x0059
005F 940E01DC CALL pop_gset2
0061 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
0062 2700 CLR R16
0063 2711 CLR R17
0064 C002 RJMP 0x0067
0065 5F0F SUBI R16,0xFF
0066 4F1F SBCI R17,0xFF
0067 3704 CPI R16,0x74
0068 E0E4 LDI R30,4
0069 071E CPC R17,R30
006A F3D0 BCS 0x0065
006B 9508 RET
_delay_nms:
i --> R20
n --> R22
006C 940E01E8 CALL push_gset2
006E 01B8 MOVW R22,R16
(0030) }
(0031)
(0032) void delay_nms(unsigned int n) //N ms延时函数
(0033) {
(0034) unsigned int i=0;
006F 2744 CLR R20
0070 2755 CLR R21
(0035) for (i=0;i<n;i++)
0071 C003 RJMP 0x0075
(0036) delay_1ms();
0072 DFEF RCALL _delay_1ms
0073 5F4F SUBI R20,0xFF
0074 4F5F SBCI R21,0xFF
0075 1746 CP R20,R22
0076 0757 CPC R21,R23
0077 F3D0 BCS 0x0072
0078 940E01DC CALL pop_gset2
007A 9508 RET
FILE: F:\ChengXuCunFang\ChengXU\AVR单片机程序存放\max485多机通讯1\主机\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:
007B B384 IN R24,0x14
007C 608F ORI R24,0xF
007D BB84 OUT 0x14,R24
(0046) LCD_EN_DDR|=LCD_EN; //设置EN方向为输出
007E 9AA5 SBI 0x14,5
(0047) LCD_RS_DDR|=LCD_RS; //设置RS方向为输出
007F 9AA4 SBI 0x14,4
(0048) LCD_write_command(0x28);
0080 E208 LDI R16,0x28
0081 D014 RCALL _LCD_write_command
(0049) LCD_en_write();
0082 D00D RCALL _LCD_en_write
(0050) delay_nus(40);
0083 E208 LDI R16,0x28
0084 E010 LDI R17,0
0085 DFCD RCALL _delay_nus
(0051) LCD_write_command(0x28); //4位显示
0086 E208 LDI R16,0x28
0087 D00E RCALL _LCD_write_command
(0052) LCD_write_command(0x0c); //显示开
0088 E00C LDI R16,0xC
0089 D00C RCALL _LCD_write_command
(0053) LCD_write_command(0x01); //清屏
008A E001 LDI R16,1
008B D00A RCALL _LCD_write_command
(0054) delay_nms(2);
008C E002 LDI R16,2
008D E010 LDI R17,0
008E DFDD RCALL _delay_nms
008F 9508 RET
(0055)
(0056)
(0057)
(0058) }
(0059)
(0060) void LCD_en_write(void) //液晶使能
(0061) {
(0062) LCD_EN_PORT|=LCD_EN;
_LCD_en_write:
0090 9AAD SBI 0x15,5
(0063) delay_nus(1);
0091 E001 LDI R16,1
0092 E010 LDI R17,0
0093 DFBF RCALL _delay_nus
(0064) LCD_EN_PORT&=~LCD_EN;
0094 98AD CBI 0x15,5
0095 9508 RET
_LCD_write_command:
command --> R20
0096 940E01EA CALL push_gset1
0098 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);
0099 E100 LDI R16,0x10
009A E010 LDI R17,0
009B DFB7 RCALL _delay_nus
(0083) LCD_RS_PORT&=~LCD_RS; //RS=0
009C 98AC CBI 0x15,4
(0084) LCD_DATA_PORT&=0xf0; //清高四位
009D B385 IN R24,0x15
009E 7F80 ANDI R24,0xF0
009F BB85 OUT 0x15,R24
(0085) LCD_DATA_PORT|=(command>>4)&0x0f; //写高四位
00A0 2F84 MOV R24,R20
00A1 9582 SWAP R24
00A2 708F ANDI R24,0xF
00A3 708F ANDI R24,0xF
00A4 B225 IN R2,0x15
00A5 2A28 OR R2,R24
00A6 BA25 OUT 0x15,R2
(0086) LCD_en_write();
00A7 DFE8 RCALL _LCD_en_write
(0087) LCD_DATA_PORT&=0xf0; //清高四位
00A8 B385 IN R24,0x15
00A9 7F80 ANDI R24,0xF0
00AA BB85 OUT 0x15,R24
(0088) LCD_DATA_PORT|=command&0x0f; //写低四位
00AB 2F84 MOV R24,R20
00AC 708F ANDI R24,0xF
00AD B225 IN R2,0x15
00AE 2A28 OR R2,R24
00AF BA25 OUT 0x15,R2
(0089) LCD_en_write();
00B0 DFDF RCALL _LCD_en_write
00B1 940E01ED CALL pop_gset1
00B3 9508 RET
_LCD_write_data:
data --> R20
00B4 940E01EA CALL push_gset1
00B6 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);
00B7 E100 LDI R16,0x10
00B8 E010 LDI R17,0
00B9 DF99 RCALL _delay_nus
(0110) LCD_RS_PORT|=LCD_RS; //RS=1
00BA 9AAC SBI 0x15,4
(0111) LCD_DATA_PORT&=0Xf0; //清高四位
00BB B385 IN R24,0x15
00BC 7F80 ANDI R24,0xF0
00BD BB85 OUT 0x15,R24
(0112) LCD_DATA_PORT|=(data>>4)&0x0f; //写高四位
00BE 2F84 MOV R24,R20
00BF 9582 SWAP R24
00C0 708F ANDI R24,0xF
00C1 708F ANDI R24,0xF
00C2 B225 IN R2,0x15
00C3 2A28 OR R2,R24
00C4 BA25 OUT 0x15,R2
(0113) LCD_en_write();
00C5 DFCA RCALL _LCD_en_write
(0114)
(0115) LCD_DATA_PORT&=0Xf0; //清高四位
00C6 B385 IN R24,0x15
00C7 7F80 ANDI R24,0xF0
00C8 BB85 OUT 0x15,R24
(0116) LCD_DATA_PORT|=data&0x0f; //写低四位
00C9 2F84 MOV R24,R20
00CA 708F ANDI R24,0xF
00CB B225 IN R2,0x15
00CC 2A28 OR R2,R24
00CD BA25 OUT 0x15,R2
(0117) LCD_en_write();
00CE DFC1 RCALL _LCD_en_write
00CF 940E01ED CALL pop_gset1
00D1 9508 RET
_LCD_set_xy:
address --> R20
y --> R20
x --> R22
00D2 940E01E8 CALL push_gset2
00D4 2F42 MOV R20,R18
00D5 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;
00D6 2344 TST R20
00D7 F419 BNE 0x00DB
00D8 2F46 MOV R20,R22
00D9 5840 SUBI R20,0x80
00DA C002 RJMP 0x00DD
(0127) else address = 0xc0 + x;
00DB 2F46 MOV R20,R22
00DC 5440 SUBI R20,0x40
(0128) LCD_write_command( address);
00DD 2F04 MOV R16,R20
00DE DFB7 RCALL _LCD_write_command
00DF 940E01DC CALL pop_gset2
00E1 9508 RET
_LCD_write_string:
s --> R20
Y --> R10
X --> R22
00E2 940E01E6 CALL push_gset3
00E4 2EA2 MOV R10,R18
00E5 2F60 MOV R22,R16
00E6 814E LDD R20,Y+6
00E7 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 ); //写地址
00E8 2D2A MOV R18,R10
00E9 2F06 MOV R16,R22
00EA DFE7 RCALL _LCD_set_xy
00EB C005 RJMP 0x00F1
(0134) while (*s) // 写显示字符
(0135) {
(0136) LCD_write_data( *s );
00EC 01FA MOVW R30,R20
00ED 8100 LDD R16,Z+0
00EE DFC5 RCALL _LCD_write_data
(0137) s ++;
00EF 5F4F SUBI R20,0xFF
00F0 4F5F SBCI R21,0xFF
00F1 01FA MOVW R30,R20
00F2 8020 LDD R2,Z+0
00F3 2022 TST R2
00F4 F7B9 BNE 0x00EC
00F5 940E01DF CALL pop_gset3
00F7 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -