📄 1602b_lcd.lis
字号:
.module _1602B_LCD.c
.area text(rom, con, rel)
0000 .dbfile D:\hujie\1602B_LCD.c
0000 .dbfunc e LCD_init _LCD_init fV
.even
0000 _LCD_init::
0000 .dbline -1
0000 .dbline 20
0000 ; // 1602B_LCD.c
0000 ; //
0000 ;
0000 ; /**********************************************************
0000 ; /* TC1602B LCD DISPLAY
0000 ; /* LCD_write函数功能:当command=0时,向LCD写入数据,否则向LCD写
0000 ; 入命令
0000 ; /* LCD第一行显示寄存器地址:0X80-0X8F
0000 ; /* LCD第二行显示寄存器地址:0XC0-0XCF
0000 ; /* 光标命令:
0000 ; /* LCD_write_char(0x0e,0); //光标开
0000 ; /* LCD_write_char(0x0d,0); //光标所在字符闪烁
0000 ; /* LCD_write_char(0x0c,0); //光标关
0000 ; **********************************************************/
0000 ; #include <io8515v.h>
0000 ; #include <macros.h>
0000 ; #include "1602LCD.h"
0000 ;
0000 ; void LCD_init(void)
0000 ; {
0000 .dbline 21
0000 ; LCD_CTRL_DDR|=LCD_RS | LCD_EN | LCD_RW;
0000 87B3 in R24,0x17
0002 8E60 ori R24,14
0004 87BB out 0x17,R24
0006 .dbline 22
0006 ; LCD_DATA_DDR|=LCD_DATA;
0006 87B3 in R24,0x17
0008 806F ori R24,240
000A 87BB out 0x17,R24
000C .dbline 23
000C ; delay_nms(100);
000C 04E6 ldi R16,100
000E 10E0 ldi R17,0
0010 00D0 rcall _delay_nms
0012 .dbline 24
0012 ; LCD_write_char(0x28,0); //功能设置
0012 2227 clr R18
0014 3327 clr R19
0016 08E2 ldi R16,40
0018 10E0 ldi R17,0
001A 21D0 rcall _LCD_write_char
001C .dbline 25
001C ; delay_nus(100);
001C 04E6 ldi R16,100
001E 10E0 ldi R17,0
0020 00D0 rcall _delay_nus
0022 .dbline 26
0022 ; LCD_write_char(0x06,0); //显示光标移动设置
0022 2227 clr R18
0024 3327 clr R19
0026 06E0 ldi R16,6
0028 10E0 ldi R17,0
002A 19D0 rcall _LCD_write_char
002C .dbline 27
002C ; delay_nus(100);
002C 04E6 ldi R16,100
002E 10E0 ldi R17,0
0030 00D0 rcall _delay_nus
0032 .dbline 28
0032 ; LCD_write_char(0x01,0); //显示清屏
0032 2227 clr R18
0034 3327 clr R19
0036 01E0 ldi R16,1
0038 10E0 ldi R17,0
003A 11D0 rcall _LCD_write_char
003C .dbline 29
003C ; delay_nms(2);
003C 02E0 ldi R16,2
003E 10E0 ldi R17,0
0040 00D0 rcall _delay_nms
0042 .dbline 30
0042 ; LCD_write_char(0x0C,0); //显示开
0042 2227 clr R18
0044 3327 clr R19
0046 0CE0 ldi R16,12
0048 10E0 ldi R17,0
004A 09D0 rcall _LCD_write_char
004C .dbline 31
004C ; delay_nus(100);
004C 04E6 ldi R16,100
004E 10E0 ldi R17,0
0050 .dbline -2
0050 .dbline 32
0050 ; }
0050 L1:
0050 .dbline 0 ; func end
0050 00C0 rjmp _delay_nus
0052 .dbend
0052 .dbfunc e LCD_en_write _LCD_en_write fV
.even
0052 _LCD_en_write::
0052 .dbline -1
0052 .dbline 35
0052 ;
0052 ; void LCD_en_write(void) //EN端产生一个高电平脉冲,写LCD
0052 ; {
0052 .dbline 36
0052 ; LCD_EN_PORT |= LCD_EN;
0052 C39A sbi 0x18,3
0054 .dbline 37
0054 ; delay_nus(5);
0054 05E0 ldi R16,5
0056 10E0 ldi R17,0
0058 00D0 rcall _delay_nus
005A .dbline 38
005A ; LCD_EN_PORT &= ~LCD_EN;
005A C398 cbi 0x18,3
005C .dbline -2
005C .dbline 39
005C ; }
005C L2:
005C .dbline 0 ; func end
005C 0895 ret
005E .dbend
005E .dbfunc e LCD_write_char _LCD_write_char fV
005E ; data_temp -> R22,R23
005E ; command_temp -> R20,R21
005E ; data -> R12,R13
005E ; command -> R10,R11
.even
005E _LCD_write_char::
005E 00D0 rcall push_gset4
0060 C22E mov R12,R18
0062 D32E mov R13,R19
0064 A02E mov R10,R16
0066 B12E mov R11,R17
0068 .dbline -1
0068 .dbline 49
0068 ;
0068 ; /****************************************************************
0068 ; /* LCD_write_char : 英文字符串显示函数
0068 ; /* 输入参数:*s :英文字符串指针?
0068 ; X、Y : 显示字符串的位置,X:0-15,Y:0-1
0068 ; LCD第一行显示寄存器地址:0X80-0X8F
0068 ; LCD第一行显示寄存器地址:0XC0-0XCF
0068 ; *****************************************************************/
0068 ; void LCD_write_char(unsigned command,unsigned data)
0068 ; {
0068 .dbline 52
0068 ; unsigned command_temp,data_temp;
0068 ;
0068 ; command_temp = command;
0068 4A2D mov R20,R10
006A 5B2D mov R21,R11
006C .dbline 53
006C ; data_temp = data;
006C 6C2D mov R22,R12
006E 7D2D mov R23,R13
0070 .dbline 54
0070 ; LCD_wait_Ready();
0070 52D0 rcall _LCD_wait_Ready
0072 .dbline 55
0072 ; LCD_RW_PORT &= ~LCD_RW; //RW=0
0072 C298 cbi 0x18,2
0074 .dbline 56
0074 ; if (command == 0)
0074 4030 cpi R20,0
0076 4507 cpc R20,R21
0078 71F4 brne L4
007A X0:
007A .dbline 57
007A ; {
007A .dbline 58
007A ; LCD_RS_PORT |= LCD_RS; //RS=1
007A C19A sbi 0x18,1
007C .dbline 59
007C ; LCD_DATA_PORT &= 0X0F;
007C 88B3 in R24,0x18
007E 8F70 andi R24,15
0080 88BB out 0x18,R24
0082 .dbline 60
0082 ; LCD_DATA_PORT |= data_temp&0xf0; //send high 4bit
0082 862F mov R24,R22
0084 972F mov R25,R23
0086 807F andi R24,240
0088 9070 andi R25,0
008A 28B2 in R2,0x18
008C 3324 clr R3
008E 282A or R2,R24
0090 392A or R3,R25
0092 28BA out 0x18,R2
0094 .dbline 61
0094 ; }
0094 0DC0 rjmp L5
0096 L4:
0096 .dbline 63
0096 ; else
0096 ; {
0096 .dbline 64
0096 ; LCD_RS_PORT &= ~LCD_RS; //RS=0
0096 C198 cbi 0x18,1
0098 .dbline 65
0098 ; LCD_DATA_PORT &= 0X0F;
0098 88B3 in R24,0x18
009A 8F70 andi R24,15
009C 88BB out 0x18,R24
009E .dbline 66
009E ; LCD_DATA_PORT |= command_temp&0xf0;//send high 4bit
009E 842F mov R24,R20
00A0 952F mov R25,R21
00A2 807F andi R24,240
00A4 9070 andi R25,0
00A6 28B2 in R2,0x18
00A8 3324 clr R3
00AA 282A or R2,R24
00AC 392A or R3,R25
00AE 28BA out 0x18,R2
00B0 .dbline 67
00B0 ; }
00B0 L5:
00B0 .dbline 68
00B0 ; LCD_en_write();
00B0 D0DF rcall _LCD_en_write
00B2 .dbline 69
00B2 ; command_temp=command_temp << 4; //send low 4bit
00B2 440F lsl R20
00B4 551F rol R21
00B6 440F lsl R20
00B8 551F rol R21
00BA 440F lsl R20
00BC 551F rol R21
00BE 440F lsl R20
00C0 551F rol R21
00C2 .dbline 70
00C2 ; data_temp=data_temp << 4;
00C2 660F lsl R22
00C4 771F rol R23
00C6 660F lsl R22
00C8 771F rol R23
00CA 660F lsl R22
00CC 771F rol R23
00CE 660F lsl R22
00D0 771F rol R23
00D2 .dbline 71
00D2 ; LCD_DATA_PORT &= 0X0F;
00D2 88B3 in R24,0x18
00D4 8F70 andi R24,15
00D6 88BB out 0x18,R24
00D8 .dbline 72
00D8 ; if (command==0)
00D8 AA20 tst R10
00DA 61F4 brne L6
00DC BB20 tst R11
00DE 51F4 brne L6
00E0 X1:
00E0 .dbline 73
00E0 ; LCD_DATA_PORT |= data_temp&0xf0;
00E0 862F mov R24,R22
00E2 972F mov R25,R23
00E4 807F andi R24,240
00E6 9070 andi R25,0
00E8 28B2 in R2,0x18
00EA 3324 clr R3
00EC 282A or R2,R24
00EE 392A or R3,R25
00F0 28BA out 0x18,R2
00F2 09C0 rjmp L7
00F4 L6:
00F4 .dbline 75
00F4 ; else
00F4 ; LCD_DATA_PORT |= command_temp&0xf0;
00F4 842F mov R24,R20
00F6 952F mov R25,R21
00F8 807F andi R24,240
00FA 9070 andi R25,0
00FC 28B2 in R2,0x18
00FE 3324 clr R3
0100 282A or R2,R24
0102 392A or R3,R25
0104 28BA out 0x18,R2
0106 L7:
0106 .dbline 76
0106 ; LCD_en_write();
0106 A5DF rcall _LCD_en_write
0108 .dbline 77
0108 ; LCD_RW_PORT |= LCD_RW;
0108 C29A sbi 0x18,2
010A .dbline 78
010A ; LCD_RS_PORT ^= LCD_RS;
010A 82E0 ldi R24,2
010C 28B2 in R2,0x18
010E 2826 eor R2,R24
0110 28BA out 0x18,R2
0112 .dbline -2
0112 .dbline 79
0112 ; }
0112 L3:
0112 00D0 rcall pop_gset4
0114 .dbline 0 ; func end
0114 0895 ret
0116 .dbsym r data_temp 22 i
0116 .dbsym r command_temp 20 i
0116 .dbsym r data 12 i
0116 .dbsym r command 10 i
0116 .dbend
0116 .dbfunc e LCD_wait_Ready _LCD_wait_Ready fV
.even
0116 _LCD_wait_Ready::
0116 .dbline -1
0116 .dbline 82
0116 ;
0116 ; void LCD_wait_Ready(void) //等待LCD空闲
0116 ; {
0116 .dbline 83
0116 ; LCD_DATA_DDR &= ~0x80; //PB7 I/O口方向设置为输入
0116 BF98 cbi 0x17,7
0118 .dbline 84
0118 ; LCD_RW_PORT |= LCD_RW; //RW=1
0118 C29A sbi 0x18,2
011A .dbline 85
011A ; LCD_RS_PORT &= ~LCD_RS; //RS=0
011A C198 cbi 0x18,1
011C .dbline 86
011C ; LCD_EN_PORT |= LCD_EN; //EN=1
011C C39A sbi 0x18,3
011E L9:
011E .dbline 87
011E L10:
011E .dbline 87
011E ; while (!( LCD_DATA_PIN&0x80 ) == 0); //RW=1,读PD7,为0表示空闲;
011E B799 sbic 0x16,7
0120 03C0 rjmp L12
0122 01E0 ldi R16,1
0124 10E0 ldi R17,0
0126 02C0 rjmp L13
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -