📄 lcd_init.lis
字号:
.module LCD_init.c
.area text(rom, con, rel)
0000 .dbfile G:\文档\LCD1602_C\LCD_init.c
0000 .dbfunc e LCD_init _LCD_init fV
.even
0000 _LCD_init::
0000 .dbline -1
0000 .dbline 11
0000 ; /*----------------------------------------------------
0000 ; 液晶LCD1602C 使用4条数据线(D4~D7)
0000 ; 编译器:ICC-AVR v6.31A 日期: 2005-11-24 20:29:57
0000 ; 目标芯片 : M16
0000 ; 时钟: 8.0000Mhz
0000 ; 作者:archeng504
0000 ; ---------------------------------------------------*/
0000 ; #include "LCD.h"
0000 ;
0000 ; void LCD_init(void) //液晶初始化
0000 ; {
0000 .dbline 12
0000 ; LCD_DATA_DDR|=LCD_DATA; //数据口方向为输出
0000 8AB3 in R24,0x1a
0002 806F ori R24,240
0004 8ABB out 0x1a,R24
0006 .dbline 13
0006 ; LCD_EN_DDR|=LCD_EN; //设置EN方向为输出
0006 D39A sbi 0x1a,3
0008 .dbline 14
0008 ; LCD_RS_DDR|=LCD_RS; //设置RS方向为输出
0008 D29A sbi 0x1a,2
000A .dbline 15
000A ; LCD_write_command(0x28);
000A 08E2 ldi R16,40
000C 17D0 xcall _LCD_write_command
000E .dbline 16
000E ; LCD_en_write();
000E 0FD0 xcall _LCD_en_write
0010 .dbline 17
0010 ; delay_nus(40);
0010 08E2 ldi R16,40
0012 10E0 ldi R17,0
0014 0E940000 xcall _delay_nus
0018 .dbline 18
0018 ; LCD_write_command(0x28); //4位显示
0018 08E2 ldi R16,40
001A 10D0 xcall _LCD_write_command
001C .dbline 19
001C ; LCD_write_command(0x0c); //显示开
001C 0CE0 ldi R16,12
001E 0ED0 xcall _LCD_write_command
0020 .dbline 20
0020 ; LCD_write_command(0x01); //清屏
0020 01E0 ldi R16,1
0022 0CD0 xcall _LCD_write_command
0024 .dbline 21
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 25
002E ; }
002E ;
002E ; void LCD_en_write(void) //液晶使能
002E ; {
002E .dbline 26
002E ; LCD_EN_PORT|=LCD_EN;
002E DB9A sbi 0x1b,3
0030 .dbline 27
0030 ; delay_nus(1);
0030 01E0 ldi R16,1
0032 10E0 ldi R17,0
0034 0E940000 xcall _delay_nus
0038 .dbline 28
0038 ; LCD_EN_PORT&=~LCD_EN;
0038 DB98 cbi 0x1b,3
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 4A93 st -y,R20
003E 402F mov R20,R16
0040 .dbline -1
0040 .dbline 32
0040 ; }
0040 ;
0040 ; void LCD_write_command(unsigned char command) //写指令
0040 ; {
0040 .dbline 33
0040 ; delay_nus(16);
0040 00E1 ldi R16,16
0042 10E0 ldi R17,0
0044 0E940000 xcall _delay_nus
0048 .dbline 34
0048 ; LCD_RS_PORT&=~LCD_RS; //RS=0
0048 DA98 cbi 0x1b,2
004A .dbline 35
004A ; LCD_DATA_PORT&=0X0f; //清高四位
004A 8BB3 in R24,0x1b
004C 8F70 andi R24,15
004E 8BBB out 0x1b,R24
0050 .dbline 36
0050 ; LCD_DATA_PORT|=command&0xf0; //写高四位
0050 842F mov R24,R20
0052 807F andi R24,240
0054 2BB2 in R2,0x1b
0056 282A or R2,R24
0058 2BBA out 0x1b,R2
005A .dbline 37
005A ; LCD_en_write();
005A E9DF xcall _LCD_en_write
005C .dbline 38
005C ; command=command<<4; //低四位移到高四位
005C 842F mov R24,R20
005E 8F70 andi R24,#0x0F
0060 8295 swap R24
0062 482F mov R20,R24
0064 .dbline 39
0064 ; LCD_DATA_PORT&=0x0f; //清高四位
0064 8BB3 in R24,0x1b
0066 8F70 andi R24,15
0068 8BBB out 0x1b,R24
006A .dbline 40
006A ; LCD_DATA_PORT|=command&0xf0; //写低四位
006A 842F mov R24,R20
006C 807F andi R24,240
006E 2BB2 in R2,0x1b
0070 282A or R2,R24
0072 2BBA out 0x1b,R2
0074 .dbline 41
0074 ; LCD_en_write();
0074 DCDF xcall _LCD_en_write
0076 .dbline -2
0076 L3:
0076 .dbline 0 ; func end
0076 4991 ld R20,y+
0078 0895 ret
007A .dbsym r command 20 c
007A .dbend
007A .dbfunc e LCD_write_data _LCD_write_data fV
007A ; data -> R20
.even
007A _LCD_write_data::
007A 4A93 st -y,R20
007C 402F mov R20,R16
007E .dbline -1
007E .dbline 46
007E ;
007E ; }
007E ;
007E ; void LCD_write_data(unsigned char data) //写数据
007E ; {
007E .dbline 47
007E ; delay_nus(16);
007E 00E1 ldi R16,16
0080 10E0 ldi R17,0
0082 0E940000 xcall _delay_nus
0086 .dbline 48
0086 ; LCD_RS_PORT|=LCD_RS; //RS=1
0086 DA9A sbi 0x1b,2
0088 .dbline 49
0088 ; LCD_DATA_PORT&=0X0f; //清高四位
0088 8BB3 in R24,0x1b
008A 8F70 andi R24,15
008C 8BBB out 0x1b,R24
008E .dbline 50
008E ; LCD_DATA_PORT|=data&0xf0; //写高四位
008E 842F mov R24,R20
0090 807F andi R24,240
0092 2BB2 in R2,0x1b
0094 282A or R2,R24
0096 2BBA out 0x1b,R2
0098 .dbline 51
0098 ; LCD_en_write();
0098 CADF xcall _LCD_en_write
009A .dbline 52
009A ; data=data<<4; //低四位移到高四位
009A 842F mov R24,R20
009C 8F70 andi R24,#0x0F
009E 8295 swap R24
00A0 482F mov R20,R24
00A2 .dbline 53
00A2 ; LCD_DATA_PORT&=0X0f; //清高四位
00A2 8BB3 in R24,0x1b
00A4 8F70 andi R24,15
00A6 8BBB out 0x1b,R24
00A8 .dbline 54
00A8 ; LCD_DATA_PORT|=data&0xf0; //写低四位
00A8 842F mov R24,R20
00AA 807F andi R24,240
00AC 2BB2 in R2,0x1b
00AE 282A or R2,R24
00B0 2BBA out 0x1b,R2
00B2 .dbline 55
00B2 ; LCD_en_write();
00B2 BDDF xcall _LCD_en_write
00B4 .dbline -2
00B4 L4:
00B4 .dbline 0 ; func end
00B4 4991 ld R20,y+
00B6 0895 ret
00B8 .dbsym r data 20 c
00B8 .dbend
00B8 .dbfunc e LCD_set_xy _LCD_set_xy fV
00B8 ; address -> R20
00B8 ; y -> R10
00B8 ; x -> R22
.even
00B8 _LCD_set_xy::
00B8 0E940000 xcall push_xgsetF00C
00BC A22E mov R10,R18
00BE 602F mov R22,R16
00C0 .dbline -1
00C0 .dbline 60
00C0 ; }
00C0 ;
00C0 ;
00C0 ; void LCD_set_xy( unsigned char x, unsigned char y ) //写地址函数
00C0 ; {
00C0 .dbline 62
00C0 ; unsigned char address;
00C0 ; if (y == 0) address = 0x80 + x;
00C0 AA20 tst R10
00C2 19F4 brne L6
00C4 X0:
00C4 .dbline 62
00C4 462F mov R20,R22
00C6 4058 subi R20,128 ; addi 128
00C8 02C0 xjmp L7
00CA L6:
00CA .dbline 63
00CA ; else address = 0xc0 + x;
00CA 462F mov R20,R22
00CC 4054 subi R20,64 ; addi 192
00CE L7:
00CE .dbline 64
00CE ; LCD_write_command( address);
00CE 042F mov R16,R20
00D0 B5DF xcall _LCD_write_command
00D2 .dbline -2
00D2 L5:
00D2 .dbline 0 ; func end
00D2 0C940000 xjmp pop_xgsetF00C
00D6 .dbsym r address 20 c
00D6 .dbsym r y 10 c
00D6 .dbsym r x 22 c
00D6 .dbend
00D6 .dbfunc e LCD_write_string _LCD_write_string fV
00D6 ; s -> R20,R21
00D6 ; Y -> R12
00D6 ; X -> R10
.even
00D6 _LCD_write_string::
00D6 0E940000 xcall push_xgset303C
00DA C22E mov R12,R18
00DC A02E mov R10,R16
00DE 4E81 ldd R20,y+6
00E0 5F81 ldd R21,y+7
00E2 .dbline -1
00E2 .dbline 68
00E2 ; }
00E2 ;
00E2 ; void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) //列x=0~15,行y=0,1
00E2 ; {
00E2 .dbline 69
00E2 ; LCD_set_xy( X, Y ); //写地址
00E2 2C2D mov R18,R12
00E4 0A2D mov R16,R10
00E6 E8DF xcall _LCD_set_xy
00E8 05C0 xjmp L10
00EA L9:
00EA .dbline 71
00EA ; while (*s) // 写显示字符
00EA ; {
00EA .dbline 72
00EA ; LCD_write_data( *s );
00EA FA01 movw R30,R20
00EC 0081 ldd R16,z+0
00EE C5DF xcall _LCD_write_data
00F0 .dbline 73
00F0 ; s ++;
00F0 4F5F subi R20,255 ; offset = 1
00F2 5F4F sbci R21,255
00F4 .dbline 74
00F4 ; }
00F4 L10:
00F4 .dbline 70
00F4 FA01 movw R30,R20
00F6 2080 ldd R2,z+0
00F8 2220 tst R2
00FA B9F7 brne L9
00FC X1:
00FC .dbline -2
00FC L8:
00FC .dbline 0 ; func end
00FC 0C940000 xjmp pop_xgset303C
0100 .dbsym r s 20 pc
0100 .dbsym r Y 12 c
0100 .dbsym r X 10 c
0100 .dbend
0100 .dbfunc e LCD_write_char _LCD_write_char fV
0100 ; data -> y+2
0100 ; Y -> R12
0100 ; X -> R10
.even
0100 _LCD_write_char::
0100 AA92 st -y,R10
0102 CA92 st -y,R12
0104 C22E mov R12,R18
0106 A02E mov R10,R16
0108 .dbline -1
0108 .dbline 79
0108 ;
0108 ; }
0108 ;
0108 ; void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data) //列x=0~15,行y=0,1
0108 ; {
0108 .dbline 80
0108 ; LCD_set_xy( X, Y ); //写地址
0108 2C2D mov R18,R12
010A 0A2D mov R16,R10
010C D5DF xcall _LCD_set_xy
010E .dbline 81
010E ; LCD_write_data( data);
010E 0A81 ldd R16,y+2
0110 B4DF xcall _LCD_write_data
0112 .dbline -2
0112 L12:
0112 .dbline 0 ; func end
0112 C990 ld R12,y+
0114 A990 ld R10,y+
0116 0895 ret
0118 .dbsym l data 2 c
0118 .dbsym r Y 12 c
0118 .dbsym r X 10 c
0118 .dbend
0118 ;
0118 ; }
0118 ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -