⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd.asm

📁 HT44780 液晶显示驱动 里面有简单 程序和说明
💻 ASM
字号:
;LCD引脚定义
LCM_RS      EQU P2.0
LCM_EN      EQU P2.2
LCM_DATA    EQU P0
;作者:刘玉宏
;...........................................
;变量定义
RCAP_BUF0_H EQU 08H
RCAP_BUF0_L EQU 09H
RCAP_BUF1_H EQU 0AH
RCAP_BUF1_L EQU 0BH
FRQ_H       EQU 0CH
FRQ_L       EQU 0DH
DISBUF0     EQU 0EH
DISBUF1     EQU 0FH
;位定义
FLAG        EQU 20H
RCAP_END_FG EQU FLAG.0
RCAP_FULL_FG EQU FLAG.1
CF_END_FG    EQU FLAG.2
;------------------------------------------
T2CON   DATA    0C8H
RCAP2L  DATA    0CAH
RCAP2H  DATA    0CBH
TL2     DATA    0CCH
TH2     DATA    0CDH
TF2     BIT     0CFH
EXF2    BIT     0CEH
RCLK    BIT     0CDH
TCLK    BIT     0CCH
EXEN2   BIT     0CBH
TR2     BIT     0CAH
C_T2    BIT     0C9H
CP_RL2  BIT     0C8H
;作者:刘玉宏
;以下是主程序开始
        ORG 0000H
            AJMP START         ;转主程序
        ORG 0003H
            RETI
        ORG 000BH
            RETI
        ORG 0013H
            RETI
        ORG 001BH
     
        ORG 0023H
            RETI
        ORG 002BH
            RETI
            
;-------------------------------------------
        ORG 0030H
START:  MOV SP,#60H
;...........................................
        
        CLR LCM_EN                ;LCD_EN初始状态0
        LCALL INIT_LCD            ;初始化LCD
        MOV R5,#10                ;延时等待
        LCALL DELAY
        
;...........................................
        MOV A,#0                  ;0行
        MOV B,#0                  ;0列
        MOV DPTR,#TITLE           ;字符串
        LCALL LCD_PRN_STR         ;显示字符串"89c51 R TEST"
        
        MOV A,#1                  ;1行
        MOV B,#0                  ;0列
        MOV DPTR,#R_INFO           ;字符串
        LCALL LCD_PRN_STR         ;显示字符串 "R="
        SJMP $
;...........................................
;初始化LCD
;功能设定指令
;;作者:刘玉宏
;┌──────┬─────────────────────────────┬───┐
;ㄧ            ㄧ                      指令编码                            ㄧ 执行 ㄧ
;ㄧ  指令功能  ├──┬──┬──┬──┬──┬──┬──┬──┬──┬──┤ 时间 ㄧ
;ㄧ            ㄧ RS ㄧR/W ㄧDB7 ㄧDB6 ㄧDB5 ㄧDB4 ㄧDB3 ㄧDB2 ㄧDB1 ㄧDB0 ㄧ /us  ㄧ
;├──────┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼───┤
;ㄧ  功能设定  ㄧ 0  ㄧ 0  ㄧ 0  ㄧ 0  ㄧ 1  ㄧ DL ㄧ N  ㄧ F  ㄧ X  ㄧ X  ㄧ 40   ㄧ
;└──────┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴───┘
;功能:设定数据总线位数、显示的行数及字型。参数设定的情况如下:
;      位名    设置
;      DL      0=数据总线为4位        1=数据总线为8位
;      N       0=显示1行              1=显示2行
;      F       0=5×7点阵/每字符      1=5×10点阵/每字符
;显示开关控制指令
;┌──────┬─────────────────────────────┬───┐
;ㄧ            ㄧ                      指令编码                            ㄧ 执行 ㄧ
;ㄧ  指令功能  ├──┬──┬──┬──┬──┬──┬──┬──┬──┬──┤ 时间 ㄧ
;ㄧ            ㄧ RS ㄧR/W ㄧDB7 ㄧDB6 ㄧDB5 ㄧDB4 ㄧDB3 ㄧDB2 ㄧDB1 ㄧDB0 ㄧ /us  ㄧ
;├──────┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼───┤
;ㄧ显示开关控制ㄧ 0  ㄧ 0  ㄧ 0  ㄧ 0  ㄧ 0  ㄧ 0  ㄧ 1  ㄧ D  ㄧ C  ㄧ B  ㄧ  40  ㄧ
;└──────┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴───┘
;功能:控制显示器开/关、光标显示/关闭以及光标是否闪烁。参数设定的情况如下:
;      位名    设置
;       D      0=显示功能关     1=显示功能开
;       C      0=无光标         1=有光标
;       B      0=光标闪烁       1=光标不闪烁
;设定显示屏或光标移动方向指令
;
;┌──────┬─────────────────────────────┬───┐
;ㄧ            ㄧ                      指令编码                            ㄧ 执行 ㄧ
;ㄧ  指令功能  ├──┬──┬──┬──┬──┬──┬──┬──┬──┬──┤ 时间 ㄧ
;ㄧ            ㄧ RS ㄧR/W ㄧDB7 ㄧDB6 ㄧDB5 ㄧDB4 ㄧDB3 ㄧDB2 ㄧDB1 ㄧDB0 ㄧ /us  ㄧ
;├──────┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼───┤
;ㄧ设定显示屏或ㄧ 0  ㄧ 0  ㄧ 0  ㄧ 0  ㄧ 0  ㄧ 1  ㄧS/C ㄧR/L ㄧ X  ㄧ X  ㄧ  40  ㄧ
;ㄧ光标移动方向ㄧ    ㄧ    ㄧ    ㄧ    ㄧ    ㄧ    ㄧ    ㄧ    ㄧ    ㄧ    ㄧ      ㄧ
;└──────┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴───┘
;功能:使光标移位或使整个显示屏幕移位。参数设定的情况如下:
;      S/C     R/L      设定情况
;      0       0        光标左移1格,且AC值减1
;      0       1        光标右移1格,且AC值加1
;      1       0        显示器上字符全部左移一格,但光标不动
;      1       1        显示器上字符全部右移一格,但光标不动
;清屏指令
;
;┌──────┬─────────────────────────────┬───┐
;ㄧ            ㄧ                      指令编码                            ㄧ 执行 ㄧ
;ㄧ  指令功能  ├──┬──┬──┬──┬──┬──┬──┬──┬──┬──┤ 时间 ㄧ
;ㄧ            ㄧ RS ㄧR/W ㄧDB7 ㄧDB6 ㄧDB5 ㄧDB4 ㄧDB3 ㄧDB2 ㄧDB1 ㄧDB0 ㄧ /ms  ㄧ
;├──────┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼───┤
;ㄧ    清屏    ㄧ 0  ㄧ 0  ㄧ 0  ㄧ 0  ㄧ 0  ㄧ 0  ㄧ 0  ㄧ 0  ㄧ 0  ㄧ 1  ㄧ 1.64 ㄧ
;└──────┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴───┘
;功能:<1> 清除液晶显示器,即将DDRAM的内容全部填入"空白"的ASCII码20H;
;      <2> 光标归位,即将光标撤回液晶显示屏的左上方;
;      <3> 将地址计数器(AC)的值设为0。
INIT_LCD:   
            MOV LCM_DATA,#30H       ;4位I/O初始化
            LCALL EN    ;写动作
            MOV R5,#2                ;延时等待
            LCALL DELAY       
;作者:刘玉宏            
            MOV LCM_DATA,#30H       ;4位I/O初始化
            LCALL EN    ;写动作
            MOV R5,#2                ;延时等待
            LCALL DELAY       
            
            MOV LCM_DATA,#30H       ;4位I/O初始化
            LCALL EN    ;写动作
            MOV R5,#2                ;延时等待
            LCALL DELAY       
;作者:刘玉宏            
            MOV LCM_DATA,#20H       ;4位I/O初始化
            LCALL EN    ;写动作
            MOV R5,#2                ;延时等待
            LCALL DELAY       
            MOV A,#28H       
            LCALL WCOM
            MOV R5,#1                ;延时等待;作者:刘玉宏
            LCALL DELAY       
            MOV A,#0CH       
            LCALL WCOM
            MOV R5,#1                ;延时等待;作者:刘玉宏
            LCALL DELAY       
           
            MOV A,#01H       ;显示清屏
            LCALL WCOM
            MOV R5,#1                ;延时等待
            LCALL DELAY              
            RET
;-----------------------------------------------------------------
;产生下降沿用于写命令;作者:刘玉宏
EN:
            SETB LCM_EN
            LCALL DE
            CLR LCM_EN
            LCALL DE
            RET
;-----------------------------------------------------------------
DE:
            MOV R7,#10
            DJNZ R7,$
            RET
;-----------------------------------------------------------------
;写命令
;参数传递A;作者:刘玉宏
WCOM:
            PUSH B
            MOV B,A     ;A暂存
            ANL A,#0F0H ;清除低4位,保持LCD_EN为0
            MOV LCM_DATA,A;写高4位
            CLR LCM_RS  ;写命令LCM_RS=0
            LCALL EN    ;写动作
            MOV A,B     ;取出保存的参数
            RLC A
            RLC A
            RLC A
            RLC A       ;4位方式先写高4位,再写低4位
            ANL A,#0F0H ;清除低4位,保持LCD_EN为0
            MOV LCM_DATA,A
            CLR LCM_RS  ;写命令LCM_RS=0
            LCALL EN    ;写动作
            POP B
            RET;作者:刘玉宏
;--------------------------------------------------------------------
;-----------------------------------------------------------------
;写数据
;参数传递A
WDATA:
            PUSH B
            MOV B,A     ;A暂存
            ANL A,#0F0H ;清除低4位,保持LCD_EN为0
            MOV LCM_DATA,A
            SETB LCM_RS  ;写数据LCM_RS=1
            LCALL EN    ;写动作
            MOV A,B     ;取出保存的参数
            RLC A
            RLC A
            RLC A
            RLC A       ;4位方式先写高4位,再写低4位
            ANL A,#0F0H ;清除低4位,保持LCD_EN为0
            MOV LCM_DATA,A
            SETB LCM_RS  ;写数据LCM_RS=1
            LCALL EN    ;写动作
            POP B;作者:刘玉宏
            RET
;--------------------------------------------------------------------
;延时R5*10MS
DELAY:
            MOV R6,#50
D1:         MOV R7,#100
            DJNZ R7,$
            DJNZ R6,D1
            DJNZ R5,DELAY
            RET
;--------------------------------------------------------------------
;在第0行指定位置显示字符
;参数A显示字符的ascii码,B显示的位置
LCDP0:
            PUSH ACC
            MOV A,B
;设定DDRAM地址指令
;
;┌──────┬─────────────────────────────┬───┐
;ㄧ            ㄧ                      指令编码                            ㄧ 执行 ㄧ
;ㄧ  指令功能  ├──┬──┬──┬──┬──┬──┬──┬──┬──┬──┤ 时间 ㄧ
;ㄧ            ㄧ RS ㄧR/W ㄧDB7 ㄧDB6 ㄧDB5 ㄧDB4 ㄧDB3 ㄧDB2 ㄧDB1 ㄧDB0 ㄧ /us  ㄧ
;├──────┼──┼──┼──┼──┴──┴──┴──┴──┴──┴──┼───┤
;ㄧ设定CGRAM   ㄧ 0  ㄧ 0  ㄧ 1  ㄧ          DDRAM的地址(7位)              ㄧ 40   ㄧ
;ㄧ   地址     ㄧ    ㄧ    ㄧ    ㄧ                                        ㄧ      ㄧ
;└──────┴──┴──┴──┴────────────────────┴───┘
;功能:设定下一个要存入数据的CGRAM的地址。
;DDRAM地址与显示位置的对应关系;作者:刘玉宏
;
;╭┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈╮
;┊                                                                ┊
;┊00H 01H 02H 03H 04H 05H 06H 07H 08H 09H 0AH 0BH 0CH 0DH 0EH 0FH ┊
;┊                                                                ┊
;┊40H 41H 42H 43H 44H 45H 46H 47H 48H 49H 4AH 4BH 4CH 4DH 4EH 4FH ┊
;┊                                                                ┊
;╰┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈╯
            ADD A,#80H  ;第一行地址
            LCALL WCOM
            POP ACC     ;数据
            LCALL WDATA
            RET
;--------------------------------------------------------------------
;在第1行指定位置显示字符
;参数A显示字符的ascii码,B显示的位置
LCDP1:
            PUSH ACC
            MOV A,B
;设定DDRAM地址指令
;
;┌──────┬─────────────────────────────┬───┐
;ㄧ            ㄧ                      指令编码                            ㄧ 执行 ㄧ
;ㄧ  指令功能  ├──┬──┬──┬──┬──┬──┬──┬──┬──┬──┤ 时间 ㄧ
;ㄧ            ㄧ RS ㄧR/W ㄧDB7 ㄧDB6 ㄧDB5 ㄧDB4 ㄧDB3 ㄧDB2 ㄧDB1 ㄧDB0 ㄧ /us  ㄧ
;├──────┼──┼──┼──┼──┴──┴──┴──┴──┴──┴──┼───┤
;ㄧ设定CGRAM   ㄧ 0  ㄧ 0  ㄧ 1  ㄧ          DDRAM的地址(7位)              ㄧ 40   ㄧ
;ㄧ   地址     ㄧ    ㄧ    ㄧ    ㄧ                                        ㄧ      ㄧ
;└──────┴──┴──┴──┴────────────────────┴───┘
;功能:设定下一个要存入数据的CGRAM的地址。
;DDRAM地址与显示位置的对应关系
;
;╭┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈╮
;┊                                                                ┊
;┊00H 01H 02H 03H 04H 05H 06H 07H 08H 09H 0AH 0BH 0CH 0DH 0EH 0FH ┊
;┊                                                                ┊
;┊40H 41H 42H 43H 44H 45H 46H 47H 48H 49H 4AH 4BH 4CH 4DH 4EH 4FH ┊
;┊                                                                ┊
;╰┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈╯
            ADD A,#0C0H  ;第二行地址
            LCALL WCOM
            POP ACC     ;数据
            LCALL WDATA
            RET
;--------------------------------------------------------------------
;在指定位置显示一行字符串(以0结尾),不检查是否超长,没有考虑空格覆盖以后的内容
;参数A行,B列,DPTR字符串指针
LCD_PRN_STR:
            CJNE A,#0,LINE2
LINE1:
            MOV A,B
            ADD A,#80H  ;第0行地址;作者:刘玉宏
            LCALL WCOM
            LJMP FILL
LINE2:
            MOV A,B
            ADD A,#0C0H  ;第1行地址
            LCALL WCOM
            LJMP FILL
FILL:
            CLR A
            MOVC A,@A+DPTR
            CJNE A,#0,L1
            RET
L1:;作者:刘玉宏
            LCALL WDATA
            INC DPTR
            AJMP FILL
;--------------------------------------------------------------------
TITLE:      DB '89C51 R TEST',0
R_INFO:     DB 'R=',0
;--------------------------------------------------------------------            
            END


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -