📄 485.lst
字号:
__text_start:
__start:
0054 EFCF LDI R28,0xFF
0055 E1D0 LDI R29,0x10
0056 BFCD OUT 0x3D,R28
0057 BFDE OUT 0x3E,R29
0058 51C0 SUBI R28,0x10
0059 40D0 SBCI R29,0
005A EA0A LDI R16,0xAA
005B 8308 STD Y+0,R16
005C 2400 CLR R0
005D E1EC LDI R30,0x1C
005E E0F1 LDI R31,1
005F E011 LDI R17,1
0060 33E0 CPI R30,0x30
0061 07F1 CPC R31,R17
0062 F011 BEQ 0x0065
0063 9201 ST R0,Z+
0064 CFFB RJMP 0x0060
0065 8300 STD Z+0,R16
0066 E8EC LDI R30,0x8C
0067 E0F0 LDI R31,0
0068 E0A0 LDI R26,0
0069 E0B1 LDI R27,1
006A E010 LDI R17,0
006B 3AE8 CPI R30,0xA8
006C 07F1 CPC R31,R17
006D F021 BEQ 0x0072
006E 95C8 LPM
006F 9631 ADIW R30,1
0070 920D ST R0,X+
0071 CFF9 RJMP 0x006B
0072 940E021B CALL _main
_exit:
0074 CFFF RJMP _exit
FILE: D:\mojinpan\485\485_slave2\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:
0075 0000 NOP
0076 9508 RET
_delay_nus:
i --> R20
n --> R22
0077 940E0267 CALL push_gset2
0079 01B8 MOVW R22,R16
(0017) }
(0018)
(0019) void delay_nus(unsigned int n) //N us延时函数
(0020) {
(0021) unsigned int i=0;
007A 2744 CLR R20
007B 2755 CLR R21
(0022) for (i=0;i<n;i++)
007C C003 RJMP 0x0080
(0023) delay_1us();
007D DFF7 RCALL _delay_1us
007E 5F4F SUBI R20,0xFF
007F 4F5F SBCI R21,0xFF
0080 1746 CP R20,R22
0081 0757 CPC R21,R23
0082 F3D0 BCS 0x007D
0083 940E025B CALL pop_gset2
0085 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
0086 2700 CLR R16
0087 2711 CLR R17
0088 C002 RJMP 0x008B
0089 5F0F SUBI R16,0xFF
008A 4F1F SBCI R17,0xFF
008B 3704 CPI R16,0x74
008C E0E4 LDI R30,4
008D 071E CPC R17,R30
008E F3D0 BCS 0x0089
008F 9508 RET
_delay_nms:
i --> R20
n --> R22
0090 940E0267 CALL push_gset2
0092 01B8 MOVW R22,R16
(0030) }
(0031)
(0032) void delay_nms(unsigned int n) //N ms延时函数
(0033) {
(0034) unsigned int i=0;
0093 2744 CLR R20
0094 2755 CLR R21
(0035) for (i=0;i<n;i++)
0095 C003 RJMP 0x0099
(0036) delay_1ms();
0096 DFEF RCALL _delay_1ms
0097 5F4F SUBI R20,0xFF
0098 4F5F SBCI R21,0xFF
0099 1746 CP R20,R22
009A 0757 CPC R21,R23
009B F3D0 BCS 0x0096
009C 940E025B CALL pop_gset2
009E 9508 RET
FILE: D:\mojinpan\485\485_slave2\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:
009F B384 IN R24,0x14
00A0 608F ORI R24,0xF
00A1 BB84 OUT 0x14,R24
(0046) LCD_EN_DDR|=LCD_EN; //设置EN方向为输出
00A2 9AA5 SBI 0x14,5
(0047) LCD_RS_DDR|=LCD_RS; //设置RS方向为输出
00A3 9AA4 SBI 0x14,4
(0048) LCD_write_command(0x28);
00A4 E208 LDI R16,0x28
00A5 D014 RCALL _LCD_write_command
(0049) LCD_en_write();
00A6 D00D RCALL _LCD_en_write
(0050) delay_nus(40);
00A7 E208 LDI R16,0x28
00A8 E010 LDI R17,0
00A9 DFCD RCALL _delay_nus
(0051) LCD_write_command(0x28); //4位显示
00AA E208 LDI R16,0x28
00AB D00E RCALL _LCD_write_command
(0052) LCD_write_command(0x0c); //显示开
00AC E00C LDI R16,0xC
00AD D00C RCALL _LCD_write_command
(0053) LCD_write_command(0x01); //清屏
00AE E001 LDI R16,1
00AF D00A RCALL _LCD_write_command
(0054) delay_nms(2);
00B0 E002 LDI R16,2
00B1 E010 LDI R17,0
00B2 DFDD RCALL _delay_nms
00B3 9508 RET
(0055)
(0056)
(0057)
(0058) }
(0059)
(0060) void LCD_en_write(void) //液晶使能
(0061) {
(0062) LCD_EN_PORT|=LCD_EN;
_LCD_en_write:
00B4 9AAD SBI 0x15,5
(0063) delay_nus(1);
00B5 E001 LDI R16,1
00B6 E010 LDI R17,0
00B7 DFBF RCALL _delay_nus
(0064) LCD_EN_PORT&=~LCD_EN;
00B8 98AD CBI 0x15,5
00B9 9508 RET
_LCD_write_command:
command --> R20
00BA 940E0269 CALL push_gset1
00BC 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);
00BD E100 LDI R16,0x10
00BE E010 LDI R17,0
00BF DFB7 RCALL _delay_nus
(0083) LCD_RS_PORT&=~LCD_RS; //RS=0
00C0 98AC CBI 0x15,4
(0084) LCD_DATA_PORT&=0xf0; //清高四位
00C1 B385 IN R24,0x15
00C2 7F80 ANDI R24,0xF0
00C3 BB85 OUT 0x15,R24
(0085) LCD_DATA_PORT|=(command>>4)&0x0f; //写高四位
00C4 2F84 MOV R24,R20
00C5 9582 SWAP R24
00C6 708F ANDI R24,0xF
00C7 708F ANDI R24,0xF
00C8 B225 IN R2,0x15
00C9 2A28 OR R2,R24
00CA BA25 OUT 0x15,R2
(0086) LCD_en_write();
00CB DFE8 RCALL _LCD_en_write
(0087) LCD_DATA_PORT&=0xf0; //清高四位
00CC B385 IN R24,0x15
00CD 7F80 ANDI R24,0xF0
00CE BB85 OUT 0x15,R24
(0088) LCD_DATA_PORT|=command&0x0f; //写低四位
00CF 2F84 MOV R24,R20
00D0 708F ANDI R24,0xF
00D1 B225 IN R2,0x15
00D2 2A28 OR R2,R24
00D3 BA25 OUT 0x15,R2
(0089) LCD_en_write();
00D4 DFDF RCALL _LCD_en_write
00D5 940E026C CALL pop_gset1
00D7 9508 RET
_LCD_write_data:
data --> R20
00D8 940E0269 CALL push_gset1
00DA 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);
00DB E100 LDI R16,0x10
00DC E010 LDI R17,0
00DD DF99 RCALL _delay_nus
(0110) LCD_RS_PORT|=LCD_RS; //RS=1
00DE 9AAC SBI 0x15,4
(0111) LCD_DATA_PORT&=0Xf0; //清高四位
00DF B385 IN R24,0x15
00E0 7F80 ANDI R24,0xF0
00E1 BB85 OUT 0x15,R24
(0112) LCD_DATA_PORT|=(data>>4)&0x0f; //写高四位
00E2 2F84 MOV R24,R20
00E3 9582 SWAP R24
00E4 708F ANDI R24,0xF
00E5 708F ANDI R24,0xF
00E6 B225 IN R2,0x15
00E7 2A28 OR R2,R24
00E8 BA25 OUT 0x15,R2
(0113) LCD_en_write();
00E9 DFCA RCALL _LCD_en_write
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -