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

📄 485.lst

📁 AVR单片机的485通信参考程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
__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 + -