文章搜索

实现1602液晶显示"LCD Testing___" 和 " WWW.PICAVR.COM " 两行字符

发表时间:2015-4-30  作者:admin  浏览次数:1368  
字体大小: 【小】 【中】 【大】

;******************************************************************************
;*  描述:                                                                                                                                                         
;*         实现1602液晶显示"LCD Testing___" 和 " WWW.PICAVR.COM "  两行字符                                                      
;*                                                                                                                                                                   
;******************************************************************************
;* 【版权】 Copyright(C)东哥单片机学习网 www.picavr.com  All Rights Reserved       
;* 【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息!                                  
;******************************************************************************
      RS          BIT       P2.0              ;定义LCM的接脚RS、R/W、Enable为P2.0、P2.1、P2.2
      R_W         BIT       P2.1
      ENABLE      BIT       P2.2
      DB0_DB7     DATA      P0                ;DB0-DB7的接脚为P0来控制,以方便程式的撰写与维护
;*------------------------------------------------------------------------
                  ORG       00H               ;通知编译器下面的程式由程式记忆体地址0000H开始存放
                  JMP       START             ;跳到标记start处执行程式
                  ORG       000BH             ;
                  AJMP      INSERS            ;跳到中断服务程式 
                  ORG       30H               ;通知编译器下面的程式由程式记忆体地址0030H开始存入。

START:            NOP
                  MOV       TMOD,#0           ;初始化TO
                  MOV       TL0,#0            ;
                  MOV       TH0,#0            ;
                  SETB      EA                ;
                  SETB      ET0               ;
                  SETB      TR0               ;
                  MOV       R5,#50            ;设定延时次数。
;                  CLR       P3.2             ;
;                  SETB      P3.1             ;
                  MOV       SP,#60H           ;设定MCS-51从内容资料记忆体地址61H开始存放堆栈资料。
                  CALL      Initial           ;调用启动LCM的子程式
                  CALL      CLS               ;调用清除显示器的子程式
                  MOV       A,#10000000B      ;将二进制10000000的值放入累加器内,代表设定DDRAM的地址为00H,
                                ;即将光标移到第一行第一个列的位置上。
                  CALL      Write_instruction ;调用写指令码到IR寄存器的子程式。
                  MOV       DPTR,#LINE1       ;将第一行字串在程式记忆体中的起始地址存入DPTR
                  CALL      STRING            ;调用PRSTRING子程式,将字串显示到LCM

                  MOV       A,#11000000B      ;将二进制11000000的值放入累加器内,代表设定DDRAM的地址为40H,
                                ;即将光标移到第二行第一个列的位置上
                  CALL      Write_instruction ;调用写指令码到IR寄存器的子程式。
                  MOV       DPTR,#LINE2       ;将第二行字串在程式记忆体中的起始地址存DPTR。
                  CALL      STRING            ;调用PRSTRING子程式,将字串显示到LCM
;---------------------------------------------
LOOP:             JMP       LOOP              ;执行无穷循环?
;--------------------------------------------
LINE1:            DB       " LCD Testing___ ",00H  ;在LCM第一行显示字串"LCD Testing___"
LINE2:            DB       " WWW.PICAVR.COM ",00H  ;在LCM第二行显示字串" WWW.PICAVR.COM "
;------------------------------------------------------------------
;TO中断服务子程式?
;------------------------------------------------------------------
INSERS:           MOV      TH0,#0             ;
                  MOV      TL0,#0             ;
                  DJNZ     R5,NO              ;
                  MOV      R5,#50             ;
;                  CPL      P3.2              ;
;                  CPL      P3.1              ;
NO:               RETI                        ;
;------------------------------------------------------------------
;Initial子程序
;设定LCM使用8BITS汇流排,显示两行,使用5*7字型,显示器要显示
;光标要显示但不闪烁
;------------------------------------------------------------------
Initial:          MOV      A,#00111000B       ;
                  CALL     Write_instruction  ;
                  MOV      A,#00001110B       ;
                  CALL     Write_instruction  ;
                  MOV      A,#00000110B       ;
                  CALL     Write_instruction  ;
                  RET
;-----------------------------------------------------------------
;CheckBusy子程序
;等待LCM有空可以执行下一行命令
;-----------------------------------------------------------------
CheckBusy:
                  PUSH     ACC                  ;将累加器ACC的内容放到堆栈内,
                                                ;以免破坏原来的ACC的资料
CheckBusyLoop:
                  CLR      ENABLE               ;设定E=0,禁能读模式
                  SETB     R_W                  ;设定R/W=1,选择读模式
                  CLR      RS                   ;设定RS=0,选择指令寄存器IR
                  SETB     ENABLE               ;将P3.3脚设定为1,使能LCM
                  MOV      A,DB0_DB7            ;将存在ACC内的资料经由P1存入ACC中,
                                                ;以便查封第7位元及BF是否为0什么
                  CLR      ENABLE               ;将P3.3脚设定为0
                  JB       ACC.7,CheckBusyLoop  ;判断由LCM读入资料的第7位及BF
                                                ;是否为1,若等于1表示LCM忙碌中,CPU
                                                ;跳到标记CheckBusyLoop继续执行程序
                  POP     ACC                   ;将累加器ACC内容从堆栈区取出
                  CALL    DELAY                 ;调用延迟子程序,延时约数个mS
                  RET                           ;返回主程序
;-----------------------------------------------------------------
;Write_instruction子程序
;将ACC内的资料输入到LCM的IR寄存器
;-----------------------------------------------------------------
Write_instruction:
                  CALL    CheckBusy             ;调用CheckBusy子程序确定LCM可以执行指令
                  CLR     ENABLE                ;设定E=0,禁能LCM
                  CLR     R_W                   ;设定R/W=0,选择写模式
                  CLR     RS                    ;设定RS=0,选择指令寄存器IR
                  SETB    ENABLE                ;将P3.3脚设定为1,使能LCM
                  MOV     DB0_DB7,A             ;将存在ACC内的指令码经由P1输出到LCM
                  CLR     ENABLE                ;将P3.3设定为0,MCS-51向LCM存取资料后,
                                                ;必须将LCM的E脚输出0,让LCM禁能(Disable)
                                                ;不做介面的资料传送或设定
                  RET                           ;返回主程序
;-----------------------------------------------------------------
;WriteLCDData子程序
;将ACC内的资料输入到LCM的DR寄存器
;-----------------------------------------------------------------
WriteLCDData:
                  CALL    CheckBusy             ;调用CheckBusy子程序,确定LCM可以执行指令
                  CLR     ENABLE                ;设定E=0,禁能LCM
                  CLR     R_W                   ;设定R/W=0,选择写模式
                  SETB    RS                    ;设定RS=1,选择U寄资料存器DR
                  SETB    ENABLE                ;将P3.3脚设定为1,使能LCM
                  MOV     DB0_DB7,A             ;将存在ACC内的指令码经由P1输出到LCM
                  CLR     ENABLE                ;
                  RET                           ;返回主程序
;-----------------------------------------------------------------
;CLS子程序
;清除LCM的显示字幕
;-----------------------------------------------------------------
CLS:              MOV     A,#01H                ;
                  CALL    Write_instruction     ;
                  RET
;-----------------------------------------------------------------
;STRING子程序
;将一个字幕显示在LCM,字串的起地址要存入DPTR,字串必须以00H结束
;-----------------------------------------------------------------
STRING:
                  PUSH    ACC                   ;
LOOP1:
                  CLR     A                     ;
                  MOVC    A,@A+DPTR             ;
                  JZ      END_PR                ;
                  CALL    WriteLCDData          ;
                  INC     DPTR                  ;
                  JMP     LOOP1                 ;
END_PR:
                  POP     ACC                   ;
                  RET                           ;
;-----------------------------------------------------------------
;DELAY子程所延迟的时间约为2.5mS
;延时时间约为R6*(500uS)
;-----------------------------------------------------------------
DELAY:            MOV     R6,#5                 ;
D1:               MOV     R7,#248               ;
                  DJNZ    R7,$                  ;
                  DJNZ    R6,D1                 ;
                  RET                           ;
                  END                           ;
;*****************************************************************

本站已经获得中华人民共和国工信部、通信管理局审批通过 国家ICP备案序号: 赣ICP备13006653号-2

电工电子技术QQ群(1):66585281电工电子技术QQ群(2):197874883电工电子技术QQ群(3):29019650 

版权归刘昆山所有©2013-2020转载须经本人同意,否则后果自负!  《我的电子制作经验》www.dgdz.net All Rights Reserved.

管 理