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

📄 lcd_c.lst

📁 LCD1602的AVR驱动
💻 LST
字号:
__start:
__text_start:
      2E E5CF      LDI	R28,0x5F
      2F E0D4      LDI	R29,4
      30 BFCD      OUT	0x3D,R28
      31 BFDE      OUT	0x3E,R29
      32 51C0      SUBI	R28,0x10
      33 40D0      SBCI	R29,0
      34 EA0A      LDI	R16,0xAA
      35 8308      STD	Y+0,R16
      36 2400      CLR	R0
      37 E6E8      LDI	R30,0x68
      38 E0F0      LDI	R31,0
      39 E010      LDI	R17,0
      3A 36E8      CPI	R30,0x68
      3B 07F1      CPC	R31,R17
      3C F011      BEQ	0x003F
      3D 9201      ST	R0,Z+
      3E CFFB      RJMP	0x003A
      3F 8300      STD	Z+0,R16
      40 E5E4      LDI	R30,0x54
      41 E0F0      LDI	R31,0
      42 E6A0      LDI	R26,0x60
      43 E0B0      LDI	R27,0
      44 E010      LDI	R17,0
      45 E000      LDI	R16,0
      46 BF0B      OUT	0x3B,R16
      47 35EC      CPI	R30,0x5C
      48 07F1      CPC	R31,R17
      49 F021      BEQ	0x004E
      4A 95C8      LPM
      4B 9631      ADIW	R30,1
      4C 920D      ST	R0,X+
      4D CFF9      RJMP	0x0047
      4E 940E 0082 CALL	_main
_exit:
      50 CFFF      RJMP	_exit
