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

📄 1602六线接法练习.lst

📁 iccavr下
💻 LST
📖 第 1 页 / 共 2 页
字号:
__text_start:
__start:
    004A E5CF      LDI	R28,0x5F
    004B E0D4      LDI	R29,4
    004C BFCD      OUT	0x3D,R28
    004D BFDE      OUT	0x3E,R29
    004E 51C0      SUBI	R28,0x10
    004F 40D0      SBCI	R29,0
    0050 EA0A      LDI	R16,0xAA
    0051 8308      STD	Y+0,R16
    0052 2400      CLR	R0
    0053 E9EF      LDI	R30,0x9F
    0054 E0F0      LDI	R31,0
    0055 E010      LDI	R17,0
    0056 39EF      CPI	R30,0x9F
    0057 07F1      CPC	R31,R17
    0058 F011      BEQ	0x005B
    0059 9201      ST	R0,Z+
    005A CFFB      RJMP	0x0056
    005B 8300      STD	Z+0,R16
    005C E5E4      LDI	R30,0x54
    005D E0F0      LDI	R31,0
    005E E6A0      LDI	R26,0x60
    005F E0B0      LDI	R27,0
    0060 E010      LDI	R17,0
    0061 39E3      CPI	R30,0x93
    0062 07F1      CPC	R31,R17
    0063 F021      BEQ	0x0068
    0064 95C8      LPM
    0065 9631      ADIW	R30,1
    0066 920D      ST	R0,X+
    0067 CFF9      RJMP	0x0061
    0068 940E0131  CALL	_main
_exit:
    006A CFFF      RJMP	_exit
