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

📄 485.lst

📁 485多机通讯
💻 LST
📖 第 1 页 / 共 3 页
字号:
__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 + -