FILE: G:\文档\LCD1602_C\delay.c
(0001) /*-----------------------------------------------------------------------
(0002) 延时函数
(0003) 编译器:ICC-AVR v6.31A 日期: 2005-11-24 20:29:57
(0004) 目标芯片 : M16
(0005) 时钟: 8.0000Mhz
(0006) 作者:archeng504
(0007) -----------------------------------------------------------------------*/
(0008) 
(0009) void delay_1us(void)                 //1us延时函数
(0010)   {
(0011)    asm("nop");
_delay_1us:
      51 0000      NOP
      52 9508      RET
_delay_nus:
  i                    --> R20
  n                    --> R10
      53 940E 0121 CALL	push_xgset300C
      55 0158      MOVW	R10,R16
(0012)   }
(0013) 
(0014) void delay_nus(unsigned int n)       //N us延时函数
(0015)   {
(0016)    unsigned int i=0;
      56 2744      CLR	R20
      57 2755      CLR	R21
(0017)    for (i=0;i<n;i++)
      58 C003      RJMP	0x005C
(0018)    delay_1us();
      59 DFF7      RCALL	_delay_1us
      5A 5F4F      SUBI	R20,0xFF
      5B 4F5F      SBCI	R21,0xFF
      5C 154A      CP	R20,R10
      5D 055B      CPC	R21,R11
      5E F3D0      BCS	0x0059
      5F 940C 0126 JMP	pop_xgset300C
(0019)   }
(0020)   
(0021) void delay_1ms(void)                 //1ms延时函数
(0022)   {
(0023)    unsigned int i;
(0024)    for (i=0;i<1140;i++);
_delay_1ms:
  i                    --> R16
      61 2700      CLR	R16
      62 2711      CLR	R17
      63 C002      RJMP	0x0066
      64 5F0F      SUBI	R16,0xFF
      65 4F1F      SBCI	R17,0xFF
      66 3704      CPI	R16,0x74
      67 E0E4      LDI	R30,4
      68 071E      CPC	R17,R30
      69 F3D0      BCS	0x0064
      6A 9508      RET
_delay_nms:
  i                    --> R20
  n                    --> R10
      6B 940E 0121 CALL	push_xgset300C
      6D 0158      MOVW	R10,R16
(0025)   }
(0026)   
(0027) void delay_nms(unsigned int n)       //N ms延时函数
(0028)   {
(0029)    unsigned int i=0;
      6E 2744      CLR	R20
      6F 2755      CLR	R21
(0030)    for (i=0;i<n;i++)
      70 C003      RJMP	0x0074
(0031)    delay_1ms();
      71 DFEF      RCALL	_delay_1ms
      72 5F4F      SUBI	R20,0xFF
      73 4F5F      SBCI	R21,0xFF
      74 154A      CP	R20,R10
      75 055B      CPC	R21,R11
      76 F3D0      BCS	0x0071
      77 940C 0126 JMP	pop_xgset300C
FILE: G:\文档\LCD1602_C\lcd_c.c
(0001) /*----------------------------------------------------
(0002) 主函数
(0003) 编译器:ICC-AVR v6.31A 日期: 2005-11-24 20:29:57
(0004) 目标芯片 : M16
(0005) 时钟: 8.0000Mhz
(0006) 作者:archeng504
(0007) ---------------------------------------------------*/
(0008) 
(0009) #include "LCD.h"
(0010) 
(0011) 
(0012) void init_devices(void)
(0013) {
(0014)   CLI(); //disable all interrupts
_init_devices:
      79 94F8      BCLR	7
(0015)   LCD_init();
      7A 940E 0095 CALL	_LCD_init
(0016)   MCUCR = 0x00;
      7C 2422      CLR	R2
      7D BE25      OUT	0x35,R2
(0017)   GICR  = 0x00;
      7E BE2B      OUT	0x3B,R2
(0018)   TIMSK = 0x00; //timer interrupt sources
      7F BE29      OUT	0x39,R2
(0019)   SEI(); //re-enable interrupts
      80 9478      BSET	7
      81 9508      RET
_main:
      82 9722      SBIW	R28,2
(0020) }
(0021) 
(0022) void main(void)
(0023) {
(0024)    init_devices();
      83 DFF5      RCALL	_init_devices
(0025)    for(;;)
(0026)    {
(0027)    LCD_write_string(0,0,"archeng");
      84 E680      LDI	R24,0x60
      85 E090      LDI	R25,0
      86 8399      STD	Y+1,R25
      87 8388      STD	Y+0,R24
      88 2722      CLR	R18
      89 2700      CLR	R16
      8A 940E 0100 CALL	_LCD_write_string
(0028)    LCD_write_char(1,0,'1234');   
      8C E381      LDI	R24,0x31
      8D 8388      STD	Y+0,R24
      8E 2722      CLR	R18
      8F E001      LDI	R16,1
      90 940E 0115 CALL	_LCD_write_char
      92 CFF1      RJMP	0x0084
      93 9622      ADIW	R28,2
      94 9508      RET
FILE: G:\文档\LCD1602_C\LCD_init.c
(0001) /*----------------------------------------------------
(0002) 液晶LCD1602C  使用4条数据线(D4~D7)
(0003) 编译器:ICC-AVR v6.31A 日期: 2005-11-24 20:29:57
(0004) 目标芯片 : M16
(0005) 时钟: 8.0000Mhz
(0006) 作者:archeng504
(0007) ---------------------------------------------------*/
(0008) #include "LCD.h"
(0009) 
(0010) void LCD_init(void)         //液晶初始化
(0011) {
(0012)   LCD_DATA_DDR|=LCD_DATA;   //数据口方向为输出
_LCD_init:
      95 B38A      IN	R24,0x1A
      96 6F80      ORI	R24,0xF0
      97 BB8A      OUT	0x1A,R24
(0013)   LCD_EN_DDR|=LCD_EN;       //设置EN方向为输出
      98 9AD3      SBI	0x1A,3
(0014)   LCD_RS_DDR|=LCD_RS;       //设置RS方向为输出
      99 9AD2      SBI	0x1A,2
(0015)   LCD_write_command(0x28); 
      9A E208      LDI	R16,0x28
      9B D017      RCALL	_LCD_write_command
(0016)   LCD_en_write();
      9C D00F      RCALL	_LCD_en_write
(0017)   delay_nus(40);
      9D E208      LDI	R16,0x28
      9E E010      LDI	R17,0
      9F 940E 0053 CALL	_delay_nus
(0018)   LCD_write_command(0x28);  //4位显示
      A1 E208      LDI	R16,0x28
      A2 D010      RCALL	_LCD_write_command
(0019)   LCD_write_command(0x0c);  //显示开
      A3 E00C      LDI	R16,0xC
      A4 D00E      RCALL	_LCD_write_command
(0020)   LCD_write_command(0x01);  //清屏
      A5 E001      LDI	R16,1
      A6 D00C      RCALL	_LCD_write_command
(0021)   delay_nms(2);
      A7 E002      LDI	R16,2
      A8 E010      LDI	R17,0
      A9 940E 006B CALL	_delay_nms
      AB 9508      RET
(0022) }
(0023) 
(0024) void LCD_en_write(void)  //液晶使能
(0025) {
(0026)   LCD_EN_PORT|=LCD_EN;
_LCD_en_write:
      AC 9ADB      SBI	0x1B,3
(0027)   delay_nus(1);
      AD E001      LDI	R16,1
      AE E010      LDI	R17,0
      AF 940E 0053 CALL	_delay_nus
(0028)   LCD_EN_PORT&=~LCD_EN;
      B1 98DB      CBI	0x1B,3
      B2 9508      RET
_LCD_write_command:
  command              --> R20
      B3 934A      ST	R20,-Y
      B4 2F40      MOV	R20,R16
(0029) }
(0030) 
(0031) void LCD_write_command(unsigned char command) //写指令
(0032) {
(0033)   delay_nus(16);
      B5 E100      LDI	R16,0x10
      B6 E010      LDI	R17,0
      B7 940E 0053 CALL	_delay_nus
(0034)   LCD_RS_PORT&=~LCD_RS;        //RS=0
      B9 98DA      CBI	0x1B,2
(0035)   LCD_DATA_PORT&=0X0f;         //清高四位
      BA B38B      IN	R24,0x1B
      BB 708F      ANDI	R24,0xF
      BC BB8B      OUT	0x1B,R24
(0036)   LCD_DATA_PORT|=command&0xf0; //写高四位
      BD 2F84      MOV	R24,R20
      BE 7F80      ANDI	R24,0xF0
      BF B22B      IN	R2,0x1B
      C0 2A28      OR	R2,R24
      C1 BA2B      OUT	0x1B,R2
(0037)   LCD_en_write();
      C2 DFE9      RCALL	_LCD_en_write
(0038)   command=command<<4;          //低四位移到高四位
      C3 2F84      MOV	R24,R20
      C4 708F      ANDI	R24,0xF
      C5 9582      SWAP	R24
      C6 2F48      MOV	R20,R24
(0039)   LCD_DATA_PORT&=0x0f;         //清高四位
      C7 B38B      IN	R24,0x1B
      C8 708F      ANDI	R24,0xF
      C9 BB8B      OUT	0x1B,R24
(0040)   LCD_DATA_PORT|=command&0xf0; //写低四位
      CA 2F84      MOV	R24,R20
      CB 7F80      ANDI	R24,0xF0
      CC B22B      IN	R2,0x1B
      CD 2A28      OR	R2,R24
      CE BA2B      OUT	0x1B,R2
(0041)   LCD_en_write();
      CF DFDC      RCALL	_LCD_en_write
      D0 9149      LD	R20,Y+
      D1 9508      RET
_LCD_write_data:
  data                 --> R20
      D2 934A      ST	R20,-Y
      D3 2F40      MOV	R20,R16
(0042)   
(0043) }
(0044) 
(0045) void LCD_write_data(unsigned char data) //写数据
(0046) {
(0047)   delay_nus(16);
      D4 E100      LDI	R16,0x10
      D5 E010      LDI	R17,0
      D6 940E 0053 CALL	_delay_nus
(0048)   LCD_RS_PORT|=LCD_RS;       //RS=1
      D8 9ADA      SBI	0x1B,2
(0049)   LCD_DATA_PORT&=0X0f;       //清高四位
      D9 B38B      IN	R24,0x1B
      DA 708F      ANDI	R24,0xF
      DB BB8B      OUT	0x1B,R24
(0050)   LCD_DATA_PORT|=data&0xf0;  //写高四位
      DC 2F84      MOV	R24,R20
      DD 7F80      ANDI	R24,0xF0
      DE B22B      IN	R2,0x1B
      DF 2A28      OR	R2,R24
      E0 BA2B      OUT	0x1B,R2
(0051)   LCD_en_write();
      E1 DFCA      RCALL	_LCD_en_write
(0052)   data=data<<4;               //低四位移到高四位
      E2 2F84      MOV	R24,R20
      E3 708F      ANDI	R24,0xF
      E4 9582      SWAP	R24
      E5 2F48      MOV	R20,R24
(0053)   LCD_DATA_PORT&=0X0f;        //清高四位
      E6 B38B      IN	R24,0x1B
      E7 708F      ANDI	R24,0xF
      E8 BB8B      OUT	0x1B,R24
(0054)   LCD_DATA_PORT|=data&0xf0;   //写低四位
      E9 2F84      MOV	R24,R20
      EA 7F80      ANDI	R24,0xF0
      EB B22B      IN	R2,0x1B
      EC 2A28      OR	R2,R24
      ED BA2B      OUT	0x1B,R2
(0055)   LCD_en_write();
      EE DFBD      RCALL	_LCD_en_write
      EF 9149      LD	R20,Y+
      F0 9508      RET
_LCD_set_xy:
  address              --> R20
  y                    --> R10
  x                    --> R22
      F1 940E 012B CALL	push_xgsetF00C
      F3 2EA2      MOV	R10,R18
      F4 2F60      MOV	R22,R16
(0056) }
(0057) 
(0058) 
(0059) void LCD_set_xy( unsigned char x, unsigned char y )  //写地址函数
(0060) {
(0061)     unsigned char address;
(0062)     if (y == 0) address = 0x80 + x;
      F5 20AA      TST	R10
      F6 F419      BNE	0x00FA
      F7 2F46      MOV	R20,R22
      F8 5840      SUBI	R20,0x80
      F9 C002      RJMP	0x00FC
(0063)     else   address = 0xc0 + x;
      FA 2F46      MOV	R20,R22
      FB 5440      SUBI	R20,0x40
(0064)     LCD_write_command( address);
      FC 2F04      MOV	R16,R20
      FD DFB5      RCALL	_LCD_write_command
      FE 940C 0132 JMP	pop_xgsetF00C
_LCD_write_string:
  s                    --> R20
  Y                    --> R12
  X                    --> R10
     100 940E 0139 CALL	push_xgset303C
     102 2EC2      MOV	R12,R18
     103 2EA0      MOV	R10,R16
     104 814E      LDD	R20,Y+6
     105 815F      LDD	R21,Y+7
(0065) }
(0066)   
(0067) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) //列x=0~15,行y=0,1
(0068) {
(0069)     LCD_set_xy( X, Y ); //写地址    
     106 2D2C      MOV	R18,R12
     107 2D0A      MOV	R16,R10
     108 DFE8      RCALL	_LCD_set_xy
     109 C005      RJMP	0x010F
(0070)     while (*s)  // 写显示字符
(0071)     {
(0072)       LCD_write_data( *s );
     10A 01FA      MOVW	R30,R20
     10B 8100      LDD	R16,Z+0
     10C DFC5      RCALL	_LCD_write_data
(0073)       s ++;
     10D 5F4F      SUBI	R20,0xFF
     10E 4F5F      SBCI	R21,0xFF
     10F 01FA      MOVW	R30,R20
     110 8020      LDD	R2,Z+0
     111 2022      TST	R2
     112 F7B9      BNE	0x010A
     113 940C 0140 JMP	pop_xgset303C
_LCD_write_char:
  data                 --> Y,+2
  Y                    --> R12
  X                    --> R10
     115 92AA      ST	R10,-Y
     116 92CA      ST	R12,-Y
     117 2EC2      MOV	R12,R18
     118 2EA0      MOV	R10,R16
(0074)     }
(0075)       
(0076) }
(0077) 
(0078) void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data) //列x=0~15,行y=0,1
(0079) {
(0080)   LCD_set_xy( X, Y ); //写地址
     119 2D2C      MOV	R18,R12
     11A 2D0A      MOV	R16,R10
     11B DFD5      RCALL	_LCD_set_xy
(0081)   LCD_write_data( data);
FILE: <library>
     11C 810A      LDD	R16,Y+2
     11D DFB4      RCALL	_LCD_write_data
     11E 90C9      LD	R12,Y+
     11F 90A9      LD	R10,Y+
     120 9508      RET
push_xgset300C:
     121 935A      ST	R21,-Y
     122 934A      ST	R20,-Y
     123 92BA      ST	R11,-Y
     124 92AA      ST	R10,-Y
     125 9508      RET
pop_xgset300C:
     126 90A9      LD	R10,Y+
     127 90B9      LD	R11,Y+
     128 9149      LD	R20,Y+
     129 9159      LD	R21,Y+
     12A 9508      RET
push_xgsetF00C:
     12B 937A      ST	R23,-Y
     12C 936A      ST	R22,-Y
     12D 935A      ST	R21,-Y
     12E 934A      ST	R20,-Y
     12F 92BA      ST	R11,-Y
     130 92AA      ST	R10,-Y
     131 9508      RET
pop_xgsetF00C:
     132 90A9      LD	R10,Y+
     133 90B9      LD	R11,Y+
     134 9149      LD	R20,Y+
     135 9159      LD	R21,Y+
     136 9169      LD	R22,Y+
     137 9179      LD	R23,Y+
     138 9508      RET
push_xgset303C:
     139 935A      ST	R21,-Y
     13A 934A      ST	R20,-Y
     13B 92DA      ST	R13,-Y
     13C 92CA      ST	R12,-Y
     13D 92BA      ST	R11,-Y
     13E 92AA      ST	R10,-Y
     13F 9508      RET
pop_xgset303C:
     140 90A9      LD	R10,Y+
     141 90B9      LD	R11,Y+
     142 90C9      LD	R12,Y+
     143 90D9      LD	R13,Y+
     144 9149      LD	R20,Y+
     145 9159      LD	R21,Y+
     146 9508      RET

⌨️ 快捷键说明

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