📄 lcd1602.lis
字号:
.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 + -