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

📄 mater.lst

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