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

📄 lcd_init.lis

📁 LCD1602的AVR驱动
💻 LIS
字号:
                        .module LCD_init.c
                        .area text(rom, con, rel)
 0000                   .dbfile G:\文档\LCD1602_C\LCD_init.c
 0000                   .dbfunc e LCD_init _LCD_init fV
                        .even
 0000           _LCD_init::
 0000                   .dbline -1
 0000                   .dbline 11
 0000           ; /*----------------------------------------------------
 0000           ; 液晶LCD1602C  使用4条数据线(D4~D7)
 0000           ; 编译器:ICC-AVR v6.31A 日期: 2005-11-24 20:29:57
 0000           ; 目标芯片 : M16
 0000           ; 时钟: 8.0000Mhz
 0000           ; 作者:archeng504
 0000           ; ---------------------------------------------------*/
 0000           ; #include "LCD.h"
 0000           ; 
 0000           ; void LCD_init(void)         //液晶初始化
 0000           ; {
 0000                   .dbline 12
 0000           ;   LCD_DATA_DDR|=LCD_DATA;   //数据口方向为输出
 0000 8AB3              in R24,0x1a
 0002 806F              ori R24,240
 0004 8ABB              out 0x1a,R24
 0006                   .dbline 13
 0006           ;   LCD_EN_DDR|=LCD_EN;       //设置EN方向为输出
 0006 D39A              sbi 0x1a,3
 0008                   .dbline 14
 0008           ;   LCD_RS_DDR|=LCD_RS;       //设置RS方向为输出
 0008 D29A              sbi 0x1a,2
 000A                   .dbline 15
 000A           ;   LCD_write_command(0x28); 
 000A 08E2              ldi R16,40
 000C 17D0              xcall _LCD_write_command
 000E                   .dbline 16
 000E           ;   LCD_en_write();
 000E 0FD0              xcall _LCD_en_write
 0010                   .dbline 17
 0010           ;   delay_nus(40);
 0010 08E2              ldi R16,40
 0012 10E0              ldi R17,0
 0014 0E940000          xcall _delay_nus
 0018                   .dbline 18
 0018           ;   LCD_write_command(0x28);  //4位显示
 0018 08E2              ldi R16,40
 001A 10D0              xcall _LCD_write_command
 001C                   .dbline 19
 001C           ;   LCD_write_command(0x0c);  //显示开
 001C 0CE0              ldi R16,12
 001E 0ED0              xcall _LCD_write_command
 0020                   .dbline 20
 0020           ;   LCD_write_command(0x01);  //清屏
 0020 01E0              ldi R16,1
 0022 0CD0              xcall _LCD_write_command
 0024                   .dbline 21
 0024           ;   delay_nms(2);
 0024 02E0              ldi R16,2
 0026 10E0              ldi R17,0
 0028 0E940000          xcall _delay_nms
 002C                   .dbline -2
 002C           L1:
 002C                   .dbline 0 ; func end
 002C 0895              ret
 002E                   .dbend
 002E                   .dbfunc e LCD_en_write _LCD_en_write fV
                        .even
 002E           _LCD_en_write::
 002E                   .dbline -1
 002E                   .dbline 25
 002E           ; }
 002E           ; 
 002E           ; void LCD_en_write(void)  //液晶使能
 002E           ; {
 002E                   .dbline 26
 002E           ;   LCD_EN_PORT|=LCD_EN;
 002E DB9A              sbi 0x1b,3
 0030                   .dbline 27
 0030           ;   delay_nus(1);
 0030 01E0              ldi R16,1
 0032 10E0              ldi R17,0
 0034 0E940000          xcall _delay_nus
 0038                   .dbline 28
 0038           ;   LCD_EN_PORT&=~LCD_EN;
 0038 DB98              cbi 0x1b,3
 003A                   .dbline -2
 003A           L2:
 003A                   .dbline 0 ; func end
 003A 0895              ret
 003C                   .dbend
 003C                   .dbfunc e LCD_write_command _LCD_write_command fV
 003C           ;        command -> R20
                        .even
 003C           _LCD_write_command::
 003C 4A93              st -y,R20
 003E 402F              mov R20,R16
 0040                   .dbline -1
 0040                   .dbline 32
 0040           ; }
 0040           ; 
 0040           ; void LCD_write_command(unsigned char command) //写指令
 0040           ; {
 0040                   .dbline 33
 0040           ;   delay_nus(16);
 0040 00E1              ldi R16,16
 0042 10E0              ldi R17,0
 0044 0E940000          xcall _delay_nus
 0048                   .dbline 34
 0048           ;   LCD_RS_PORT&=~LCD_RS;        //RS=0
 0048 DA98              cbi 0x1b,2
 004A                   .dbline 35
 004A           ;   LCD_DATA_PORT&=0X0f;         //清高四位
 004A 8BB3              in R24,0x1b
 004C 8F70              andi R24,15
 004E 8BBB              out 0x1b,R24
 0050                   .dbline 36
 0050           ;   LCD_DATA_PORT|=command&0xf0; //写高四位
 0050 842F              mov R24,R20
 0052 807F              andi R24,240
 0054 2BB2              in R2,0x1b
 0056 282A              or R2,R24
 0058 2BBA              out 0x1b,R2
 005A                   .dbline 37
 005A           ;   LCD_en_write();
 005A E9DF              xcall _LCD_en_write
 005C                   .dbline 38
 005C           ;   command=command<<4;          //低四位移到高四位
 005C 842F              mov R24,R20
 005E 8F70              andi R24,#0x0F
 0060 8295              swap R24
 0062 482F              mov R20,R24
 0064                   .dbline 39
 0064           ;   LCD_DATA_PORT&=0x0f;         //清高四位
 0064 8BB3              in R24,0x1b
 0066 8F70              andi R24,15
 0068 8BBB              out 0x1b,R24
 006A                   .dbline 40
 006A           ;   LCD_DATA_PORT|=command&0xf0; //写低四位
 006A 842F              mov R24,R20
 006C 807F              andi R24,240
 006E 2BB2              in R2,0x1b
 0070 282A              or R2,R24
 0072 2BBA              out 0x1b,R2
 0074                   .dbline 41
 0074           ;   LCD_en_write();
 0074 DCDF              xcall _LCD_en_write
 0076                   .dbline -2
 0076           L3:
 0076                   .dbline 0 ; func end
 0076 4991              ld R20,y+
 0078 0895              ret
 007A                   .dbsym r command 20 c
 007A                   .dbend
 007A                   .dbfunc e LCD_write_data _LCD_write_data fV
 007A           ;           data -> R20
                        .even
 007A           _LCD_write_data::
 007A 4A93              st -y,R20
 007C 402F              mov R20,R16
 007E                   .dbline -1
 007E                   .dbline 46
 007E           ;   
 007E           ; }
 007E           ; 
 007E           ; void LCD_write_data(unsigned char data) //写数据
 007E           ; {
 007E                   .dbline 47
 007E           ;   delay_nus(16);
 007E 00E1              ldi R16,16
 0080 10E0              ldi R17,0
 0082 0E940000          xcall _delay_nus
 0086                   .dbline 48
 0086           ;   LCD_RS_PORT|=LCD_RS;       //RS=1
 0086 DA9A              sbi 0x1b,2
 0088                   .dbline 49
 0088           ;   LCD_DATA_PORT&=0X0f;       //清高四位
 0088 8BB3              in R24,0x1b
 008A 8F70              andi R24,15
 008C 8BBB              out 0x1b,R24
 008E                   .dbline 50
 008E           ;   LCD_DATA_PORT|=data&0xf0;  //写高四位
 008E 842F              mov R24,R20
 0090 807F              andi R24,240
 0092 2BB2              in R2,0x1b
 0094 282A              or R2,R24
 0096 2BBA              out 0x1b,R2
 0098                   .dbline 51
 0098           ;   LCD_en_write();
 0098 CADF              xcall _LCD_en_write
 009A                   .dbline 52
 009A           ;   data=data<<4;               //低四位移到高四位
 009A 842F              mov R24,R20
 009C 8F70              andi R24,#0x0F
 009E 8295              swap R24
 00A0 482F              mov R20,R24
 00A2                   .dbline 53
 00A2           ;   LCD_DATA_PORT&=0X0f;        //清高四位
 00A2 8BB3              in R24,0x1b
 00A4 8F70              andi R24,15
 00A6 8BBB              out 0x1b,R24
 00A8                   .dbline 54
 00A8           ;   LCD_DATA_PORT|=data&0xf0;   //写低四位
 00A8 842F              mov R24,R20
 00AA 807F              andi R24,240
 00AC 2BB2              in R2,0x1b
 00AE 282A              or R2,R24
 00B0 2BBA              out 0x1b,R2
 00B2                   .dbline 55
 00B2           ;   LCD_en_write();
 00B2 BDDF              xcall _LCD_en_write
 00B4                   .dbline -2
 00B4           L4:
 00B4                   .dbline 0 ; func end
 00B4 4991              ld R20,y+
 00B6 0895              ret
 00B8                   .dbsym r data 20 c
 00B8                   .dbend
 00B8                   .dbfunc e LCD_set_xy _LCD_set_xy fV
 00B8           ;        address -> R20
 00B8           ;              y -> R10
 00B8           ;              x -> R22
                        .even
 00B8           _LCD_set_xy::
 00B8 0E940000          xcall push_xgsetF00C
 00BC A22E              mov R10,R18
 00BE 602F              mov R22,R16
 00C0                   .dbline -1
 00C0                   .dbline 60
 00C0           ; }
 00C0           ; 
 00C0           ; 
 00C0           ; void LCD_set_xy( unsigned char x, unsigned char y )  //写地址函数
 00C0           ; {
 00C0                   .dbline 62
 00C0           ;     unsigned char address;
 00C0           ;     if (y == 0) address = 0x80 + x;
 00C0 AA20              tst R10
 00C2 19F4              brne L6
 00C4           X0:
 00C4                   .dbline 62
 00C4 462F              mov R20,R22
 00C6 4058              subi R20,128    ; addi 128
 00C8 02C0              xjmp L7
 00CA           L6:
 00CA                   .dbline 63
 00CA           ;     else   address = 0xc0 + x;
 00CA 462F              mov R20,R22
 00CC 4054              subi R20,64    ; addi 192
 00CE           L7:
 00CE                   .dbline 64
 00CE           ;     LCD_write_command( address);
 00CE 042F              mov R16,R20
 00D0 B5DF              xcall _LCD_write_command
 00D2                   .dbline -2
 00D2           L5:
 00D2                   .dbline 0 ; func end
 00D2 0C940000          xjmp pop_xgsetF00C
 00D6                   .dbsym r address 20 c
 00D6                   .dbsym r y 10 c
 00D6                   .dbsym r x 22 c
 00D6                   .dbend
 00D6                   .dbfunc e LCD_write_string _LCD_write_string fV
 00D6           ;              s -> R20,R21
 00D6           ;              Y -> R12
 00D6           ;              X -> R10
                        .even
 00D6           _LCD_write_string::
 00D6 0E940000          xcall push_xgset303C
 00DA C22E              mov R12,R18
 00DC A02E              mov R10,R16
 00DE 4E81              ldd R20,y+6
 00E0 5F81              ldd R21,y+7
 00E2                   .dbline -1
 00E2                   .dbline 68
 00E2           ; }
 00E2           ;   
 00E2           ; void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) //列x=0~15,行y=0,1
 00E2           ; {
 00E2                   .dbline 69
 00E2           ;     LCD_set_xy( X, Y ); //写地址    
 00E2 2C2D              mov R18,R12
 00E4 0A2D              mov R16,R10
 00E6 E8DF              xcall _LCD_set_xy
 00E8 05C0              xjmp L10
 00EA           L9:
 00EA                   .dbline 71
 00EA           ;     while (*s)  // 写显示字符
 00EA           ;     {
 00EA                   .dbline 72
 00EA           ;       LCD_write_data( *s );
 00EA FA01              movw R30,R20
 00EC 0081              ldd R16,z+0
 00EE C5DF              xcall _LCD_write_data
 00F0                   .dbline 73
 00F0           ;       s ++;
 00F0 4F5F              subi R20,255  ; offset = 1
 00F2 5F4F              sbci R21,255
 00F4                   .dbline 74
 00F4           ;     }
 00F4           L10:
 00F4                   .dbline 70
 00F4 FA01              movw R30,R20
 00F6 2080              ldd R2,z+0
 00F8 2220              tst R2
 00FA B9F7              brne L9
 00FC           X1:
 00FC                   .dbline -2
 00FC           L8:
 00FC                   .dbline 0 ; func end
 00FC 0C940000          xjmp pop_xgset303C
 0100                   .dbsym r s 20 pc
 0100                   .dbsym r Y 12 c
 0100                   .dbsym r X 10 c
 0100                   .dbend
 0100                   .dbfunc e LCD_write_char _LCD_write_char fV
 0100           ;           data -> y+2
 0100           ;              Y -> R12
 0100           ;              X -> R10
                        .even
 0100           _LCD_write_char::
 0100 AA92              st -y,R10
 0102 CA92              st -y,R12
 0104 C22E              mov R12,R18
 0106 A02E              mov R10,R16
 0108                   .dbline -1
 0108                   .dbline 79
 0108           ;       
 0108           ; }
 0108           ; 
 0108           ; void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data) //列x=0~15,行y=0,1
 0108           ; {
 0108                   .dbline 80
 0108           ;   LCD_set_xy( X, Y ); //写地址
 0108 2C2D              mov R18,R12
 010A 0A2D              mov R16,R10
 010C D5DF              xcall _LCD_set_xy
 010E                   .dbline 81
 010E           ;   LCD_write_data( data);
 010E 0A81              ldd R16,y+2
 0110 B4DF              xcall _LCD_write_data
 0112                   .dbline -2
 0112           L12:
 0112                   .dbline 0 ; func end
 0112 C990              ld R12,y+
 0114 A990              ld R10,y+
 0116 0895              ret
 0118                   .dbsym l data 2 c
 0118                   .dbsym r Y 12 c
 0118                   .dbsym r X 10 c
 0118                   .dbend
 0118           ;   
 0118           ; }
 0118           ; 

⌨️ 快捷键说明

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