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

📄 lcd_init.lis

📁 1602液晶显示模块
💻 LIS
字号:
                        .module LCD_init.c
                        .area text(rom, con, rel)
 0000                   .dbfile E:\biyesheji\NEWDES~1\1602\LCD1602_C\LCD_init.c
 0000                   .dbfunc e LCD_init _LCD_init fV
                        .even
 0000           _LCD_init::
 0000                   .dbline -1
 0000                   .dbline 10
 0000           ; /*----------------------------------------------------
 0000           ; 液晶LCD1602C  使用4条数据线(D4~D7)
 0000           ; 编译器:ICC-AVR v6.31A 日期: 2005-11-24 20:29:57
 0000           ; 目标芯片 : M8
 0000           ; 时钟: 8.0000Mhz
 0000           ; ---------------------------------------------------*/
 0000           ; #include "LCD.h"
 0000           ; 
 0000           ; void LCD_init(void)         //液晶初始化
 0000           ; {
 0000                   .dbline 11
 0000           ;   LCD_DATA_DDR|=LCD_DATA;   //数据口方向为输出
 0000 87B3              in R24,0x17
 0002 806F              ori R24,240
 0004 87BB              out 0x17,R24
 0006                   .dbline 12
 0006           ;   LCD_EN_DDR|=LCD_EN;       //设置EN方向为输出
 0006 BB9A              sbi 0x17,3
 0008                   .dbline 13
 0008           ;   LCD_RS_DDR|=LCD_RS;       //设置RS方向为输出
 0008 BA9A              sbi 0x17,2
 000A                   .dbline 14
 000A           ;   LCD_write_command(0x28); 
 000A 08E2              ldi R16,40
 000C 14D0              rcall _LCD_write_command
 000E                   .dbline 15
 000E           ;   LCD_en_write();
 000E 0DD0              rcall _LCD_en_write
 0010                   .dbline 16
 0010           ;   delay_nus(40);
 0010 08E2              ldi R16,40
 0012 10E0              ldi R17,0
 0014 00D0              rcall _delay_nus
 0016                   .dbline 17
 0016           ;   LCD_write_command(0x28);  //4位显示
 0016 08E2              ldi R16,40
 0018 0ED0              rcall _LCD_write_command
 001A                   .dbline 18
 001A           ;   LCD_write_command(0x0c);  //显示开
 001A 0CE0              ldi R16,12
 001C 0CD0              rcall _LCD_write_command
 001E                   .dbline 19
 001E           ;   LCD_write_command(0x01);  //清屏
 001E 01E0              ldi R16,1
 0020 0AD0              rcall _LCD_write_command
 0022                   .dbline 20
 0022           ;   delay_nms(2);
 0022 02E0              ldi R16,2
 0024 10E0              ldi R17,0
 0026 00D0              rcall _delay_nms
 0028                   .dbline -2
 0028           L1:
 0028                   .dbline 0 ; func end
 0028 0895              ret
 002A                   .dbend
 002A                   .dbfunc e LCD_en_write _LCD_en_write fV
                        .even
 002A           _LCD_en_write::
 002A                   .dbline -1
 002A                   .dbline 24
 002A           ; }
 002A           ; 
 002A           ; void LCD_en_write(void)  //液晶使能
 002A           ; {
 002A                   .dbline 25
 002A           ;   LCD_EN_PORT|=LCD_EN;
 002A C39A              sbi 0x18,3
 002C                   .dbline 26
 002C           ;   delay_nus(1);
 002C 01E0              ldi R16,1
 002E 10E0              ldi R17,0
 0030 00D0              rcall _delay_nus
 0032                   .dbline 27
 0032           ;   LCD_EN_PORT&=~LCD_EN;
 0032 C398              cbi 0x18,3
 0034                   .dbline -2
 0034           L2:
 0034                   .dbline 0 ; func end
 0034 0895              ret
 0036                   .dbend
 0036                   .dbfunc e LCD_write_command _LCD_write_command fV
 0036           ;        command -> R20
                        .even
 0036           _LCD_write_command::
 0036 00D0              rcall push_gset1
 0038 402F              mov R20,R16
 003A                   .dbline -1
 003A                   .dbline 31
 003A           ; }
 003A           ; 
 003A           ; void LCD_write_command(unsigned char command) //写指令
 003A           ; {
 003A                   .dbline 32
 003A           ;   delay_nus(16);
 003A 00E1              ldi R16,16
 003C 10E0              ldi R17,0
 003E 00D0              rcall _delay_nus
 0040                   .dbline 33
 0040           ;   LCD_RS_PORT&=~LCD_RS;        //RS=0
 0040 C298              cbi 0x18,2
 0042                   .dbline 34
 0042           ;   LCD_DATA_PORT&=0X0f;         //清高四位
 0042 88B3              in R24,0x18
 0044 8F70              andi R24,15
 0046 88BB              out 0x18,R24
 0048                   .dbline 35
 0048           ;   LCD_DATA_PORT|=command&0xf0; //写高四位
 0048 842F              mov R24,R20
 004A 807F              andi R24,240
 004C 28B2              in R2,0x18
 004E 282A              or R2,R24
 0050 28BA              out 0x18,R2
 0052                   .dbline 36
 0052           ;   LCD_en_write();
 0052 EBDF              rcall _LCD_en_write
 0054                   .dbline 37
 0054           ;   command=command<<4;          //低四位移到高四位
 0054 842F              mov R24,R20
 0056 8F70              andi R24,#0x0F
 0058 8295              swap R24
 005A 482F              mov R20,R24
 005C                   .dbline 38
 005C           ;   LCD_DATA_PORT&=0x0f;         //清高四位
 005C 88B3              in R24,0x18
 005E 8F70              andi R24,15
 0060 88BB              out 0x18,R24
 0062                   .dbline 39
 0062           ;   LCD_DATA_PORT|=command&0xf0; //写低四位
 0062 842F              mov R24,R20
 0064 807F              andi R24,240
 0066 28B2              in R2,0x18
 0068 282A              or R2,R24
 006A 28BA              out 0x18,R2
 006C                   .dbline 40
 006C           ;   LCD_en_write();
 006C DEDF              rcall _LCD_en_write
 006E                   .dbline -2
 006E           L3:
 006E 00D0              rcall pop_gset1
 0070                   .dbline 0 ; func end
 0070 0895              ret
 0072                   .dbsym r command 20 c
 0072                   .dbend
 0072                   .dbfunc e LCD_write_data _LCD_write_data fV
 0072           ;           data -> R20
                        .even
 0072           _LCD_write_data::
 0072 00D0              rcall push_gset1
 0074 402F              mov R20,R16
 0076                   .dbline -1
 0076                   .dbline 45
 0076           ;   
 0076           ; }
 0076           ; 
 0076           ; void LCD_write_data(unsigned char data) //写数据
 0076           ; {
 0076                   .dbline 46
 0076           ;   delay_nus(16);
 0076 00E1              ldi R16,16
 0078 10E0              ldi R17,0
 007A 00D0              rcall _delay_nus
 007C                   .dbline 47
 007C           ;   LCD_RS_PORT|=LCD_RS;       //RS=1
 007C C29A              sbi 0x18,2
 007E                   .dbline 48
 007E           ;   LCD_DATA_PORT&=0X0f;       //清高四位
 007E 88B3              in R24,0x18
 0080 8F70              andi R24,15
 0082 88BB              out 0x18,R24
 0084                   .dbline 49
 0084           ;   LCD_DATA_PORT|=data&0xf0;  //写高四位
 0084 842F              mov R24,R20
 0086 807F              andi R24,240
 0088 28B2              in R2,0x18
 008A 282A              or R2,R24
 008C 28BA              out 0x18,R2
 008E                   .dbline 50
 008E           ;   LCD_en_write();
 008E CDDF              rcall _LCD_en_write
 0090                   .dbline 51
 0090           ;   data=data<<4;               //低四位移到高四位
 0090 842F              mov R24,R20
 0092 8F70              andi R24,#0x0F
 0094 8295              swap R24
 0096 482F              mov R20,R24
 0098                   .dbline 52
 0098           ;   LCD_DATA_PORT&=0X0f;        //清高四位
 0098 88B3              in R24,0x18
 009A 8F70              andi R24,15
 009C 88BB              out 0x18,R24
 009E                   .dbline 53
 009E           ;   LCD_DATA_PORT|=data&0xf0;   //写低四位
 009E 842F              mov R24,R20
 00A0 807F              andi R24,240
 00A2 28B2              in R2,0x18
 00A4 282A              or R2,R24
 00A6 28BA              out 0x18,R2
 00A8                   .dbline 54
 00A8           ;   LCD_en_write();
 00A8 C0DF              rcall _LCD_en_write
 00AA                   .dbline -2
 00AA           L4:
 00AA 00D0              rcall pop_gset1
 00AC                   .dbline 0 ; func end
 00AC 0895              ret
 00AE                   .dbsym r data 20 c
 00AE                   .dbend
 00AE                   .dbfunc e LCD_set_xy _LCD_set_xy fV
 00AE           ;        address -> R20
 00AE           ;              y -> R20
 00AE           ;              x -> R22
                        .even
 00AE           _LCD_set_xy::
 00AE 00D0              rcall push_gset2
 00B0 422F              mov R20,R18
 00B2 602F              mov R22,R16
 00B4                   .dbline -1
 00B4                   .dbline 59
 00B4           ; }
 00B4           ; 
 00B4           ; 
 00B4           ; void LCD_set_xy( unsigned char x, unsigned char y )  //写地址函数
 00B4           ; {
 00B4                   .dbline 61
 00B4           ;     unsigned char address;
 00B4           ;     if (y == 0) address = 0x80 + x;
 00B4 4423              tst R20
 00B6 19F4              brne L6
 00B8                   .dbline 61
 00B8 462F              mov R20,R22
 00BA 4058              subi R20,128    ; addi 128
 00BC 02C0              rjmp L7
 00BE           L6:
 00BE                   .dbline 62
 00BE           ;     else   address = 0xc0 + x;
 00BE 462F              mov R20,R22
 00C0 4054              subi R20,64    ; addi 192
 00C2           L7:
 00C2                   .dbline 63
 00C2           ;     LCD_write_command( address);
 00C2 042F              mov R16,R20
 00C4 B8DF              rcall _LCD_write_command
 00C6                   .dbline -2
 00C6           L5:
 00C6 00D0              rcall pop_gset2
 00C8                   .dbline 0 ; func end
 00C8 0895              ret
 00CA                   .dbsym r address 20 c
 00CA                   .dbsym r y 20 c
 00CA                   .dbsym r x 22 c
 00CA                   .dbend
 00CA                   .dbfunc e LCD_write_string _LCD_write_string fV
 00CA           ;              s -> R20,R21
 00CA           ;              Y -> R10
 00CA           ;              X -> R22
                        .even
 00CA           _LCD_write_string::
 00CA 00D0              rcall push_gset3
 00CC A22E              mov R10,R18
 00CE 602F              mov R22,R16
 00D0 4E81              ldd R20,y+6
 00D2 5F81              ldd R21,y+7
 00D4                   .dbline -1
 00D4                   .dbline 67
 00D4           ; }
 00D4           ;   
 00D4           ; void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) //列x=0~15,行y=0,1
 00D4           ; {
 00D4                   .dbline 68
 00D4           ;     LCD_set_xy( X, Y ); //写地址    
 00D4 2A2D              mov R18,R10
 00D6 062F              mov R16,R22
 00D8 EADF              rcall _LCD_set_xy
 00DA 05C0              rjmp L10
 00DC           L9:
 00DC                   .dbline 70
 00DC                   .dbline 71
 00DC FA01              movw R30,R20
 00DE 0081              ldd R16,z+0
 00E0 C8DF              rcall _LCD_write_data
 00E2                   .dbline 72
 00E2 4F5F              subi R20,255  ; offset = 1
 00E4 5F4F              sbci R21,255
 00E6                   .dbline 73
 00E6           L10:
 00E6                   .dbline 69
 00E6           ;     while (*s)  // 写显示字符
 00E6 FA01              movw R30,R20
 00E8 2080              ldd R2,z+0
 00EA 2220              tst R2
 00EC B9F7              brne L9
 00EE                   .dbline -2
 00EE           L8:
 00EE 00D0              rcall pop_gset3
 00F0                   .dbline 0 ; func end
 00F0 0895              ret
 00F2                   .dbsym r s 20 pc
 00F2                   .dbsym r Y 10 c
 00F2                   .dbsym r X 22 c
 00F2                   .dbend
 00F2                   .dbfunc e LCD_write_char _LCD_write_char fV
 00F2           ;           data -> y+4
 00F2           ;              Y -> R22
 00F2           ;              X -> R20
                        .even
 00F2           _LCD_write_char::
 00F2 00D0              rcall push_gset2
 00F4 622F              mov R22,R18
 00F6 402F              mov R20,R16
 00F8                   .dbline -1
 00F8                   .dbline 78
 00F8           ;     {
 00F8           ;       LCD_write_data( *s );
 00F8           ;       s ++;
 00F8           ;     }
 00F8           ;       
 00F8           ; }
 00F8           ; 
 00F8           ; void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data) //列x=0~15,行y=0,1
 00F8           ; {
 00F8                   .dbline 79
 00F8           ;   LCD_set_xy( X, Y ); //写地址
 00F8 262F              mov R18,R22
 00FA 042F              mov R16,R20
 00FC D8DF              rcall _LCD_set_xy
 00FE                   .dbline 80
 00FE           ;   LCD_write_data( data);
 00FE 0C81              ldd R16,y+4
 0100 B8DF              rcall _LCD_write_data
 0102                   .dbline -2
 0102           L12:
 0102 00D0              rcall pop_gset2
 0104                   .dbline 0 ; func end
 0104 0895              ret
 0106                   .dbsym l data 4 c
 0106                   .dbsym r Y 22 c
 0106                   .dbsym r X 20 c
 0106                   .dbend

⌨️ 快捷键说明

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