📄 rs485.lst
字号:
__text_start:
__start:
0038 E5CF LDI R28,0x5F
0039 E0D4 LDI R29,4
003A BFCD OUT 0x3D,R28
003B BFDE OUT 0x3E,R29
003C 51C0 SUBI R28,0x10
003D 40D0 SBCI R29,0
003E EA0A LDI R16,0xAA
003F 8308 STD Y+0,R16
0040 2400 CLR R0
0041 E7EC LDI R30,0x7C
0042 E0F0 LDI R31,0
0043 E010 LDI R17,0
0044 39E0 CPI R30,0x90
0045 07F1 CPC R31,R17
0046 F011 BEQ 0x0049
0047 9201 ST R0,Z+
0048 CFFB RJMP 0x0044
0049 8300 STD Z+0,R16
004A E5E4 LDI R30,0x54
004B E0F0 LDI R31,0
004C E6A0 LDI R26,0x60
004D E0B0 LDI R27,0
004E E010 LDI R17,0
004F 37E0 CPI R30,0x70
0050 07F1 CPC R31,R17
0051 F021 BEQ 0x0056
0052 95C8 LPM
0053 9631 ADIW R30,1
0054 920D ST R0,X+
0055 CFF9 RJMP 0x004F
0056 940E01D1 CALL _main
_exit:
0058 CFFF RJMP _exit
FILE: F:\ChengXuCunFang\ChengXU\AVR单片机程序存放\max485多机通讯1\新建文件夹\485_slave3\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:
0059 0000 NOP
005A 9508 RET
_delay_nus:
i --> R20
n --> R22
005B 940E021D CALL push_gset2
005D 01B8 MOVW R22,R16
(0017) }
(0018)
(0019) void delay_nus(unsigned int n) //N us延时函数
(0020) {
(0021) unsigned int i=0;
005E 2744 CLR R20
005F 2755 CLR R21
(0022) for (i=0;i<n;i++)
0060 C003 RJMP 0x0064
(0023) delay_1us();
0061 DFF7 RCALL _delay_1us
0062 5F4F SUBI R20,0xFF
0063 4F5F SBCI R21,0xFF
0064 1746 CP R20,R22
0065 0757 CPC R21,R23
0066 F3D0 BCS 0x0061
0067 940E0211 CALL pop_gset2
0069 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
006A 2700 CLR R16
006B 2711 CLR R17
006C C002 RJMP 0x006F
006D 5F0F SUBI R16,0xFF
006E 4F1F SBCI R17,0xFF
006F 3704 CPI R16,0x74
0070 E0E4 LDI R30,4
0071 071E CPC R17,R30
0072 F3D0 BCS 0x006D
0073 9508 RET
_delay_nms:
i --> R20
n --> R22
0074 940E021D CALL push_gset2
0076 01B8 MOVW R22,R16
(0030) }
(0031)
(0032) void delay_nms(unsigned int n) //N ms延时函数
(0033) {
(0034) unsigned int i=0;
0077 2744 CLR R20
0078 2755 CLR R21
(0035) for (i=0;i<n;i++)
0079 C003 RJMP 0x007D
(0036) delay_1ms();
007A DFEF RCALL _delay_1ms
007B 5F4F SUBI R20,0xFF
007C 4F5F SBCI R21,0xFF
007D 1746 CP R20,R22
007E 0757 CPC R21,R23
007F F3D0 BCS 0x007A
0080 940E0211 CALL pop_gset2
0082 9508 RET
FILE: F:\ChengXuCunFang\ChengXU\AVR单片机程序存放\max485多机通讯1\新建文件夹\485_slave3\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:
0083 B384 IN R24,0x14
0084 608F ORI R24,0xF
0085 BB84 OUT 0x14,R24
(0046) LCD_EN_DDR|=LCD_EN; //设置EN方向为输出
0086 9AA5 SBI 0x14,5
(0047) LCD_RS_DDR|=LCD_RS; //设置RS方向为输出
0087 9AA4 SBI 0x14,4
(0048) LCD_write_command(0x28);
0088 E208 LDI R16,0x28
0089 D014 RCALL _LCD_write_command
(0049) LCD_en_write();
008A D00D RCALL _LCD_en_write
(0050) delay_nus(40);
008B E208 LDI R16,0x28
008C E010 LDI R17,0
008D DFCD RCALL _delay_nus
(0051) LCD_write_command(0x28); //4位显示
008E E208 LDI R16,0x28
008F D00E RCALL _LCD_write_command
(0052) LCD_write_command(0x0c); //显示开
0090 E00C LDI R16,0xC
0091 D00C RCALL _LCD_write_command
(0053) LCD_write_command(0x01); //清屏
0092 E001 LDI R16,1
0093 D00A RCALL _LCD_write_command
(0054) delay_nms(2);
0094 E002 LDI R16,2
0095 E010 LDI R17,0
0096 DFDD RCALL _delay_nms
0097 9508 RET
(0055)
(0056)
(0057)
(0058) }
(0059)
(0060) void LCD_en_write(void) //液晶使能
(0061) {
(0062) LCD_EN_PORT|=LCD_EN;
_LCD_en_write:
0098 9AAD SBI 0x15,5
(0063) delay_nus(1);
0099 E001 LDI R16,1
009A E010 LDI R17,0
009B DFBF RCALL _delay_nus
(0064) LCD_EN_PORT&=~LCD_EN;
009C 98AD CBI 0x15,5
009D 9508 RET
_LCD_write_command:
command --> R20
009E 940E021F CALL push_gset1
00A0 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);
00A1 E100 LDI R16,0x10
00A2 E010 LDI R17,0
00A3 DFB7 RCALL _delay_nus
(0083) LCD_RS_PORT&=~LCD_RS; //RS=0
00A4 98AC CBI 0x15,4
(0084) LCD_DATA_PORT&=0xf0; //清高四位
00A5 B385 IN R24,0x15
00A6 7F80 ANDI R24,0xF0
00A7 BB85 OUT 0x15,R24
(0085) LCD_DATA_PORT|=(command>>4)&0x0f; //写高四位
00A8 2F84 MOV R24,R20
00A9 9582 SWAP R24
00AA 708F ANDI R24,0xF
00AB 708F ANDI R24,0xF
00AC B225 IN R2,0x15
00AD 2A28 OR R2,R24
00AE BA25 OUT 0x15,R2
(0086) LCD_en_write();
00AF DFE8 RCALL _LCD_en_write
(0087) LCD_DATA_PORT&=0xf0; //清高四位
00B0 B385 IN R24,0x15
00B1 7F80 ANDI R24,0xF0
00B2 BB85 OUT 0x15,R24
(0088) LCD_DATA_PORT|=command&0x0f; //写低四位
00B3 2F84 MOV R24,R20
00B4 708F ANDI R24,0xF
00B5 B225 IN R2,0x15
00B6 2A28 OR R2,R24
00B7 BA25 OUT 0x15,R2
(0089) LCD_en_write();
00B8 DFDF RCALL _LCD_en_write
00B9 940E0222 CALL pop_gset1
00BB 9508 RET
_LCD_write_data:
data --> R20
00BC 940E021F CALL push_gset1
00BE 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);
00BF E100 LDI R16,0x10
00C0 E010 LDI R17,0
00C1 DF99 RCALL _delay_nus
(0110) LCD_RS_PORT|=LCD_RS; //RS=1
00C2 9AAC SBI 0x15,4
(0111) LCD_DATA_PORT&=0Xf0; //清高四位
00C3 B385 IN R24,0x15
00C4 7F80 ANDI R24,0xF0
00C5 BB85 OUT 0x15,R24
(0112) LCD_DATA_PORT|=(data>>4)&0x0f; //写高四位
00C6 2F84 MOV R24,R20
00C7 9582 SWAP R24
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -