📄 lcd.lis
字号:
.module lcd.c
.area text(rom, con, rel)
0000 .dbfile F:\我的设计\delphi\uartdispy\mcu\lcd.c
0000 .dbfunc e LCD_init _LCD_init fV
.even
0000 _LCD_init::
0000 .dbline -1
0000 .dbline 22
0000 ; /*********************************Copyright (c)*********************************
0000 ; **
0000 ; ** 文 件 名: LCD.c
0000 ; ** 最后修改日期: 2005年06月8日
0000 ; ** 描 述: 1602液晶驱动函数
0000 ; ** 版 本: V1.0
0000 ; ** 主 控 芯 片:M16 晶振频率:8 MHZ
0000 ; *******************************************************************************/
0000 ; #include <iom16v.h>
0000 ; #include <macros.h>
0000 ; #include "function.h"
0000 ; #include "define.h"
0000 ; #include "defineLCD.h"
0000 ; /******************************************************************************
0000 ;
0000 ;
0000 ; 函数定义
0000 ;
0000 ; ******************************************************************************/
0000 ;
0000 ; void LCD_init(void) //液晶初始化
0000 ; {
0000 .dbline 23
0000 ; delay_nms(15);
0000 0FE0 ldi R16,15
0002 10E0 ldi R17,0
0004 0E940000 xcall _delay_nms
0008 .dbline 24
0008 ; LCD_write_char(0x28,0); //4位显示
0008 2227 clr R18
000A 3327 clr R19
000C 08E2 ldi R16,40
000E 10E0 ldi R17,0
0010 3ED0 xcall _LCD_write_char
0012 .dbline 25
0012 ; LCD_write_char(0x0c,0); //显示开
0012 2227 clr R18
0014 3327 clr R19
0016 0CE0 ldi R16,12
0018 10E0 ldi R17,0
001A 39D0 xcall _LCD_write_char
001C .dbline 26
001C ; LCD_write_char(0x01,0); //清屏
001C 2227 clr R18
001E 3327 clr R19
0020 01E0 ldi R16,1
0022 10E0 ldi R17,0
0024 34D0 xcall _LCD_write_char
0026 .dbline -2
0026 L1:
0026 .dbline 0 ; func end
0026 0895 ret
0028 .dbend
0028 .dbfunc e LCD_write_string _LCD_write_string fV
0028 ; s -> R20,R21
0028 ; Y -> R10
0028 ; X -> R22
.even
0028 _LCD_write_string::
0028 0E940000 xcall push_gset3
002C A22E mov R10,R18
002E 602F mov R22,R16
0030 4E81 ldd R20,y+6
0032 5F81 ldd R21,y+7
0034 .dbline -1
0034 .dbline 31
0034 ; }
0034 ;
0034 ;
0034 ; void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
0034 ; {
0034 .dbline 32
0034 ; LCD_set_xy( X, Y ); //写地址
0034 2A2D mov R18,R10
0036 062F mov R16,R22
0038 10D0 xcall _LCD_set_xy
003A 08C0 xjmp L4
003C L3:
003C .dbline 35
003C .dbline 36
003C FA01 movw R30,R20
003E 2081 ldd R18,z+0
0040 3327 clr R19
0042 0027 clr R16
0044 1127 clr R17
0046 23D0 xcall _LCD_write_char
0048 .dbline 37
0048 4F5F subi R20,255 ; offset = 1
004A 5F4F sbci R21,255
004C .dbline 38
004C L4:
004C .dbline 34
004C ;
004C ; while (*s) // 写显示字符
004C FA01 movw R30,R20
004E 2080 ldd R2,z+0
0050 2220 tst R2
0052 A1F7 brne L3
0054 .dbline -2
0054 L2:
0054 0E940000 xcall pop_gset3
0058 .dbline 0 ; func end
0058 0895 ret
005A .dbsym r s 20 pc
005A .dbsym r Y 10 c
005A .dbsym r X 22 c
005A .dbend
005A .dbfunc e LCD_set_xy _LCD_set_xy fV
005A ; address -> R20
005A ; y -> R20
005A ; x -> R22
.even
005A _LCD_set_xy::
005A 0E940000 xcall push_gset2
005E 422F mov R20,R18
0060 602F mov R22,R16
0062 .dbline -1
0062 .dbline 43
0062 ; {
0062 ; LCD_write_char( 0, *s );
0062 ; s ++;
0062 ; }
0062 ; }
0062 ;
0062 ;
0062 ; void LCD_set_xy( unsigned char x, unsigned char y ) //写地址函数
0062 ; {
0062 .dbline 45
0062 ; unsigned char address;
0062 ; if (y == 0) address = 0x80 + x;
0062 4423 tst R20
0064 19F4 brne L7
0066 .dbline 45
0066 462F mov R20,R22
0068 4058 subi R20,128 ; addi 128
006A 02C0 xjmp L8
006C L7:
006C .dbline 47
006C ; else
006C ; address = 0xc0 + x;
006C 462F mov R20,R22
006E 4054 subi R20,64 ; addi 192
0070 L8:
0070 .dbline 48
0070 ; LCD_write_char( address, 0 );
0070 2227 clr R18
0072 3327 clr R19
0074 042F mov R16,R20
0076 1127 clr R17
0078 0AD0 xcall _LCD_write_char
007A .dbline -2
007A L6:
007A 0E940000 xcall pop_gset2
007E .dbline 0 ; func end
007E 0895 ret
0080 .dbsym r address 20 c
0080 .dbsym r y 20 c
0080 .dbsym r x 22 c
0080 .dbend
0080 .dbfunc e LCD_en_write _LCD_en_write fV
.even
0080 _LCD_en_write::
0080 .dbline -1
0080 .dbline 52
0080 ; }
0080 ;
0080 ; void LCD_en_write(void) //液晶使能
0080 ; {
0080 .dbline 53
0080 ; LCD_EN_PORT|=LCD_EN;
0080 AF9A sbi 0x15,7
0082 .dbline 54
0082 ; delay_nus(1);
0082 01E0 ldi R16,1
0084 10E0 ldi R17,0
0086 0E940000 xcall _delay_nus
008A .dbline 55
008A ; LCD_EN_PORT&=~LCD_EN;
008A AF98 cbi 0x15,7
008C .dbline -2
008C L9:
008C .dbline 0 ; func end
008C 0895 ret
008E .dbend
008E .dbfunc e LCD_write_char _LCD_write_char fV
008E ; data_temp -> R22,R23
008E ; command_temp -> R20,R21
008E ; data -> R12,R13
008E ; command -> R10,R11
.even
008E _LCD_write_char::
008E 0E940000 xcall push_gset4
0092 6901 movw R12,R18
0094 5801 movw R10,R16
0096 .dbline -1
0096 .dbline 59
0096 ; }
0096 ;
0096 ; void LCD_write_char(unsigned command,unsigned data) // 写数据
0096 ; {
0096 .dbline 61
0096 ; unsigned command_temp,data_temp;
0096 ; command_temp=command;
0096 A501 movw R20,R10
0098 .dbline 62
0098 ; data_temp=data;
0098 B601 movw R22,R12
009A .dbline 63
009A ; delay_nus(16);
009A 00E1 ldi R16,16
009C 10E0 ldi R17,0
009E 0E940000 xcall _delay_nus
00A2 .dbline 64
00A2 ; if(command==0)
00A2 4030 cpi R20,0
00A4 4507 cpc R20,R21
00A6 11F5 brne L11
00A8 X0:
00A8 .dbline 65
00A8 ; {
00A8 .dbline 66
00A8 ; LCD_RS_PORT|=LCD_RS; //RS=1
00A8 AE9A sbi 0x15,6
00AA .dbline 67
00AA ; LCD_DATA_PORT&=0X0f;
00AA 8BB3 in R24,0x1b
00AC 8F70 andi R24,15
00AE 8BBB out 0x1b,R24
00B0 .dbline 68
00B0 ; LCD_DATA_PORT|=data_temp&0xf0; //写高四位
00B0 CB01 movw R24,R22
00B2 807F andi R24,240
00B4 9070 andi R25,0
00B6 2BB2 in R2,0x1b
00B8 3324 clr R3
00BA 282A or R2,R24
00BC 392A or R3,R25
00BE 2BBA out 0x1b,R2
00C0 .dbline 69
00C0 ; LCD_en_write();
00C0 DFDF xcall _LCD_en_write
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 8BB3 in R24,0x1b
00D4 8F70 andi R24,15
00D6 8BBB out 0x1b,R24
00D8 .dbline 72
00D8 ; LCD_DATA_PORT|=data_temp&0xf0; //写低四位
00D8 CB01 movw R24,R22
00DA 807F andi R24,240
00DC 9070 andi R25,0
00DE 2BB2 in R2,0x1b
00E0 3324 clr R3
00E2 282A or R2,R24
00E4 392A or R3,R25
00E6 2BBA out 0x1b,R2
00E8 .dbline 73
00E8 ; LCD_en_write();
00E8 CBDF xcall _LCD_en_write
00EA .dbline 74
00EA ; }
00EA 21C0 xjmp L12
00EC L11:
00EC .dbline 76
00EC .dbline 77
00EC AE98 cbi 0x15,6
00EE .dbline 78
00EE 8BB3 in R24,0x1b
00F0 8F70 andi R24,15
00F2 8BBB out 0x1b,R24
00F4 .dbline 79
00F4 CA01 movw R24,R20
00F6 807F andi R24,240
00F8 9070 andi R25,0
00FA 2BB2 in R2,0x1b
00FC 3324 clr R3
00FE 282A or R2,R24
0100 392A or R3,R25
0102 2BBA out 0x1b,R2
0104 .dbline 80
0104 BDDF xcall _LCD_en_write
0106 .dbline 81
0106 440F lsl R20
0108 551F rol R21
010A 440F lsl R20
010C 551F rol R21
010E 440F lsl R20
0110 551F rol R21
0112 440F lsl R20
0114 551F rol R21
0116 .dbline 82
0116 8BB3 in R24,0x1b
0118 8F70 andi R24,15
011A 8BBB out 0x1b,R24
011C .dbline 83
011C CA01 movw R24,R20
011E 807F andi R24,240
0120 9070 andi R25,0
0122 2BB2 in R2,0x1b
0124 3324 clr R3
0126 282A or R2,R24
0128 392A or R3,R25
012A 2BBA out 0x1b,R2
012C .dbline 84
012C A9DF xcall _LCD_en_write
012E .dbline 85
012E L12:
012E .dbline -2
012E L10:
012E 0E940000 xcall pop_gset4
0132 .dbline 0 ; func end
0132 0895 ret
0134 .dbsym r data_temp 22 i
0134 .dbsym r command_temp 20 i
0134 .dbsym r data 12 i
0134 .dbsym r command 10 i
0134 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -