微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > TC1602液晶模块与单片机接口字符显示试验

TC1602液晶模块与单片机接口字符显示试验

时间:01-15 来源:互联网 点击:

ORG 0000H
    AJMP  START

    ORG   0033H
START: MOV   SP,#60H

MAIN:  LCALL  DELAY      ;判断液晶忙状态?
    ACALL  ENABLE
    MOV   P1,#00000001B  ;写指令01H,清屏
    ACALL  ENABLE
    MOV   P1,#00111000B  ;写指令38H,设定LCD为16×2显示,5×7点阵,8位数据接口
    ACALL  ENABLE
    MOV   P1,#00001111B  ;写指令0FH,显示ON,光标ON,闪烁ON
    ACALL  ENABLE
    MOV   P1,#00000110B  ;写指令06H,文字不动,光标自动右移
    ACALL  ENABLE
    MOV   P1,#80H     ;第一行第1个字符地址
    ACALL  ENABLE
    MOV   P1,#01000001B  ;字母A的代码(#41H)
    SETB   RS       ;RS=1
    CLR   RW       ;RW=0
    CLR   E        ;E=0
    ACALL  DELAY      ;判断液晶忙状态?
    SETB  E        ;E=1
    AJMP  $
    ;-----------------
ENABLE: CLR   RS       ;写入控制命令的子程序
    CLR   RW
    CLR   E
    ACALL  DELAY
    SETB  E
    RET
    ;-----------------
DELAY: MOV   P1,#0FFH    ;判断液晶显示器是否忙的子程序
    CLR   RS
    SETB   RW
    CLR   E
    NOP
    SETB   E
    JB    P1.7,DELAY   ;如果为高电平表示忙就循环等待
    RET
    END

  程序在开始时对液晶模块功能进行了初始化设置,约定了显示格式。注意显示字符时光标是自动右移的,无需人工干预,每次输入指令都先调用判断液晶模块是否忙的子程序DELAY,然后输入显示位置的地址80H(第一行第1字符),最后输入要显示的字符"A"的代码41H,显示效果下面如图3所示。


图3: 1602液晶显示一个字符“A”


  前面我们进行了液晶显示一个字符“A”的实验,接下来再来编一个稍复杂点的多字符显示程序,相信你有了第一个程序的经验,下面的程序也就没有什么难度了,毕竟程序都差不多。下面程序实现两行显示:第1行显示"welcme!",第2行显示"www.ourmpu.com"。显示效果见下图4。

;******** TC1602液晶模块字符显示试验单片机汇编程序  ********
;******** 第一行显示“welcme!     ********
;******** 第二行显示“www.ourmpu.com” ********
    RS   EQU  P3.4
    RW   EQU  P3.5
    E   EQU  P3.6

    ORG   0000H
    AJMP   START
    ORG   0033H
START: MOV   SP,#60H

MAIN:  LCALL  DELAY    ;延时一段时间
    MOV   P1,#01H   ;写指令01H,清屏
    LCALL  ENABLE
    MOV   P1,#38H   ;写指令38H,设定LCD为16*2显示,5*7点阵,8位数据接口
    LCALL  ENABLE
    MOV   P1,#0FH   ;写指令0FH,显示ON,光标ON,闪烁ON
    LCALL  ENABLE
    MOV   P1,#06H   ;写指令06H,光标输入方式增量移位
    LCALL  ENABLE

    MOV   P1,#80H   ;第一行起始字符地址
    LCALL  ENABLE
    MOV   DPTR,#TABLE1 ;第一行显示字符表头地址
    LCALL  DISP     ;显示第一行数据
    MOV   P1,#0C0H   ;第二行起始字符地址
    LCALL  ENABLE
    MOV   DPTR,#TABLE2 ;第二行显示字符表头地址
    LCALL  DISP     ;显示第二行数据
    AJMP  MAIN     ;返回主程序循环
    ;-----------------
ENABLE: CLR   RS      ;写指令子程序(请参照1602LCD使用说明书)
    CLR   RW
    CLR   E
    LCALL  DELAY
    SETB   E
    RET
    ;-----------------
DISP:  MOV   R1,#16    ;准备显示一行16个字符
LOOP:  MOV   A,#00H    ;将ACC清零
    MOVC   A,@A+DPTR  ;查表取得要显示的数据
    LCALL  DISP1     ;写入一个数据
    INC   DPTR     ;数据表指针加1,准备取下一个数据
    DJNZ   R1,LOOP    ;一行没有显示完就继续
    RET
    ;-----------------
DISP1: MOV   P1,A     ;写1字节数据到显示端口
    SETB   RS      ;写数据时序(请参照1602LCD使用说明书)
    CLR   RW
    CLR   E
    LCALL  DELAY
    SETB   E
    RET
    ;-----------------
DELAY: MOV   R7,#255   ;延时子程序
D1:   MOV   R6,#255
D2:   DJNZ   R6,D2
    DJNZ   R7,D1
    RET

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top