📄 lcd_init.lis
字号:
.module LCD_init.c
.area text(rom, con, rel)
0000 .dbfile E:\biyesheji\NEWDES~1\1602\LCD1602_C\LCD_init.c
0000 .dbfunc e LCD_init _LCD_init fV
.even
0000 _LCD_init::
0000 .dbline -1
0000 .dbline 10
0000 ; /*----------------------------------------------------
0000 ; 液晶LCD1602C 使用4条数据线(D4~D7)
0000 ; 编译器:ICC-AVR v6.31A 日期: 2005-11-24 20:29:57
0000 ; 目标芯片 : M8
0000 ; 时钟: 8.0000Mhz
0000 ; ---------------------------------------------------*/
0000 ; #include "LCD.h"
0000 ;
0000 ; void LCD_init(void) //液晶初始化
0000 ; {
0000 .dbline 11
0000 ; LCD_DATA_DDR|=LCD_DATA; //数据口方向为输出
0000 87B3 in R24,0x17
0002 806F ori R24,240
0004 87BB out 0x17,R24
0006 .dbline 12
0006 ; LCD_EN_DDR|=LCD_EN; //设置EN方向为输出
0006 BB9A sbi 0x17,3
0008 .dbline 13
0008 ; LCD_RS_DDR|=LCD_RS; //设置RS方向为输出
0008 BA9A sbi 0x17,2
000A .dbline 14
000A ; LCD_write_command(0x28);
000A 08E2 ldi R16,40
000C 14D0 rcall _LCD_write_command
000E .dbline 15
000E ; LCD_en_write();
000E 0DD0 rcall _LCD_en_write
0010 .dbline 16
0010 ; delay_nus(40);
0010 08E2 ldi R16,40
0012 10E0 ldi R17,0
0014 00D0 rcall _delay_nus
0016 .dbline 17
0016 ; LCD_write_command(0x28); //4位显示
0016 08E2 ldi R16,40
0018 0ED0 rcall _LCD_write_command
001A .dbline 18
001A ; LCD_write_command(0x0c); //显示开
001A 0CE0 ldi R16,12
001C 0CD0 rcall _LCD_write_command
001E .dbline 19
001E ; LCD_write_command(0x01); //清屏
001E 01E0 ldi R16,1
0020 0AD0 rcall _LCD_write_command
0022 .dbline 20
0022 ; delay_nms(2);
0022 02E0 ldi R16,2
0024 10E0 ldi R17,0
0026 00D0 rcall _delay_nms
0028 .dbline -2
0028 L1:
0028 .dbline 0 ; func end
0028 0895 ret
002A .dbend
002A .dbfunc e LCD_en_write _LCD_en_write fV
.even
002A _LCD_en_write::
002A .dbline -1
002A .dbline 24
002A ; }
002A ;
002A ; void LCD_en_write(void) //液晶使能
002A ; {
002A .dbline 25
002A ; LCD_EN_PORT|=LCD_EN;
002A C39A sbi 0x18,3
002C .dbline 26
002C ; delay_nus(1);
002C 01E0 ldi R16,1
002E 10E0 ldi R17,0
0030 00D0 rcall _delay_nus
0032 .dbline 27
0032 ; LCD_EN_PORT&=~LCD_EN;
0032 C398 cbi 0x18,3
0034 .dbline -2
0034 L2:
0034 .dbline 0 ; func end
0034 0895 ret
0036 .dbend
0036 .dbfunc e LCD_write_command _LCD_write_command fV
0036 ; command -> R20
.even
0036 _LCD_write_command::
0036 00D0 rcall push_gset1
0038 402F mov R20,R16
003A .dbline -1
003A .dbline 31
003A ; }
003A ;
003A ; void LCD_write_command(unsigned char command) //写指令
003A ; {
003A .dbline 32
003A ; delay_nus(16);
003A 00E1 ldi R16,16
003C 10E0 ldi R17,0
003E 00D0 rcall _delay_nus
0040 .dbline 33
0040 ; LCD_RS_PORT&=~LCD_RS; //RS=0
0040 C298 cbi 0x18,2
0042 .dbline 34
0042 ; LCD_DATA_PORT&=0X0f; //清高四位
0042 88B3 in R24,0x18
0044 8F70 andi R24,15
0046 88BB out 0x18,R24
0048 .dbline 35
0048 ; LCD_DATA_PORT|=command&0xf0; //写高四位
0048 842F mov R24,R20
004A 807F andi R24,240
004C 28B2 in R2,0x18
004E 282A or R2,R24
0050 28BA out 0x18,R2
0052 .dbline 36
0052 ; LCD_en_write();
0052 EBDF rcall _LCD_en_write
0054 .dbline 37
0054 ; command=command<<4; //低四位移到高四位
0054 842F mov R24,R20
0056 8F70 andi R24,#0x0F
0058 8295 swap R24
005A 482F mov R20,R24
005C .dbline 38
005C ; LCD_DATA_PORT&=0x0f; //清高四位
005C 88B3 in R24,0x18
005E 8F70 andi R24,15
0060 88BB out 0x18,R24
0062 .dbline 39
0062 ; LCD_DATA_PORT|=command&0xf0; //写低四位
0062 842F mov R24,R20
0064 807F andi R24,240
0066 28B2 in R2,0x18
0068 282A or R2,R24
006A 28BA out 0x18,R2
006C .dbline 40
006C ; LCD_en_write();
006C DEDF rcall _LCD_en_write
006E .dbline -2
006E L3:
006E 00D0 rcall pop_gset1
0070 .dbline 0 ; func end
0070 0895 ret
0072 .dbsym r command 20 c
0072 .dbend
0072 .dbfunc e LCD_write_data _LCD_write_data fV
0072 ; data -> R20
.even
0072 _LCD_write_data::
0072 00D0 rcall push_gset1
0074 402F mov R20,R16
0076 .dbline -1
0076 .dbline 45
0076 ;
0076 ; }
0076 ;
0076 ; void LCD_write_data(unsigned char data) //写数据
0076 ; {
0076 .dbline 46
0076 ; delay_nus(16);
0076 00E1 ldi R16,16
0078 10E0 ldi R17,0
007A 00D0 rcall _delay_nus
007C .dbline 47
007C ; LCD_RS_PORT|=LCD_RS; //RS=1
007C C29A sbi 0x18,2
007E .dbline 48
007E ; LCD_DATA_PORT&=0X0f; //清高四位
007E 88B3 in R24,0x18
0080 8F70 andi R24,15
0082 88BB out 0x18,R24
0084 .dbline 49
0084 ; LCD_DATA_PORT|=data&0xf0; //写高四位
0084 842F mov R24,R20
0086 807F andi R24,240
0088 28B2 in R2,0x18
008A 282A or R2,R24
008C 28BA out 0x18,R2
008E .dbline 50
008E ; LCD_en_write();
008E CDDF rcall _LCD_en_write
0090 .dbline 51
0090 ; data=data<<4; //低四位移到高四位
0090 842F mov R24,R20
0092 8F70 andi R24,#0x0F
0094 8295 swap R24
0096 482F mov R20,R24
0098 .dbline 52
0098 ; LCD_DATA_PORT&=0X0f; //清高四位
0098 88B3 in R24,0x18
009A 8F70 andi R24,15
009C 88BB out 0x18,R24
009E .dbline 53
009E ; LCD_DATA_PORT|=data&0xf0; //写低四位
009E 842F mov R24,R20
00A0 807F andi R24,240
00A2 28B2 in R2,0x18
00A4 282A or R2,R24
00A6 28BA out 0x18,R2
00A8 .dbline 54
00A8 ; LCD_en_write();
00A8 C0DF rcall _LCD_en_write
00AA .dbline -2
00AA L4:
00AA 00D0 rcall pop_gset1
00AC .dbline 0 ; func end
00AC 0895 ret
00AE .dbsym r data 20 c
00AE .dbend
00AE .dbfunc e LCD_set_xy _LCD_set_xy fV
00AE ; address -> R20
00AE ; y -> R20
00AE ; x -> R22
.even
00AE _LCD_set_xy::
00AE 00D0 rcall push_gset2
00B0 422F mov R20,R18
00B2 602F mov R22,R16
00B4 .dbline -1
00B4 .dbline 59
00B4 ; }
00B4 ;
00B4 ;
00B4 ; void LCD_set_xy( unsigned char x, unsigned char y ) //写地址函数
00B4 ; {
00B4 .dbline 61
00B4 ; unsigned char address;
00B4 ; if (y == 0) address = 0x80 + x;
00B4 4423 tst R20
00B6 19F4 brne L6
00B8 .dbline 61
00B8 462F mov R20,R22
00BA 4058 subi R20,128 ; addi 128
00BC 02C0 rjmp L7
00BE L6:
00BE .dbline 62
00BE ; else address = 0xc0 + x;
00BE 462F mov R20,R22
00C0 4054 subi R20,64 ; addi 192
00C2 L7:
00C2 .dbline 63
00C2 ; LCD_write_command( address);
00C2 042F mov R16,R20
00C4 B8DF rcall _LCD_write_command
00C6 .dbline -2
00C6 L5:
00C6 00D0 rcall pop_gset2
00C8 .dbline 0 ; func end
00C8 0895 ret
00CA .dbsym r address 20 c
00CA .dbsym r y 20 c
00CA .dbsym r x 22 c
00CA .dbend
00CA .dbfunc e LCD_write_string _LCD_write_string fV
00CA ; s -> R20,R21
00CA ; Y -> R10
00CA ; X -> R22
.even
00CA _LCD_write_string::
00CA 00D0 rcall push_gset3
00CC A22E mov R10,R18
00CE 602F mov R22,R16
00D0 4E81 ldd R20,y+6
00D2 5F81 ldd R21,y+7
00D4 .dbline -1
00D4 .dbline 67
00D4 ; }
00D4 ;
00D4 ; void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) //列x=0~15,行y=0,1
00D4 ; {
00D4 .dbline 68
00D4 ; LCD_set_xy( X, Y ); //写地址
00D4 2A2D mov R18,R10
00D6 062F mov R16,R22
00D8 EADF rcall _LCD_set_xy
00DA 05C0 rjmp L10
00DC L9:
00DC .dbline 70
00DC .dbline 71
00DC FA01 movw R30,R20
00DE 0081 ldd R16,z+0
00E0 C8DF rcall _LCD_write_data
00E2 .dbline 72
00E2 4F5F subi R20,255 ; offset = 1
00E4 5F4F sbci R21,255
00E6 .dbline 73
00E6 L10:
00E6 .dbline 69
00E6 ; while (*s) // 写显示字符
00E6 FA01 movw R30,R20
00E8 2080 ldd R2,z+0
00EA 2220 tst R2
00EC B9F7 brne L9
00EE .dbline -2
00EE L8:
00EE 00D0 rcall pop_gset3
00F0 .dbline 0 ; func end
00F0 0895 ret
00F2 .dbsym r s 20 pc
00F2 .dbsym r Y 10 c
00F2 .dbsym r X 22 c
00F2 .dbend
00F2 .dbfunc e LCD_write_char _LCD_write_char fV
00F2 ; data -> y+4
00F2 ; Y -> R22
00F2 ; X -> R20
.even
00F2 _LCD_write_char::
00F2 00D0 rcall push_gset2
00F4 622F mov R22,R18
00F6 402F mov R20,R16
00F8 .dbline -1
00F8 .dbline 78
00F8 ; {
00F8 ; LCD_write_data( *s );
00F8 ; s ++;
00F8 ; }
00F8 ;
00F8 ; }
00F8 ;
00F8 ; void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data) //列x=0~15,行y=0,1
00F8 ; {
00F8 .dbline 79
00F8 ; LCD_set_xy( X, Y ); //写地址
00F8 262F mov R18,R22
00FA 042F mov R16,R20
00FC D8DF rcall _LCD_set_xy
00FE .dbline 80
00FE ; LCD_write_data( data);
00FE 0C81 ldd R16,y+4
0100 B8DF rcall _LCD_write_data
0102 .dbline -2
0102 L12:
0102 00D0 rcall pop_gset2
0104 .dbline 0 ; func end
0104 0895 ret
0106 .dbsym l data 4 c
0106 .dbsym r Y 22 c
0106 .dbsym r X 20 c
0106 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -