📄 lcd_init.lis
字号:
.module LCD_init.c
.area text(rom, con, rel)
0000 .dbfile D:\+++资料+++\学习\avr\+++精华+++\定时器\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
0000 ; 目标芯片 : M16
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 8AB3 in R24,0x1a
0002 806F ori R24,240
0004 8ABB out 0x1a,R24
0006 .dbline 12
0006 ; LCD_EN_DDR|=LCD_EN; //设置EN方向为输出
0006 A79A sbi 0x14,7
0008 .dbline 13
0008 ; LCD_RS_DDR|=LCD_RS; //设置RS方向为输出
0008 A69A sbi 0x14,6
000A .dbline 14
000A ; LCD_write_command(0x28);
000A 08E2 ldi R16,40
000C 17D0 xcall _LCD_write_command
000E .dbline 15
000E ; LCD_en_write();
000E 0FD0 xcall _LCD_en_write
0010 .dbline 16
0010 ; delay_nus(40);
0010 08E2 ldi R16,40
0012 10E0 ldi R17,0
0014 0E940000 xcall _delay_nus
0018 .dbline 17
0018 ; LCD_write_command(0x28); //4位显示
0018 08E2 ldi R16,40
001A 10D0 xcall _LCD_write_command
001C .dbline 18
001C ; LCD_write_command(0x0c); //显示开
001C 0CE0 ldi R16,12
001E 0ED0 xcall _LCD_write_command
0020 .dbline 19
0020 ; LCD_write_command(0x01); //清屏
0020 01E0 ldi R16,1
0022 0CD0 xcall _LCD_write_command
0024 .dbline 20
0024 ; delay_nms(2);
0024 02E0 ldi R16,2
0026 10E0 ldi R17,0
0028 0E940000 xcall _delay_nms
002C .dbline -2
002C L1:
002C .dbline 0 ; func end
002C 0895 ret
002E .dbend
002E .dbfunc e LCD_en_write _LCD_en_write fV
.even
002E _LCD_en_write::
002E .dbline -1
002E .dbline 24
002E ; }
002E ;
002E ; void LCD_en_write(void) //液晶使能
002E ; {
002E .dbline 25
002E ; LCD_EN_PORT|=LCD_EN;
002E AF9A sbi 0x15,7
0030 .dbline 26
0030 ; delay_nus(1);
0030 01E0 ldi R16,1
0032 10E0 ldi R17,0
0034 0E940000 xcall _delay_nus
0038 .dbline 27
0038 ; LCD_EN_PORT&=~LCD_EN;
0038 AF98 cbi 0x15,7
003A .dbline -2
003A L2:
003A .dbline 0 ; func end
003A 0895 ret
003C .dbend
003C .dbfunc e LCD_write_command _LCD_write_command fV
003C ; command -> R20
.even
003C _LCD_write_command::
003C 0E940000 xcall push_gset1
0040 402F mov R20,R16
0042 .dbline -1
0042 .dbline 31
0042 ; }
0042 ;
0042 ; void LCD_write_command(unsigned char command) //写指令
0042 ; {
0042 .dbline 32
0042 ; delay_nus(16);
0042 00E1 ldi R16,16
0044 10E0 ldi R17,0
0046 0E940000 xcall _delay_nus
004A .dbline 33
004A ; LCD_RS_PORT&=~LCD_RS; //RS=0
004A AE98 cbi 0x15,6
004C .dbline 34
004C ; LCD_DATA_PORT&=0X0f; //清高四位
004C 8BB3 in R24,0x1b
004E 8F70 andi R24,15
0050 8BBB out 0x1b,R24
0052 .dbline 35
0052 ; LCD_DATA_PORT|=command&0xf0; //写高四位
0052 842F mov R24,R20
0054 807F andi R24,240
0056 2BB2 in R2,0x1b
0058 282A or R2,R24
005A 2BBA out 0x1b,R2
005C .dbline 36
005C ; LCD_en_write();
005C E8DF xcall _LCD_en_write
005E .dbline 37
005E ; command=command<<4; //低四位移到高四位
005E 842F mov R24,R20
0060 8F70 andi R24,#0x0F
0062 8295 swap R24
0064 482F mov R20,R24
0066 .dbline 38
0066 ; LCD_DATA_PORT&=0x0f; //清高四位
0066 8BB3 in R24,0x1b
0068 8F70 andi R24,15
006A 8BBB out 0x1b,R24
006C .dbline 39
006C ; LCD_DATA_PORT|=command&0xf0; //写低四位
006C 842F mov R24,R20
006E 807F andi R24,240
0070 2BB2 in R2,0x1b
0072 282A or R2,R24
0074 2BBA out 0x1b,R2
0076 .dbline 40
0076 ; LCD_en_write();
0076 DBDF xcall _LCD_en_write
0078 .dbline -2
0078 L3:
0078 0E940000 xcall pop_gset1
007C .dbline 0 ; func end
007C 0895 ret
007E .dbsym r command 20 c
007E .dbend
007E .dbfunc e LCD_write_data _LCD_write_data fV
007E ; data -> R20
.even
007E _LCD_write_data::
007E 0E940000 xcall push_gset1
0082 402F mov R20,R16
0084 .dbline -1
0084 .dbline 45
0084 ;
0084 ; }
0084 ;
0084 ; void LCD_write_data(unsigned char data) //写数据
0084 ; {
0084 .dbline 46
0084 ; delay_nus(16);
0084 00E1 ldi R16,16
0086 10E0 ldi R17,0
0088 0E940000 xcall _delay_nus
008C .dbline 47
008C ; LCD_RS_PORT|=LCD_RS; //RS=1
008C AE9A sbi 0x15,6
008E .dbline 48
008E ; LCD_DATA_PORT&=0X0f; //清高四位
008E 8BB3 in R24,0x1b
0090 8F70 andi R24,15
0092 8BBB out 0x1b,R24
0094 .dbline 49
0094 ; LCD_DATA_PORT|=data&0xf0; //写高四位
0094 842F mov R24,R20
0096 807F andi R24,240
0098 2BB2 in R2,0x1b
009A 282A or R2,R24
009C 2BBA out 0x1b,R2
009E .dbline 50
009E ; LCD_en_write();
009E C7DF xcall _LCD_en_write
00A0 .dbline 51
00A0 ; data=data<<4; //低四位移到高四位
00A0 842F mov R24,R20
00A2 8F70 andi R24,#0x0F
00A4 8295 swap R24
00A6 482F mov R20,R24
00A8 .dbline 52
00A8 ; LCD_DATA_PORT&=0X0f; //清高四位
00A8 8BB3 in R24,0x1b
00AA 8F70 andi R24,15
00AC 8BBB out 0x1b,R24
00AE .dbline 53
00AE ; LCD_DATA_PORT|=data&0xf0; //写低四位
00AE 842F mov R24,R20
00B0 807F andi R24,240
00B2 2BB2 in R2,0x1b
00B4 282A or R2,R24
00B6 2BBA out 0x1b,R2
00B8 .dbline 54
00B8 ; LCD_en_write();
00B8 BADF xcall _LCD_en_write
00BA .dbline -2
00BA L4:
00BA 0E940000 xcall pop_gset1
00BE .dbline 0 ; func end
00BE 0895 ret
00C0 .dbsym r data 20 c
00C0 .dbend
00C0 .dbfunc e LCD_set_xy _LCD_set_xy fV
00C0 ; address -> R20
00C0 ; y -> R20
00C0 ; x -> R22
.even
00C0 _LCD_set_xy::
00C0 0E940000 xcall push_gset2
00C4 422F mov R20,R18
00C6 602F mov R22,R16
00C8 .dbline -1
00C8 .dbline 59
00C8 ; }
00C8 ;
00C8 ;
00C8 ; void LCD_set_xy( unsigned char x, unsigned char y ) //写地址函数
00C8 ; {
00C8 .dbline 61
00C8 ; unsigned char address;
00C8 ; if (y == 0) address = 0x80 + x;
00C8 4423 tst R20
00CA 19F4 brne L6
00CC .dbline 61
00CC 462F mov R20,R22
00CE 4058 subi R20,128 ; addi 128
00D0 02C0 xjmp L7
00D2 L6:
00D2 .dbline 62
00D2 ; else address = 0xc0 + x;
00D2 462F mov R20,R22
00D4 4054 subi R20,64 ; addi 192
00D6 L7:
00D6 .dbline 63
00D6 ; LCD_write_command( address);
00D6 042F mov R16,R20
00D8 B1DF xcall _LCD_write_command
00DA .dbline -2
00DA L5:
00DA 0E940000 xcall pop_gset2
00DE .dbline 0 ; func end
00DE 0895 ret
00E0 .dbsym r address 20 c
00E0 .dbsym r y 20 c
00E0 .dbsym r x 22 c
00E0 .dbend
00E0 .dbfunc e LCD_write_string _LCD_write_string fV
00E0 ; s -> R20,R21
00E0 ; Y -> R10
00E0 ; X -> R22
.even
00E0 _LCD_write_string::
00E0 0E940000 xcall push_gset3
00E4 A22E mov R10,R18
00E6 602F mov R22,R16
00E8 4E81 ldd R20,y+6
00EA 5F81 ldd R21,y+7
00EC .dbline -1
00EC .dbline 67
00EC ; }
00EC ;
00EC ; void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) //列x=0~15,行y=0,1
00EC ; {
00EC .dbline 68
00EC ; LCD_set_xy( X, Y ); //写地址
00EC 2A2D mov R18,R10
00EE 062F mov R16,R22
00F0 E7DF xcall _LCD_set_xy
00F2 05C0 xjmp L10
00F4 L9:
00F4 .dbline 70
00F4 .dbline 71
00F4 FA01 movw R30,R20
00F6 0081 ldd R16,z+0
00F8 C2DF xcall _LCD_write_data
00FA .dbline 72
00FA 4F5F subi R20,255 ; offset = 1
00FC 5F4F sbci R21,255
00FE .dbline 73
00FE L10:
00FE .dbline 69
00FE ; while (*s) // 写显示字符
00FE FA01 movw R30,R20
0100 2080 ldd R2,z+0
0102 2220 tst R2
0104 B9F7 brne L9
0106 .dbline -2
0106 L8:
0106 0E940000 xcall pop_gset3
010A .dbline 0 ; func end
010A 0895 ret
010C .dbsym r s 20 pc
010C .dbsym r Y 10 c
010C .dbsym r X 22 c
010C .dbend
010C .dbfunc e LCD_write_char _LCD_write_char fV
010C ; data -> y+4
010C ; Y -> R22
010C ; X -> R20
.even
010C _LCD_write_char::
010C 0E940000 xcall push_gset2
0110 622F mov R22,R18
0112 402F mov R20,R16
0114 .dbline -1
0114 .dbline 78
0114 ; {
0114 ; LCD_write_data( *s );
0114 ; s ++;
0114 ; }
0114 ;
0114 ; }
0114 ;
0114 ; void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data) //列x=0~15,行y=0,1
0114 ; {
0114 .dbline 79
0114 ; LCD_set_xy( X, Y ); //写地址
0114 262F mov R18,R22
0116 042F mov R16,R20
0118 D3DF xcall _LCD_set_xy
011A .dbline 80
011A ; LCD_write_data( data);
011A 0C81 ldd R16,y+4
011C B0DF xcall _LCD_write_data
011E .dbline -2
011E L12:
011E 0E940000 xcall pop_gset2
0122 .dbline 0 ; func end
0122 0895 ret
0124 .dbsym l data 4 c
0124 .dbsym r Y 22 c
0124 .dbsym r X 20 c
0124 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -