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

📄 lcd1602.lis

📁 lcd液晶驱动显示原代码 根据硬件自己修改
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .module LCD1602.c
                        .area text(rom, con, rel)
 0000                   .dbfile C:\DOCUME~1\Administrator\桌面\1602\LCD1602.c
 0000                   .dbfunc e lcd_init_portDB _lcd_init_portDB fV
                        .even
 0000           _lcd_init_portDB::
 0000                   .dbline -1
 0000                   .dbline 15
 0000           ; #include <iom8v.h> 
 0000           ; #include <macros.h> 
 0000           ; #include "LCD1602.h"
 0000           ; /********************************************************** 
 0000           ; 光标命令 
 0000           ; lcd_write_command(0x0e,0);//光标开 
 0000           ; lcd_write_command(0x0d,0);//光标所在字符闪烁   
 0000           ; lcd_write_command(0x0c,0); //光标关  
 0000           ; lcd_write_command(0x07,0); //屏幕左移
 0000           ; 
 0000           ; **********************************************************/ 
 0000           ; 
 0000           ; /*------------------------------------液晶驱动函数-------------------------------------*/ 
 0000           ; void lcd_init_portDB(void) 
 0000           ; { 
 0000                   .dbline 16
 0000           ;    lcd_data_port=0xff; 
 0000 8FEF              ldi R24,255
 0002 88BB              out 0x18,R24
 0004                   .dbline 17
 0004           ;    lcd_data_ddr=0xff; 
 0004 87BB              out 0x17,R24
 0006                   .dbline 18
 0006           ;    lcd_control_port=0x07; 
 0006 87E0              ldi R24,7
 0008 85BB              out 0x15,R24
 000A                   .dbline 19
 000A           ;    lcd_control_ddr=0x07; 
 000A 84BB              out 0x14,R24
 000C                   .dbline -2
 000C           L1:
 000C                   .dbline 0 ; func end
 000C 0895              ret
 000E                   .dbend
 000E                   .dbfunc e lcd_init _lcd_init fV
                        .even
 000E           _lcd_init::
 000E                   .dbline -1
 000E                   .dbline 24
 000E           ; } 
 000E           ; 
 000E           ; //液晶初始化 
 000E           ; void lcd_init(void) 
 000E           ; { 
 000E                   .dbline 25
 000E           ;    delay_nms(15); 
 000E 0FE0              ldi R16,15
 0010 10E0              ldi R17,0
 0012 00D0              rcall _delay_nms
 0014                   .dbline 26
 0014           ;    lcd_write_command(0x38,0);//显示模式设置三次(此时不管lcd空闲与否) 
 0014 2227              clr R18
 0016 08E3              ldi R16,56
 0018 1FD0              rcall _lcd_write_command
 001A                   .dbline 27
 001A           ;    delay_nms(5); 
 001A 05E0              ldi R16,5
 001C 10E0              ldi R17,0
 001E 00D0              rcall _delay_nms
 0020                   .dbline 28
 0020           ;    lcd_write_command(0x38,0); 
 0020 2227              clr R18
 0022 08E3              ldi R16,56
 0024 19D0              rcall _lcd_write_command
 0026                   .dbline 29
 0026           ;    delay_nms(5); 
 0026 05E0              ldi R16,5
 0028 10E0              ldi R17,0
 002A 00D0              rcall _delay_nms
 002C                   .dbline 30
 002C           ;    lcd_write_command(0x38,0); 
 002C 2227              clr R18
 002E 08E3              ldi R16,56
 0030 13D0              rcall _lcd_write_command
 0032                   .dbline 31
 0032           ;    delay_nms(5); 
 0032 05E0              ldi R16,5
 0034 10E0              ldi R17,0
 0036 00D0              rcall _delay_nms
 0038                   .dbline 33
 0038           ;     
 0038           ;    lcd_write_command(0x38,1);//显示模式设置(从此之后均需lcd空闲) 
 0038 21E0              ldi R18,1
 003A 08E3              ldi R16,56
 003C 0DD0              rcall _lcd_write_command
 003E                   .dbline 34
 003E           ;    lcd_write_command(0x08,1);//显示关闭 
 003E 21E0              ldi R18,1
 0040 08E0              ldi R16,8
 0042 0AD0              rcall _lcd_write_command
 0044                   .dbline 35
 0044           ;    lcd_write_command(0x01,1);//显示清屏 
 0044 21E0              ldi R18,1
 0046 01E0              ldi R16,1
 0048 07D0              rcall _lcd_write_command
 004A                   .dbline 36
 004A           ;    lcd_write_command(0x06,1);//显示光标移动设置 
 004A 21E0              ldi R18,1
 004C 06E0              ldi R16,6
 004E 04D0              rcall _lcd_write_command
 0050                   .dbline 37
 0050           ;    lcd_write_command(0x0c,1);//显示开及光标设置 
 0050 21E0              ldi R18,1
 0052 0CE0              ldi R16,12
 0054 01D0              rcall _lcd_write_command
 0056                   .dbline -2
 0056           L2:
 0056                   .dbline 0 ; func end
 0056 0895              ret
 0058                   .dbend
 0058                   .dbfunc e lcd_write_command _lcd_write_command fV
 0058           ;        wait_en -> R22
 0058           ;        command -> R20
                        .even
 0058           _lcd_write_command::
 0058 00D0              rcall push_gset2
 005A 622F              mov R22,R18
 005C 402F              mov R20,R16
 005E                   .dbline -1
 005E                   .dbline 42
 005E           ; } 
 005E           ; 
 005E           ; //写指令函数: E=高脉冲 RS=0 RW=0 
 005E           ; void lcd_write_command(unsigned char command,unsigned char wait_en)//command为指令,wait_en指定是否要检测LCD忙信号 
 005E           ; { 
 005E                   .dbline 43
 005E           ;    if(wait_en)wait_enable();//若wait_en为1,则要检测LCD忙信号,等待其空闲 
 005E 6623              tst R22
 0060 09F0              breq L4
 0062                   .dbline 43
 0062 15D0              rcall _wait_enable
 0064           L4:
 0064                   .dbline 44
 0064           ;    lcd_control_port&=~lcd_RS;//RS=0 
 0064 A898              cbi 0x15,0
 0066                   .dbline 45
 0066           ;    lcd_control_port&=~lcd_RW;//RW=0 
 0066 A998              cbi 0x15,1
 0068                   .dbline 46
 0068           ;    lcd_control_port&=~lcd_EN;//E=0,下面给LCD一个高脉冲 
 0068 AA98              cbi 0x15,2
 006A                   .dbline 47
 006A           ;    NOP(); 
 006A 0000              nop
 006C                   .dbline 48
 006C           ;    lcd_control_port|=lcd_EN;//E=1 
 006C AA9A              sbi 0x15,2
 006E                   .dbline 49
 006E           ;    lcd_data_port=command; 
 006E 48BB              out 0x18,R20
 0070                   .dbline 50
 0070           ;    lcd_control_port&=~lcd_EN;//重设E=0 
 0070 AA98              cbi 0x15,2
 0072                   .dbline -2
 0072           L3:
 0072 00D0              rcall pop_gset2
 0074                   .dbline 0 ; func end
 0074 0895              ret
 0076                   .dbsym r wait_en 22 c
 0076                   .dbsym r command 20 c
 0076                   .dbend
 0076                   .dbfunc e lcd_write_data _lcd_write_data fV
 0076           ;      char_data -> R20
                        .even
 0076           _lcd_write_data::
 0076 00D0              rcall push_gset1
 0078 402F              mov R20,R16
 007A                   .dbline -1
 007A                   .dbline 55
 007A           ; } 
 007A           ; 
 007A           ; //写数据函数: E =高脉冲 RS=1 RW=0 
 007A           ; void lcd_write_data(unsigned char char_data) 
 007A           ; { 
 007A                   .dbline 56
 007A           ;    wait_enable();//等待LCD空闲 
 007A 09D0              rcall _wait_enable
 007C                   .dbline 57
 007C           ;    lcd_control_port|=lcd_RS;//RS=1 
 007C A89A              sbi 0x15,0
 007E                   .dbline 58
 007E           ;    lcd_control_port&=~lcd_RW;//RW=0 
 007E A998              cbi 0x15,1
 0080                   .dbline 59
 0080           ;    lcd_control_port&=~lcd_EN;//E=0,下面给LCD一个高脉冲 
 0080 AA98              cbi 0x15,2
 0082                   .dbline 60
 0082           ;    NOP(); 
 0082 0000              nop
 0084                   .dbline 61
 0084           ;    lcd_control_port|=lcd_EN;//E=1 
 0084 AA9A              sbi 0x15,2
 0086                   .dbline 62
 0086           ;    lcd_data_port=char_data; 
 0086 48BB              out 0x18,R20
 0088                   .dbline 63
 0088           ;    lcd_control_port&=~lcd_EN;//重设E=0 
 0088 AA98              cbi 0x15,2
 008A                   .dbline -2
 008A           L6:
 008A 00D0              rcall pop_gset1
 008C                   .dbline 0 ; func end
 008C 0895              ret
 008E                   .dbsym r char_data 20 c
 008E                   .dbend
 008E                   .dbfunc e wait_enable _wait_enable fV
                        .even
 008E           _wait_enable::
 008E                   .dbline -1
 008E                   .dbline 69
 008E           ; } 
 008E           ; 
 008E           ; //正常读写操作之前必须检测LCD控制器状态:E=1 RS=0 RW=1;DB7: 0 LCD控制器空闲,1 LCD控制器忙。 
 008E           ; //检测忙信号,等待LCD空闲函数 
 008E           ; void wait_enable(void) 
 008E           ; { 
 008E                   .dbline 70
 008E           ;    lcd_busy_ddr&=~busy;//设置busy口为输入 
 008E BF98              cbi 0x17,7

⌨️ 快捷键说明

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