📄 lcd1602_init.lis
字号:
.module lcd1602_init.c
.area text(rom, con, rel)
0000 .dbfile D:\Backup\我的文档\MYDESG~1\AVR\ICC\lcd1602drive\lcd1602_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 "LCD1602.h"
0000 ;
0000 ; void LCD_init(void) //液晶初始化
0000 ; {
0000 .dbline 12
0000 ; LCD_DATA_DDR|=LCD_DATA; //数据口方向为输出
0000 81B3 in R24,0x11
0002 806F ori R24,240
0004 81BB out 0x11,R24
0006 .dbline 13
0006 ; LCD_EN_DDR|=LCD_EN; //设置EN方向为输出
0006 8A9A sbi 0x11,2
0008 .dbline 14
0008 ; LCD_RS_DDR|=LCD_RS; //设置RS方向为输出
0008 889A sbi 0x11,0
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 929A sbi 0x12,2
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 9298 cbi 0x12,2
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 32
0042 ; }
0042 ;
0042 ; void LCD_write_command(unsigned char command) //写指令
0042 ; {
0042 .dbline 33
0042 ; delay_nus(16);
0042 00E1 ldi R16,16
0044 10E0 ldi R17,0
0046 0E940000 xcall _delay_nus
004A .dbline 34
004A ; LCD_RS_PORT&=~LCD_RS; //RS=0
004A 9098 cbi 0x12,0
004C .dbline 35
004C ; LCD_DATA_PORT&=0X0f; //清高四位
004C 82B3 in R24,0x12
004E 8F70 andi R24,15
0050 82BB out 0x12,R24
0052 .dbline 36
0052 ; LCD_DATA_PORT|=command&0xf0; //写高四位
0052 842F mov R24,R20
0054 807F andi R24,240
0056 22B2 in R2,0x12
0058 282A or R2,R24
005A 22BA out 0x12,R2
005C .dbline 37
005C ; LCD_en_write();
005C E8DF xcall _LCD_en_write
005E .dbline 38
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 39
0066 ; LCD_DATA_PORT&=0x0f; //清高四位
0066 82B3 in R24,0x12
0068 8F70 andi R24,15
006A 82BB out 0x12,R24
006C .dbline 40
006C ; LCD_DATA_PORT|=command&0xf0; //写低四位
006C 842F mov R24,R20
006E 807F andi R24,240
0070 22B2 in R2,0x12
0072 282A or R2,R24
0074 22BA out 0x12,R2
0076 .dbline 41
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 46
0084 ;
0084 ; }
0084 ;
0084 ; void LCD_write_data(unsigned char data) //写数据
0084 ; {
0084 .dbline 47
0084 ; delay_nus(16);
0084 00E1 ldi R16,16
0086 10E0 ldi R17,0
0088 0E940000 xcall _delay_nus
008C .dbline 48
008C ; LCD_RS_PORT|=LCD_RS; //RS=1
008C 909A sbi 0x12,0
008E .dbline 49
008E ; LCD_DATA_PORT&=0X0f; //清高四位
008E 82B3 in R24,0x12
0090 8F70 andi R24,15
0092 82BB out 0x12,R24
0094 .dbline 50
0094 ; LCD_DATA_PORT|=data&0xf0; //写高四位
0094 842F mov R24,R20
0096 807F andi R24,240
0098 22B2 in R2,0x12
009A 282A or R2,R24
009C 22BA out 0x12,R2
009E .dbline 51
009E ; LCD_en_write();
009E C7DF xcall _LCD_en_write
00A0 .dbline 52
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 53
00A8 ; LCD_DATA_PORT&=0X0f; //清高四位
00A8 82B3 in R24,0x12
00AA 8F70 andi R24,15
00AC 82BB out 0x12,R24
00AE .dbline 54
00AE ; LCD_DATA_PORT|=data&0xf0; //写低四位
00AE 842F mov R24,R20
00B0 807F andi R24,240
00B2 22B2 in R2,0x12
00B4 282A or R2,R24
00B6 22BA out 0x12,R2
00B8 .dbline 55
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 60
00C8 ; }
00C8 ;
00C8 ;
00C8 ; void LCD_set_xy( unsigned char x, unsigned char y ) //写地址函数
00C8 ; {
00C8 .dbline 62
00C8 ; unsigned char address;
00C8 ; if (y == 0) address = 0x80 + x;
00C8 4423 tst R20
00CA 19F4 brne L6
00CC .dbline 62
00CC 462F mov R20,R22
00CE 4058 subi R20,128 ; addi 128
00D0 02C0 xjmp L7
00D2 L6:
00D2 .dbline 63
00D2 ; else address = 0xc0 + x;
00D2 462F mov R20,R22
00D4 4054 subi R20,64 ; addi 192
00D6 L7:
00D6 .dbline 64
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 68
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 69
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 71
00F4 .dbline 72
00F4 FA01 movw R30,R20
00F6 0081 ldd R16,z+0
00F8 C2DF xcall _LCD_write_data
00FA .dbline 73
00FA 4F5F subi R20,255 ; offset = 1
00FC 5F4F sbci R21,255
00FE .dbline 74
00FE L10:
00FE .dbline 70
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 79
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 80
0114 ; LCD_set_xy( X, Y ); //写地址
0114 262F mov R18,R22
0116 042F mov R16,R20
0118 D3DF xcall _LCD_set_xy
011A .dbline 81
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 + -