📄 lcd.lis
字号:
.module lcd.c
.area data(ram, con, rel)
0000 _str1::
0000 .blkb 17
.area idata
0000 2051513A313037343337353936202020 .byte 32,'Q,'Q,58,49,48,55,52,51,55,53,57,54,32,32,32
0010 00 .byte 0
.area data(ram, con, rel)
0011 .dbfile F:\专业\单片机分类\AVR\功能模块应用\1602LCD\lcd.c
0011 .dbsym e str1 _str1 A[17:17]c
0011 _str2::
0011 .blkb 17
.area idata
0011 2039386469616E403136332E636F6D20 .byte 32,57,56,'d,'i,'a,'n,64,49,54,51,46,'c,'o,'m,32
0021 00 .byte 0
.area data(ram, con, rel)
0022 .dbfile F:\专业\单片机分类\AVR\功能模块应用\1602LCD\lcd.c
0022 .dbsym e str2 _str2 A[17:17]c
.area text(rom, con, rel)
0000 .dbfile F:\专业\单片机分类\AVR\功能模块应用\1602LCD\lcd.c
0000 .dbfunc e main _main fV
.even
0000 _main::
0000 .dbline -1
0000 .dbline 33
0000 ; #include <iom16v.h>
0000 ; #include <macros.h>
0000 ;
0000 ;
0000 ; #define lcd_data_port PORTC
0000 ; #define lcd_data_ddr DDRC
0000 ; #define lcd_busy_pin PINC
0000 ; #define lcd_busy_ddr DDRC
0000 ; #define lcd_control_port PORTB
0000 ; #define lcd_control_ddr DDRB
0000 ;
0000 ; #define lcd_RS 0x20 //PORTB5
0000 ; #define lcd_RW 0x10 //PORTB4
0000 ; #define lcd_EN 0x08 //PORTB3
0000 ; #define busy 0x80 //LCD_DB7
0000 ;
0000 ; /*----------------------------------函数声明------------------------------------------*/
0000 ; void lcd_init(void);
0000 ; void lcd_write_command(unsigned char command,unsigned char wait_en);
0000 ; void lcd_write_data(unsigned char char_data);
0000 ; void wait_enable(void);
0000 ; void display_a_char(unsigned char position,unsigned char char_data);
0000 ; void display_a_string(unsigned char col,unsigned char *ptr);
0000 ; void delay_1ms(void);
0000 ; void delay_nms(unsigned int n);
0000 ;
0000 ; //显示的两行字符
0000 ; unsigned char str1[]=" QQ:107437596 ";
0000 ; unsigned char str2[]=" 98dian@163.com ";
0000 ;
0000 ; /*------------------------------------主函数-------------------------------------------*/
0000 ; void main(void)
0000 ; {
0000 .dbline 34
0000 ; lcd_data_port=0xff;
0000 8FEF ldi R24,255
0002 85BB out 0x15,R24
0004 .dbline 35
0004 ; lcd_data_ddr=0xff;
0004 84BB out 0x14,R24
0006 .dbline 36
0006 ; lcd_control_ddr=0xff;
0006 87BB out 0x17,R24
0008 .dbline 37
0008 ; lcd_init();
0008 0AD0 xcall _lcd_init
000A .dbline 38
000A ; display_a_string(0,str1);
000A 20E0 ldi R18,<_str1
000C 30E0 ldi R19,>_str1
000E 0027 clr R16
0010 68D0 xcall _display_a_string
0012 .dbline 39
0012 ; display_a_string(1,str2);
0012 20E0 ldi R18,<_str2
0014 30E0 ldi R19,>_str2
0016 01E0 ldi R16,1
0018 64D0 xcall _display_a_string
001A L2:
001A .dbline 40
001A L3:
001A .dbline 40
001A FFCF xjmp L2
001C X0:
001C .dbline -2
001C L1:
001C .dbline 0 ; func end
001C 0895 ret
001E .dbend
001E .dbfunc e lcd_init _lcd_init fV
.even
001E _lcd_init::
001E .dbline -1
001E .dbline 46
001E ; while(1);
001E ; }
001E ;
001E ; /*------------------------------------液晶驱动函数-------------------------------------*/
001E ; //液晶初始化
001E ; void lcd_init(void)
001E ; {
001E .dbline 47
001E ; delay_nms(15);
001E 0FE0 ldi R16,15
0020 10E0 ldi R17,0
0022 82D0 xcall _delay_nms
0024 .dbline 48
0024 ; lcd_write_command(0x38,0);//显示模式设置三次(此时不管lcd空闲与否)
0024 2227 clr R18
0026 08E3 ldi R16,56
0028 1FD0 xcall _lcd_write_command
002A .dbline 49
002A ; delay_nms(5);
002A 05E0 ldi R16,5
002C 10E0 ldi R17,0
002E 7CD0 xcall _delay_nms
0030 .dbline 50
0030 ; lcd_write_command(0x38,0);
0030 2227 clr R18
0032 08E3 ldi R16,56
0034 19D0 xcall _lcd_write_command
0036 .dbline 51
0036 ; delay_nms(5);
0036 05E0 ldi R16,5
0038 10E0 ldi R17,0
003A 76D0 xcall _delay_nms
003C .dbline 52
003C ; lcd_write_command(0x38,0);
003C 2227 clr R18
003E 08E3 ldi R16,56
0040 13D0 xcall _lcd_write_command
0042 .dbline 53
0042 ; delay_nms(5);
0042 05E0 ldi R16,5
0044 10E0 ldi R17,0
0046 70D0 xcall _delay_nms
0048 .dbline 55
0048 ;
0048 ; lcd_write_command(0x38,1);//显示模式设置(从此之后均需lcd空闲)
0048 21E0 ldi R18,1
004A 08E3 ldi R16,56
004C 0DD0 xcall _lcd_write_command
004E .dbline 56
004E ; lcd_write_command(0x08,1);//显示关闭
004E 21E0 ldi R18,1
0050 08E0 ldi R16,8
0052 0AD0 xcall _lcd_write_command
0054 .dbline 57
0054 ; lcd_write_command(0x01,1);//显示清屏
0054 21E0 ldi R18,1
0056 01E0 ldi R16,1
0058 07D0 xcall _lcd_write_command
005A .dbline 58
005A ; lcd_write_command(0x06,1);//显示光标移动设置
005A 21E0 ldi R18,1
005C 06E0 ldi R16,6
005E 04D0 xcall _lcd_write_command
0060 .dbline 59
0060 ; lcd_write_command(0x0c,1);//显示开及光标设置
0060 21E0 ldi R18,1
0062 0CE0 ldi R16,12
0064 01D0 xcall _lcd_write_command
0066 .dbline -2
0066 L5:
0066 .dbline 0 ; func end
0066 0895 ret
0068 .dbend
0068 .dbfunc e lcd_write_command _lcd_write_command fV
0068 ; wait_en -> R22
0068 ; command -> R20
.even
0068 _lcd_write_command::
0068 0E940000 xcall push_gset2
006C 622F mov R22,R18
006E 402F mov R20,R16
0070 .dbline -1
0070 .dbline 64
0070 ; }
0070 ;
0070 ; //写指令函数: E=高脉冲 RS=0 RW=0
0070 ; void lcd_write_command(unsigned char command,unsigned char wait_en)//command为指令,wait_en指定是否要检测LCD忙信号
0070 ; {
0070 .dbline 65
0070 ; if(wait_en)wait_enable();//若wait_en为1,则要检测LCD忙信号,等待其空闲
0070 6623 tst R22
0072 09F0 breq L7
0074 .dbline 65
0074 18D0 xcall _wait_enable
0076 L7:
0076 .dbline 66
0076 ; lcd_control_port&=~lcd_RS;//RS=0
0076 C598 cbi 0x18,5
0078 .dbline 67
0078 ; lcd_control_port&=~lcd_RW;//RW=0
0078 C498 cbi 0x18,4
007A .dbline 68
007A ; lcd_control_port&=~lcd_EN;//E=0,下面给LCD一个高脉冲
007A C398 cbi 0x18,3
007C .dbline 69
007C ; NOP();
007C 0000 nop
007E .dbline 70
007E ; lcd_control_port|=lcd_EN;//E=1
007E C39A sbi 0x18,3
0080 .dbline 71
0080 ; lcd_data_port=command;
0080 45BB out 0x15,R20
0082 .dbline 72
0082 ; lcd_control_port&=~lcd_EN;//重设E=0
0082 C398 cbi 0x18,3
0084 .dbline -2
0084 L6:
0084 0E940000 xcall pop_gset2
0088 .dbline 0 ; func end
0088 0895 ret
008A .dbsym r wait_en 22 c
008A .dbsym r command 20 c
008A .dbend
008A .dbfunc e lcd_write_data _lcd_write_data fV
008A ; char_data -> R20
.even
008A _lcd_write_data::
008A 0E940000 xcall push_gset1
008E 402F mov R20,R16
0090 .dbline -1
0090 .dbline 77
0090 ; }
0090 ;
0090 ; //写数据函数: E =高脉冲 RS=1 RW=0
0090 ; void lcd_write_data(unsigned char char_data)
0090 ; {
0090 .dbline 78
0090 ; wait_enable();//等待LCD空闲
0090 0AD0 xcall _wait_enable
0092 .dbline 79
0092 ; lcd_control_port|=lcd_RS;//RS=1
0092 C59A sbi 0x18,5
0094 .dbline 80
0094 ; lcd_control_port&=~lcd_RW;//RW=0
0094 C498 cbi 0x18,4
0096 .dbline 81
0096 ; lcd_control_port&=~lcd_EN;//E=0,下面给LCD一个高脉冲
0096 C398 cbi 0x18,3
0098 .dbline 82
0098 ; NOP();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -