⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rs485.lst

📁 本文提出了基于MCU和RS485总线的嵌入式系统的常用设计方法
💻 LST
📖 第 1 页 / 共 3 页
字号:
__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 + -