📄 1602lcd.lis
字号:
.module _1602lcd.c
.area text(rom, con, rel)
0000 .dbfile F:\avr单片机学习\我自编程序\1602lcd\1602lcd.c
0000 .dbfunc e lcd_init _lcd_init fV
.even
0000 _lcd_init::
0000 .dbline -1
0000 .dbline 11
0000 ;
0000 ; /*---------------------------------------------------------------*/
0000 ; #include <iom16v.h>
0000 ; #include <macros.h>
0000 ; #include "lcd1602.h"
0000 ; /*------------------------------------主函数-------------------------------------------*/
0000 ;
0000 ; /*------------------------------------液晶驱动函数-------------------------------------*/
0000 ; //液晶初始化
0000 ; void lcd_init(void)
0000 ; {
0000 .dbline 12
0000 ; delay_nms(15);
0000 0FE0 ldi R16,15
0002 10E0 ldi R17,0
0004 7AD0 xcall _delay_nms
0006 .dbline 13
0006 ; lcd_write_command(0x38,0);//显示模式设置三次(此时不管lcd空闲与否)
0006 2227 clr R18
0008 08E3 ldi R16,56
000A 1FD0 xcall _lcd_write_command
000C .dbline 14
000C ; delay_nms(5);
000C 05E0 ldi R16,5
000E 10E0 ldi R17,0
0010 74D0 xcall _delay_nms
0012 .dbline 15
0012 ; lcd_write_command(0x38,0);
0012 2227 clr R18
0014 08E3 ldi R16,56
0016 19D0 xcall _lcd_write_command
0018 .dbline 16
0018 ; delay_nms(5);
0018 05E0 ldi R16,5
001A 10E0 ldi R17,0
001C 6ED0 xcall _delay_nms
001E .dbline 17
001E ; lcd_write_command(0x38,0);
001E 2227 clr R18
0020 08E3 ldi R16,56
0022 13D0 xcall _lcd_write_command
0024 .dbline 18
0024 ; delay_nms(5);
0024 05E0 ldi R16,5
0026 10E0 ldi R17,0
0028 68D0 xcall _delay_nms
002A .dbline 20
002A ;
002A ; lcd_write_command(0x38,1);//显示模式设置(从此之后均需lcd空闲)
002A 21E0 ldi R18,1
002C 08E3 ldi R16,56
002E 0DD0 xcall _lcd_write_command
0030 .dbline 21
0030 ; lcd_write_command(0x08,1);//显示关闭
0030 21E0 ldi R18,1
0032 08E0 ldi R16,8
0034 0AD0 xcall _lcd_write_command
0036 .dbline 22
0036 ; lcd_write_command(0x01,1);//显示清屏
0036 21E0 ldi R18,1
0038 01E0 ldi R16,1
003A 07D0 xcall _lcd_write_command
003C .dbline 23
003C ; lcd_write_command(0x06,1);//显示光标移动设置
003C 21E0 ldi R18,1
003E 06E0 ldi R16,6
0040 04D0 xcall _lcd_write_command
0042 .dbline 24
0042 ; lcd_write_command(0x0c,1);//显示开及光标设置
0042 21E0 ldi R18,1
0044 0CE0 ldi R16,12
0046 01D0 xcall _lcd_write_command
0048 .dbline -2
0048 L1:
0048 .dbline 0 ; func end
0048 0895 ret
004A .dbend
004A .dbfunc e lcd_write_command _lcd_write_command fV
004A ; wait_en -> R12
004A ; command -> R10
.even
004A _lcd_write_command::
004A AA92 st -y,R10
004C CA92 st -y,R12
004E C22E mov R12,R18
0050 A02E mov R10,R16
0052 .dbline -1
0052 .dbline 29
0052 ; }
0052 ;
0052 ; //写指令函数: E=高脉冲 RS=0 RW=0
0052 ; void lcd_write_command(unsigned char command,unsigned char wait_en)//command为指令,wait_en指定是否要检测LCD忙信号
0052 ; {
0052 .dbline 30
0052 ; if(wait_en)wait_enable();//若wait_en为1,则要检测LCD忙信号,等待其空闲
0052 CC20 tst R12
0054 09F0 breq L3
0056 X0:
0056 .dbline 30
0056 16D0 xcall _wait_enable
0058 L3:
0058 .dbline 31
0058 ; lcd_control_port&=~lcd_RS;//RS=0
0058 D898 cbi 0x1b,0
005A .dbline 32
005A ; lcd_control_port&=~lcd_RW;//RW=0
005A D998 cbi 0x1b,1
005C .dbline 33
005C ; lcd_control_port&=~lcd_EN;//E=0,下面给LCD一个高脉冲
005C DA98 cbi 0x1b,2
005E .dbline 34
005E ; NOP();
005E 0000 nop
0060 .dbline 35
0060 ; lcd_control_port|=lcd_EN;//E=1
0060 DA9A sbi 0x1b,2
0062 .dbline 36
0062 ; lcd_data_port=command;
0062 A2BA out 0x12,R10
0064 .dbline 37
0064 ; lcd_control_port&=~lcd_EN;//重设E=0
0064 DA98 cbi 0x1b,2
0066 .dbline -2
0066 L2:
0066 .dbline 0 ; func end
0066 C990 ld R12,y+
0068 A990 ld R10,y+
006A 0895 ret
006C .dbsym r wait_en 12 c
006C .dbsym r command 10 c
006C .dbend
006C .dbfunc e lcd_write_data _lcd_write_data fV
006C ; char_data -> R10
.even
006C _lcd_write_data::
006C AA92 st -y,R10
006E A02E mov R10,R16
0070 .dbline -1
0070 .dbline 42
0070 ; }
0070 ;
0070 ; //写数据函数: E =高脉冲 RS=1 RW=0
0070 ; void lcd_write_data(unsigned char char_data)
0070 ; {
0070 .dbline 43
0070 ; wait_enable();//等待LCD空闲
0070 09D0 xcall _wait_enable
0072 .dbline 44
0072 ; lcd_control_port|=lcd_RS;//RS=1
0072 D89A sbi 0x1b,0
0074 .dbline 45
0074 ; lcd_control_port&=~lcd_RW;//RW=0
0074 D998 cbi 0x1b,1
0076 .dbline 46
0076 ; lcd_control_port&=~lcd_EN;//E=0,下面给LCD一个高脉冲
0076 DA98 cbi 0x1b,2
0078 .dbline 47
0078 ; NOP();
0078 0000 nop
007A .dbline 48
007A ; lcd_control_port|=lcd_EN;//E=1
007A DA9A sbi 0x1b,2
007C .dbline 49
007C ; lcd_data_port=char_data;
007C A2BA out 0x12,R10
007E .dbline 50
007E ; lcd_control_port&=~lcd_EN;//重设E=0
007E DA98 cbi 0x1b,2
0080 .dbline -2
0080 L5:
0080 .dbline 0 ; func end
0080 A990 ld R10,y+
0082 0895 ret
0084 .dbsym r char_data 10 c
0084 .dbend
0084 .dbfunc e wait_enable _wait_enable fV
.even
0084 _wait_enable::
0084 .dbline -1
0084 .dbline 56
0084 ; }
0084 ;
0084 ; //正常读写操作之前必须检测LCD控制器状态:E=1 RS=0 RW=1;DB7: 0 LCD控制器空闲,1 LCD控制器忙。
0084 ; //检测忙信号,等待LCD空闲函数
0084 ; void wait_enable(void)
0084 ; {
0084 .dbline 57
0084 ; lcd_busy_ddr&=~busy;//设置busy口为输入
0084 8F98 cbi 0x11,7
0086 .dbline 58
0086 ; lcd_control_port&=~lcd_RS;//RS=0
0086 D898 cbi 0x1b,0
0088 .dbline 59
0088 ; lcd_control_port|=lcd_RW;//RW=1
0088 D99A sbi 0x1b,1
008A .dbline 60
008A ; NOP();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -