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

📄 1602.asm

📁 C51单片机的1602液晶显示驱动例程
💻 ASM
字号:
;*******************************************************************                                                              
;* 显示方式:                                                      
;* 1、LCD第一行显示: www.fdzj.com                                      
;*    LCD第二行显示: 13556029592                                     
;* 2、先在两行显示上述字符,然后两行字符同时向右移动3位,         
;*      再向左移动6位,清LCD。                                       
;* 3、反复循环上述显示方式。                         
 ;*******************************************************************

          LCD_RS   EQU  P2.5
          LCD_RW  EQU  P2.6
          LCD_EN   EQU  P2.7

;*******************************************************************
             ORG  0000H
             AJMP  MAIN
             ORG  0030H
;*******************************************************************
MAIN:
             MOV SP,#60H
             ACALL LCD_INIT           ;LCD初始化
MAIN1:
             ACALL CLR_LCD           ;清LCD
             MOV A,#80H                ;显示在第一行左边第一位位置
             ACALL LCD_CMD
             MOV DPTR,#LINE1       ;第一行字符串的起始地址送入DPTR。
             ACALL WRITE
             MOV A,#0C0H             ;显示在第二行左边第一位位置
             ACALL LCD_CMD
             MOV DPTR,#LINE2       ;第二行字符串的起始地址送入DPTR。
             ACALL WRITE
             MOV  R4,#03H             ;向右移动3格
LOOPA:
             MOV  A,#1CH               ;字符同时右移一格
             ACALL LCD_CMD
             MOV  R5,#03H
             CALL  DELAY125MS      ;延时375MS
             DJNZ  R4,LOOPA
             MOV  R4,#06H            ;向左移动6格
LOOPB:
             MOV  A,#18H              ;字符同时左移一格
             ACALL LCD_CMD
             MOV  R5,#03H            ;延时375MS
             CALL  DELAY125MS
             DJNZ  R4,LOOPB
             AJMP   MAIN1

LINE1:
        DB "  www.fdzj.com ",00H
LINE2:
        DB "  13556029592 ",00H

;***************************************************************
;LCD初始化设定子程序
;***************************************************************
LCD_INIT:
          ACALL DELAY5MS            ;延时15MS
          ACALL DELAY5MS            ;等待LCD电源稳定
          ACALL DELAY5MS

          MOV A,#38H                  ;16*2显示,5*7点阵,8位数据
          ACALL LCD_CMD_NC      ;不进行LCD忙检测
          ACALL DELAY5MS

          MOV A,#38H                  ;16*2显示,5*7点阵,8位数据
          ACALL LCD_CMD_NC      ;不进行LCD忙检测
          ACALL DELAY5MS

          MOV A,#38H                  ;16*2显示,5*7点阵,8位数据
          ACALL LCD_CMD_NC      ;不进行LCD忙检测
          ACALL DELAY5MS

          MOV  A,#08H                  ;显示关
          ACALL LCD_CMD            ;进行LCD忙检测

          MOV A,#01H                  ;清除屏幕
          ACALL LCD_CMD            ;进行LCD忙检测

          MOV  A,#0CH                 ;显示开,关光标
          ACALL LCD_CMD            ;进行LCD忙检测

          RET
;***************************************************************
;清LCD子程序
;***************************************************************
CLR_LCD:
           MOV A,#01H                   ;清除屏幕
           ACALL LCD_CMD             ;进行LCD忙检测
           RET

;***************************************************************
;写指令数据到LCD
;RS=L,RW=L,D0-D7=指令码,E=高脉冲
;***************************************************************
LCD_CMD:
          CALL  CHECKBUSY
LCD_CMD_NC:
          CLR LCD_RS
          CLR LCD_RW
          MOV  P0,A
          SETB LCD_EN
          NOP
          NOP
          NOP
          NOP
          CLR  LCD_EN
          RET
;***************************************************************
;写显示数据到LCD
;RS=H,RW=L,D0-D7=数据,E=高脉冲
;***************************************************************
LCD_WDATA:
          ACALL  CHECKBUSY
          SETB  LCD_RS
          CLR   LCD_RW
          MOV   P0,A
          SETB  LCD_EN
          NOP
          NOP
          NOP
          NOP
          CLR   LCD_EN
          RET
;***************************************************************
;检测LCD控制器忙状态
;读数据
;RS=L,RW=H,E=H,输出:D0-D7=数据
;P0.7=1,LCD忙,等待。P0.7=0,LCD闲,可以进行读写操作。
;***************************************************************
CHECKBUSY:
          PUSH  ACC
          MOV  P0,#0FFH
          CLR   LCD_RS
          SETB  LCD_RW
          SETB  LCD_EN
BUSYLOOP:
          NOP
          JB P0.7,BUSYLOOP
          CLR  LCD_EN
          POP  ACC
          RET
;***************************************************************
; 发送字符串子程序
;***************************************************************
WRITE:
          PUSH ACC
WRITE1:
          CLR  A
          MOVC  A,@A+DPTR
          JZ  WRITE2
          INC  DPTR
          ACALL LCD_WDATA
          MOV  R5,#01H
          CALL  DELAY125MS    ;延时,形成逐字显示效果。
          SJMP  WRITE1
WRITE2:
          POP  ACC
          RET

;***************************************************************
;延时5MS子程序
;LCD初始化使用
;***************************************************************
DELAY5MS:
          MOV  R6,#10
DL1:    
          MOV  R7,#249
DL2:     
          DJNZ R7,DL2
          DJNZ R6,DL1
          RET
;***************************************************************
;***************************************************************
;延时125MS子程序
;字符串移动时使用
;***************************************************************
DELAY125MS:
DL3:     
          MOV  R6,#250
DL4:    
          MOV  R7,#249
DL5:    
          DJNZ R7,DL5
          DJNZ R6,DL4
          DJNZ R5,DL3
          RET
          END

⌨️ 快捷键说明

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