FILE: D:\M16开发板实验教程\icc-avr\lcd1602test\1602.h
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #define LCD_EN_PORT    PORTA
(0004) #define LCD_EN_DDR     DDRA
(0005) #define LCD_RS_PORT    PORTA
(0006) #define LCD_RS_DDR     DDRA
(0007) #define LCD_DATA_PORT  PORTA
(0008) #define LCD_DATA_DDR   DDRA
(0009) #define LCD_DATA_PIN   PINA
(0010) #define LCD_EN         0x08   //porta3        out
(0011) #define LCD_RS         0x04   //porta2       out
(0012) #define LCD_DATA       0xf0   //porta4/5/6/7   out
(0013) 
(0014) /*--------------------------------------------------------------------------------------------------
(0015) Public function prototypes
(0016) --------------------------------------------------------------------------------------------------*/
(0017) void LCD_init         (void);
(0018) void LCD_en_write     (void);
(0019) void clear(void);
(0020) void LCD_write_char   (unsigned command,unsigned data);
(0021) void LCD_set_xy       (unsigned char x, unsigned char y);
(0022) void LCD_write_string (unsigned char X,unsigned char Y,unsigned char *s);
(0023) extern delay_nus        (unsigned int n);
(0024) extern delay_nms        (unsigned int n);
(0025) 
(0026) /*------------------------------------------------------------
(0027) function: initial the related port of 1602, set the work mode of 1602
(0028) -------------------------------------------------------------*/
(0029) void LCD_init(void)       //液晶初始化
(0030) {
(0031)  LCD_DATA_DDR|=LCD_DATA;
_LCD_init:
    006B B38A      IN	R24,0x1A
    006C 6F80      ORI	R24,0xF0
    006D BB8A      OUT	0x1A,R24
(0032)  LCD_EN_DDR|=LCD_EN;
    006E 9AD3      SBI	0x1A,3
(0033)  LCD_RS_DDR|=LCD_RS;
    006F 9AD2      SBI	0x1A,2
(0034)  delay_nms(15);
    0070 E00F      LDI	R16,0xF
    0071 E010      LDI	R17,0
    0072 940E0180  CALL	_delay_nms
(0035)  LCD_write_char(0x28,0);  //4位显示
    0074 2722      CLR	R18
    0075 2733      CLR	R19
    0076 E208      LDI	R16,0x28
    0077 E010      LDI	R17,0
    0078 D046      RCALL	_LCD_write_char
(0036)  delay_nms(15);
    0079 E00F      LDI	R16,0xF
    007A E010      LDI	R17,0
    007B 940E0180  CALL	_delay_nms
(0037)  LCD_write_char(0x0c,0);  //显示开
    007D 2722      CLR	R18
    007E 2733      CLR	R19
    007F E00C      LDI	R16,0xC
    0080 E010      LDI	R17,0
    0081 D03D      RCALL	_LCD_write_char
(0038)  delay_nms(15);
    0082 E00F      LDI	R16,0xF
    0083 E010      LDI	R17,0
    0084 940E0180  CALL	_delay_nms
(0039)  LCD_write_char(0x01,0);  //清屏
    0086 2722      CLR	R18
    0087 2733      CLR	R19
    0088 E001      LDI	R16,1
    0089 E010      LDI	R17,0
    008A D034      RCALL	_LCD_write_char
    008B 9508      RET
_LCD_write_string:
  s                    --> R20
  Y                    --> R10
  X                    --> R22
    008C 940E019C  CALL	push_gset3
    008E 2EA2      MOV	R10,R18
    008F 2F60      MOV	R22,R16
    0090 814E      LDD	R20,Y+6
    0091 815F      LDD	R21,Y+7
(0040) }
(0041) 
(0042) /*--------------------------------------------------------------------
(0043) fuction: write string to lcd1602
(0044) para:   x--the address of a line
(0045)         y--the display line
(0046) 		s--a pointer to a string
(0047) *--------------------------------------------------------------------*/
(0048) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
(0049)   {
(0050)     LCD_set_xy( X, Y ); //写地址
    0092 2D2A      MOV	R18,R10
    0093 2F06      MOV	R16,R22
    0094 D010      RCALL	_LCD_set_xy
    0095 C008      RJMP	0x009E
(0051)     
(0052)     while (*s)  // 写显示字符
(0053)       {
(0054)         LCD_write_char( 0, *s );
    0096 01FA      MOVW	R30,R20
    0097 8120      LDD	R18,Z+0
    0098 2733      CLR	R19
    0099 2700      CLR	R16
    009A 2711      CLR	R17
    009B D023      RCALL	_LCD_write_char
(0055) 	    s ++;
    009C 5F4F      SUBI	R20,0xFF
    009D 4F5F      SBCI	R21,0xFF
    009E 01FA      MOVW	R30,R20
    009F 8020      LDD	R2,Z+0
    00A0 2022      TST	R2
    00A1 F7A1      BNE	0x0096
    00A2 940E0192  CALL	pop_gset3
    00A4 9508      RET
_LCD_set_xy:
  address              --> R20
  y                    --> R20
  x                    --> R22
    00A5 940E019E  CALL	push_gset2
    00A7 2F42      MOV	R20,R18
    00A8 2F60      MOV	R22,R16
(0056)       }
(0057)   }
(0058)  /*------------------------------------------------------------
(0059)  function: set the display address
(0060)  para: x---the display address of a line   limit: 0---15
(0061)        y---the display line   limit 0 or 1 
(0062)  --------------------------------------------------------------*/
(0063)  
(0064)  void LCD_set_xy( unsigned char x, unsigned char y )  //写地址函数
(0065)   {
(0066)     unsigned char address;
(0067)     if (y == 0) address = 0x80 + x;                  //the first line
    00A9 2344      TST	R20
    00AA F419      BNE	0x00AE
    00AB 2F46      MOV	R20,R22
    00AC 5840      SUBI	R20,0x80
    00AD C002      RJMP	0x00B0
(0068)     else 
(0069)        address = 0xc0 + x;                           //the second line
    00AE 2F46      MOV	R20,R22
    00AF 5440      SUBI	R20,0x40
(0070)     LCD_write_char( address, 0 );
    00B0 2722      CLR	R18
    00B1 2733      CLR	R19
    00B2 2F04      MOV	R16,R20
    00B3 2711      CLR	R17
    00B4 D00A      RCALL	_LCD_write_char
    00B5 940E018F  CALL	pop_gset2
    00B7 9508      RET
(0071)   }
(0072) /*-------------------------------------------------------------
(0073) function : enable or disable the rs line of the lcd1602
(0074) *--------------------------------------------------------------*/
(0075) void LCD_en_write(void)  //液晶使能
(0076) { 
(0077)   LCD_EN_PORT|=LCD_EN;
_LCD_en_write:
    00B8 9ADB      SBI	0x1B,3
(0078)   delay_nus(5);
    00B9 E005      LDI	R16,5
    00BA E010      LDI	R17,0
    00BB 940E0167  CALL	_delay_nus
(0079)   LCD_EN_PORT&=~LCD_EN;
    00BD 98DB      CBI	0x1B,3
    00BE 9508      RET
_LCD_write_char:
  data_temp            --> R22
  command_temp         --> R20
  data                 --> R12
  command              --> R10
    00BF 940E019A  CALL	push_gset4
    00C1 0169      MOVW	R12,R18
    00C2 0158      MOVW	R10,R16
(0080) }
(0081) /*------------------------------------------------------------
(0082) function: write command or data to lcd1602
(0083) prar:
(0084)        command:  0---write data, 1-----write command
(0085) 	   data: commad or data which you want to write
(0086) *-------------------------------------------------------------*/
(0087) void LCD_write_char(unsigned command,unsigned data) 
(0088) {
(0089)  unsigned command_temp,data_temp;
(0090)  command_temp=command;
    00C3 01A5      MOVW	R20,R10
(0091)  data_temp=data;
    00C4 01B6      MOVW	R22,R12
(0092)  delay_nus(25);
    00C5 E109      LDI	R16,0x19
    00C6 E010      LDI	R17,0
    00C7 940E0167  CALL	_delay_nus
(0093)  if(command==0)
    00C9 3040      CPI	R20,0
    00CA 0745      CPC	R20,R21
    00CB F511      BNE	0x00EE
(0094)  {
(0095)   LCD_RS_PORT|=LCD_RS;  //RS=1
    00CC 9ADA      SBI	0x1B,2
(0096)   LCD_DATA_PORT&=0X0f;
    00CD B38B      IN	R24,0x1B
    00CE 708F      ANDI	R24,0xF
    00CF BB8B      OUT	0x1B,R24
(0097)   LCD_DATA_PORT|=data_temp&0xf0;  //写高四位
    00D0 01CB      MOVW	R24,R22
    00D1 7F80      ANDI	R24,0xF0
    00D2 7090      ANDI	R25,0
    00D3 B22B      IN	R2,0x1B
    00D4 2433      CLR	R3
    00D5 2A28      OR	R2,R24
    00D6 2A39      OR	R3,R25
    00D7 BA2B      OUT	0x1B,R2
(0098)   LCD_en_write();
    00D8 DFDF      RCALL	_LCD_en_write
(0099)   data_temp=data_temp<<4;  
    00D9 0F66      LSL	R22
    00DA 1F77      ROL	R23
    00DB 0F66      LSL	R22
    00DC 1F77      ROL	R23
    00DD 0F66      LSL	R22
    00DE 1F77      ROL	R23
    00DF 0F66      LSL	R22
    00E0 1F77      ROL	R23
(0100)   LCD_DATA_PORT&=0X0f;
    00E1 B38B      IN	R24,0x1B
    00E2 708F      ANDI	R24,0xF
    00E3 BB8B      OUT	0x1B,R24
(0101)   LCD_DATA_PORT|=data_temp&0xf0;   //写低四位
    00E4 01CB      MOVW	R24,R22
    00E5 7F80      ANDI	R24,0xF0
    00E6 7090      ANDI	R25,0
    00E7 B22B      IN	R2,0x1B
    00E8 2433      CLR	R3
    00E9 2A28      OR	R2,R24
    00EA 2A39      OR	R3,R25
    00EB BA2B      OUT	0x1B,R2
(0102)   LCD_en_write();
    00EC DFCB      RCALL	_LCD_en_write
(0103)  }
    00ED C021      RJMP	0x010F
(0104)  else
(0105)  {
(0106)   LCD_RS_PORT&=~LCD_RS;   //RS=0
    00EE 98DA      CBI	0x1B,2
(0107)   LCD_DATA_PORT&=0X0f;
    00EF B38B      IN	R24,0x1B
    00F0 708F      ANDI	R24,0xF

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -