📄 1602.lis
字号:
.module _1602.c
.area data(ram, con, rel)
0000 _str1::
0000 .blkb 16
.area idata
0000 20202049206C6F766520796F75202000 .byte 32,32,32,'I,32,'l,'o,'v,'e,32,'y,'o,'u,32,32,0
.area data(ram, con, rel)
0010 .dbfile 1602.c
0010 .dbsym e str1 _str1 A[16:16]c
0010 _str2::
0010 .blkb 17
.area idata
0010 207777772E6F75726176722E636F6D20 .byte 32,'w,'w,'w,46,'o,'u,'r,'a,'v,'r,46,'c,'o,'m,32
0020 00 .byte 0
.area data(ram, con, rel)
0021 .dbfile 1602.c
0021 .dbsym e str2 _str2 A[17:17]c
.area text(rom, con, rel)
0000 .dbfile 1602.c
0000 .dbfunc e main _main fV
.even
0000 _main::
0000 .dbline -1
0000 .dbline 54
0000 ; #include <iom16v.h>
0000 ; #include <macros.h>
0000 ;
0000 ; #define lcd_data_port PORTD
0000 ; #define lcd_data_ddr DDRD
0000 ; #define lcd_busy_pin PIND
0000 ; #define lcd_busy_ddr DDRD
0000 ; #define lcd_control_port PORTA
0000 ; #define lcd_control_ddr DDRA
0000 ;
0000 ; #define lcd_RS 0x01
0000 ; //PORTA0
0000 ; #define lcd_RW 0x02
0000 ; //PORTA1
0000 ; #define lcd_EN 0x04
0000 ; //PORTA2
0000 ; #define busy 0x80
0000 ; //LCD_DB7
0000 ;
0000 ;
0000 ;
0000 ;
0000 ;
0000 ;
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 ;
0000 ;
0000 ;
0000 ;
0000 ;
0000 ; //显示的两行字符
0000 ; unsigned char str1[]=" I love you ";
0000 ; unsigned char str2[]=" www.ouravr.com ";
0000 ;
0000 ;
0000 ;
0000 ;
0000 ;
0000 ;
0000 ;
0000 ; /*------------------------------------主函数-------------------------------------------*/
0000 ; void main(void)
0000 ; {
0000 .dbline 55
0000 ; lcd_data_port=0xff;
0000 8FEF ldi R24,255
0002 82BB out 0x12,R24
0004 .dbline 56
0004 ; lcd_data_ddr=0xff;
0004 81BB out 0x11,R24
0006 .dbline 57
0006 ; lcd_control_port=0x07;
0006 87E0 ldi R24,7
0008 8BBB out 0x1b,R24
000A .dbline 58
000A ; lcd_control_ddr=0x07;
000A 8ABB out 0x1a,R24
000C .dbline 59
000C ; lcd_init();
000C 0AD0 xcall _lcd_init
000E .dbline 60
000E ; display_a_string(0,str1);
000E 20E0 ldi R18,<_str1
0010 30E0 ldi R19,>_str1
0012 0027 clr R16
0014 67D0 xcall _display_a_string
0016 .dbline 61
0016 ; display_a_string(1,str2);
0016 20E0 ldi R18,<_str2
0018 30E0 ldi R19,>_str2
001A 01E0 ldi R16,1
001C 63D0 xcall _display_a_string
001E L2:
001E .dbline 62
001E L3:
001E .dbline 62
001E FFCF xjmp L2
0020 X0:
0020 .dbline -2
0020 .dbline 63
0020 ; while(1);
0020 ; }
0020 L1:
0020 .dbline 0 ; func end
0020 0895 ret
0022 .dbend
0022 .dbfunc e lcd_init _lcd_init fV
.even
0022 _lcd_init::
0022 .dbline -1
0022 .dbline 77
0022 ;
0022 ;
0022 ;
0022 ;
0022 ;
0022 ;
0022 ;
0022 ;
0022 ;
0022 ;
0022 ; /*------------------------------------液晶驱动函数-------------------------------------*/
0022 ; //液晶初始化
0022 ; void lcd_init(void)
0022 ; {
0022 .dbline 78
0022 ; delay_nms(15);
0022 0FE0 ldi R16,15
0024 10E0 ldi R17,0
0026 81D0 xcall _delay_nms
0028 .dbline 79
0028 ; lcd_write_command(0x38,0);//显示模式设置三次(此时不管lcd空闲与否)
0028 2227 clr R18
002A 08E3 ldi R16,56
002C 1ED0 xcall _lcd_write_command
002E .dbline 80
002E ; delay_nms(5);
002E 05E0 ldi R16,5
0030 10E0 ldi R17,0
0032 7BD0 xcall _delay_nms
0034 .dbline 81
0034 ; lcd_write_command(0x38,0);
0034 2227 clr R18
0036 08E3 ldi R16,56
0038 18D0 xcall _lcd_write_command
003A .dbline 82
003A ; delay_nms(5);
003A 05E0 ldi R16,5
003C 10E0 ldi R17,0
003E 75D0 xcall _delay_nms
0040 .dbline 83
0040 ; lcd_write_command(0x38,0);
0040 2227 clr R18
0042 08E3 ldi R16,56
0044 12D0 xcall _lcd_write_command
0046 .dbline 84
0046 ; delay_nms(5);
0046 05E0 ldi R16,5
0048 10E0 ldi R17,0
004A 6FD0 xcall _delay_nms
004C .dbline 86
004C ;
004C ; lcd_write_command(0x38,1);//显示模式设置(从此之后均需lcd空闲)
004C 21E0 ldi R18,1
004E 08E3 ldi R16,56
0050 0CD0 xcall _lcd_write_command
0052 .dbline 87
0052 ; lcd_write_command(0x08,1);//显示关闭
0052 21E0 ldi R18,1
0054 08E0 ldi R16,8
0056 09D0 xcall _lcd_write_command
0058 .dbline 88
0058 ; lcd_write_command(0x01,1);//显示清屏
0058 21E0 ldi R18,1
005A 01E0 ldi R16,1
005C 06D0 xcall _lcd_write_command
005E .dbline 89
005E ; lcd_write_command(0x06,1);//显示光标移动设置
005E 21E0 ldi R18,1
0060 06E0 ldi R16,6
0062 03D0 xcall _lcd_write_command
0064 .dbline 90
0064 ; lcd_write_command(0x0c,1);//显示开及光标设置
0064 21E0 ldi R18,1
0066 0CE0 ldi R16,12
0068 .dbline -2
0068 .dbline 91
0068 ; }
0068 L5:
0068 .dbline 0 ; func end
0068 00C0 xjmp _lcd_write_command
006A .dbend
006A .dbfunc e lcd_write_command _lcd_write_command fV
006A ; wait_en -> R22
006A ; command -> R20
.even
006A _lcd_write_command::
006A 0E940000 xcall push_gset2
006E 622F mov R22,R18
0070 402F mov R20,R16
0072 .dbline -1
0072 .dbline 102
0072 ;
0072 ;
0072 ;
0072 ;
0072 ;
0072 ;
0072 ;
0072 ;
0072 ; //写指令函数: E=高脉冲 RS=0 RW=0
0072 ; void lcd_write_command(unsigned char command,unsigned char wait_en)//command为指令,wait_en指定是否要检测LCD忙信号
0072 ; {
0072 .dbline 103
0072 ; if(wait_en)wait_enable();//若wait_en为1,则要检测LCD忙信号,等待其空闲
0072 6623 tst R22
0074 09F0 breq L7
0076 .dbline 103
0076 18D0 xcall _wait_enable
0078 L7:
0078 .dbline 104
0078 ; lcd_control_port&=~lcd_RS;//RS=0
0078 D898 cbi 0x1b,0
007A .dbline 105
007A ; lcd_control_port&=~lcd_RW;//RW=0
007A D998 cbi 0x1b,1
007C .dbline 106
007C ; lcd_control_port&=~lcd_EN;//E=0,下面给LCD一个高脉冲
007C DA98 cbi 0x1b,2
007E .dbline 107
007E ; NOP();
007E 0000 nop
0080 .dbline 108
0080 ; lcd_control_port|=lcd_EN;//E=1
0080 DA9A sbi 0x1b,2
0082 .dbline 109
0082 ; lcd_data_port=command;
0082 42BB out 0x12,R20
0084 .dbline 110
0084 ; lcd_control_port&=~lcd_EN;//重设E=0
0084 DA98 cbi 0x1b,2
0086 .dbline -2
0086 .dbline 111
0086 ; }
0086 L6:
0086 0E940000 xcall pop_gset2
008A .dbline 0 ; func end
008A 0895 ret
008C .dbsym r wait_en 22 c
008C .dbsym r command 20 c
008C .dbend
008C .dbfunc e lcd_write_data _lcd_write_data fV
008C ; char_data -> R20
.even
008C _lcd_write_data::
008C 0E940000 xcall push_gset1
0090 402F mov R20,R16
0092 .dbline -1
0092 .dbline 123
0092 ;
0092 ;
0092 ;
0092 ;
0092 ;
0092 ;
0092 ;
0092 ;
0092 ;
0092 ; //写数据函数: E =高脉冲 RS=1 RW=0
0092 ; void lcd_write_data(unsigned char char_data)
0092 ; {
0092 .dbline 124
0092 ; wait_enable();//等待LCD空闲
0092 0AD0 xcall _wait_enable
0094 .dbline 125
0094 ; lcd_control_port|=lcd_RS;//RS=1
0094 D89A sbi 0x1b,0
0096 .dbline 126
0096 ; lcd_control_port&=~lcd_RW;//RW=0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -