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

📄 th28_lcd.asm

📁 单片机杭州天煌教仪自带例程单片机杭州天煌教仪自带例程
💻 ASM
字号:
;-----------左右移动 -----------

       A0     EQU      P3.2            ;寄存器选择信号
       R_W    EQU      P3.3            ;读_写选择信号
       E1     EQU      P3.6            ;使能信号1
       E2     EQU      P3.7            ;使能信号2


PD1         EQU   3DH              ;122/2分成左右两半屏122x32
COLUMN      EQU   30H              ;列地址寄存器(0-63H)
PAGE_       EQU   31H              ;页地址寄存器D1,DO:页地址
CODE_       EQU   32H              ;字符代码寄存器
COUNT       EQU   33H              ;计数器
DIR         EQU   34H
CTEMP       EQU   38H
COM         EQU   20H              ;指令寄存器
DAT         EQU   21H              ;数据寄存器

         ORG     0

         LJMP     MAIN

       ;-----------初始化程序
INIT:    MOV     COM,#0E2H        ;复位
         LCALL   PR0
         LCALL   PR3
         MOV     COM,#0A4H        ;关闭休闭状态
         LCALL   PR0
         LCALL   PR3
         MOV     COM,#0A9H        ;设置1/32占空比
         LCALL   PR0
         LCALL   PR3
         MOV     COM,#0A0H        ;正向排序设置
         LCALL   PR0
         LCALL   PR3
         MOV     COM,#0C0H        ;设置显示起始行为第一行
         LCALL   PR0
         LCALL   PR3
         MOV     COM,#0AFH        ;开显示设置
         LCALL   PR0
         LCALL   PR3
         RET


         ;-----------清屏程序
CLEAR:   MOV     R4,#00H          ;页面地址暂存器设置
CLEAR1:  MOV     A,R4             ;取页地址值
         ORL     A,#0B8H          ;"或"页面地址设置代码
         MOV     COM,A            ;页面地址设置
         LCALL   PR0
         LCALL   PR3
         MOV     COM,#00H         ;列地址设置为"0"
         LCALL   PR0
         LCALL   PR3
         MOV     R3,#50H          ;一页清80个字节
CLEAR2:  MOV     DAT,#00H         ;显示数据为"0"
         LCALL   PR1
         LCALL   PR4
         DJNZ    R3,CLEAR2        ;页内字节清零循环
         INC     R4
         CJNE    R4,#04H,CLEAR1   ;RAM区清零循环
         RET

 ;--------------写指令代码子程序(E1)
PR0:    CLR      A0                    ;AO=0
        SETB     R_W                   ;R_W=1
PR01:   MOV      P1,#0FFH              ;P1口置"1"
        SETB     E1                    ;E1=1
        MOV      A,P1                  ;读状态字
        CLR      E1                    ;E1=0
        JB       ACC.7,PR01            ;判"忙"标志为"0",否再读
        CLR      R_W                   ;R_W=0
        MOV      P1,COM                ;写指令代码
        SETB     E1                    ;E1=1
        CLR      E1                    ;E1=0
        RET


 ;-------------写显示数据子程序(E1)

PR1:   CLR     A0                      ;A0=0
       SETB    R_W                     ;R_W=1
PR11:  MOV     P1,#0FFH                ;P1口置"1"
       SETB    E1                      ;E1=1
       MOV     A,P1                    ;读状态字
       CLR     E1                      ;E1=0
       JB      ACC.7,PR11              ;判"忙"标志为"0"否,否再读
       SETB    A0                      ;A0=1
       CLR     R_W                     ;R_W=0
       MOV     P1,DAT                  ;写数据
       SETB    E1                      ;E1=1
       CLR     E1                      ;E1=0
       RET

 ;-------------读显示数据子程序(E1)
PR2:   CLR     A0                      ;A0 =0
       SETB    R_W                     ;R_W=1
PR21:  MOV     P1,#0FFH                ;P1口置"1"
       SETB    E1                      ;E1=1
       MOV     A,P1                    ;读状态字
       CLR     E1                      ;E1=0
       JB      ACC.7,PR21              ;判"忙"标志为"0"否,否再读
       SETB    A0                      ;A0=1
       MOV     P1, #0FFH               ;P1口置"1"
       SETB    E1                      ;E1=1
       MOV     DAT,P1                  ;读数据
       CLR     E1                      ;E1=0
       RET

;--------------写指令代码子程序(E2)
PR3:    CLR      A0                    ;A0 =0
        SETB     R_W                   ;R_W=1
PR31:   MOV      P1,#0FFH              ;P1口置"1"
        SETB     E2                    ;E1=1
        MOV      A,P1                  ;读状态字
        CLR      E2                    ;E1=0
        JB       ACC.7,PR31            ;判"忙"标志为"0",否再读
        CLR      R_W                   ;R_W=0
        MOV      P1,COM                ;写指令代码
        SETB     E2                    ;E1=1
        CLR      E2                    ;E1=0
        RET
;-------------写显示数据子程序(E2)

PR4:   CLR     A0                      ;A0=0
       SETB    R_W                     ;R_W=1
PR41:  MOV     P1,#0FFH                ;P1口置"1"
       SETB    E2                      ;E1=1
       MOV     A,P1                    ;读状态字
       CLR     E2                      ;E1=0
       JB      ACC.7,PR41              ;判"忙"标志为"0"否,否再读
       SETB    A0                      ;A0=1
       CLR     R_W                     ;R_W=0
       MOV     P1,DAT                  ;写数据
       SETB    E2                      ;E1=1
       CLR     E2                      ;E1=0
       RET

 ;-------------读显示数据子程序(E2)
PR5:   CLR     A0                      ;A0 =0
       SETB    R_W                     ;R_W=1
PR51:  MOV     P1,#0FFH                ;P1口置"1"
       SETB    E2                      ;E2=1
       MOV     A,P1                    ;读状态字
       CLR     E2                      ;E2=0
       JB      ACC.7,PR51              ;判"忙"标志为"0"否,否再读
       SETB    A0                      ;A0=1
       MOV     P1, #0FFH               ;P1口置"1"
       SETB    E2                      ;E2=1
       MOV     DAT,P1                  ;读数据
       CLR     E2                      ;E2=0
       RET


 ;-------------中文显示子程序
CCW_PR:  MOV      DPTR,#CCTAB           ;确定字符字模块首地址
         MOV      A,CODE_               ;取代码
         MOV      B,#20H                ;字模块宽度为 32个字节
         MUL      AB                    ;代码×32
         ADD      A,DPL                 ;字符字模块首地址
         MOV      DPL,A                 ;=字模库首地址+代码×32
         MOV      A,B
         ADDC     A,DPH
         MOV      DPH,A
         PUSH     COLUMN                ;列地址入栈
         PUSH     COLUMN                ;列地址入栈
         MOV      CODE_,#00H            ;代码寄存器借用为间址寄存器
CCW_1:   MOV      COUNT,#10H            ;计数器设置为 16
         MOV      A,PAGE_               ;读页地址寄存器
         ANL      A,#03H
         ORL      A,#0B8H               ;"或"页地址设置代码
         MOV      COM,A                 ;写页地址设置指令
         LCALL    PR0
         LCALL    PR3
         POP      COLUMN                ;取到地址值
         MOV      A,COLUMN              ;读列地址寄存器
         CLR      C
         SUBB     A,#PD1                ;列地址减模块参数
         JC       CCW_2                 ;<0为左半屏显示区域(E1)
         MOV      COLUMN,A              ;≥0为右半屏显示区域(E2)
         MOV      A,PAGE_
         SETB     ACC.3                 ;设置区域标志位。
         MOV      PAGE_,A               ;"0"为E1,"1"为E2
CCW_2:   MOV      COM,COLUMN            ;设置列地址值
         MOV      A,PAGE_               ;判区域标志以确定设置哪个控制器
         JNB      ACC.3,CCW_3
         LCALL    PR3                   ;区域E2
         LJMP     CCW_4
CCW_3:   LCALL    PR0                   ;区域E1
CCW_4:   MOV      A,CODE_               ;取间址寄存器值
         MOVC     A,@A+DPTR             ;取汉字字模数据
         MOV      DAT,A                 ;写数据
         MOV      A,PAGE_
         JNB      ACC.3,CCW_5
         LCALL    PR4                   ;区域E2
         LJMP     CCW_6
CCW_5:   LCALL    PR1                   ;区域E1
CCW_6:   INC      CODE_                 ;间址寄存器加一
         INC      COLUMN                ;列地址寄存器加一
         MOV      A,COLUMN              ;判列地址是否超出区域范围
         CJNE     A,#PD1,CCW_7
CCW_7:   JC       CCW_8                 ;未超出则继续
         MOV      A,PAGE_               ;超出则判是否在区域E2
         JB       ACC.3,CCW_8           ;在区域E2则退出
         SETB     ACC.3                 ;在区域E1则修改成区域E2
         MOV      PAGE_,A
         MOV      COM,#00H              ;设置区域E2列地址为"0"
         LCALL    PR3
CCW_8:   DJNZ     COUNT,CCW_4           ;当页循环
         MOV      A,PAGE_               ;读页地址寄存器
         JB       ACC.7,CCW_9           ;判完成标志D7位,"1"则完成退出
         INC      A                     ;否则页地址加一
         SETB     ACC.7                 ;置完成位为"1"
         CLR      ACC.3
         MOV      PAGE_,A
         MOV      CODE_,#10H            ;间址寄存器设置为 16
         LJMP     CCW_1                 ;大循环
CCW_9:   RET

 ;-------------中文字符库-----------------

CCTAB:
  DB  000H,040H,042H,042H,042H,042H,042H,0FEH ;天
  DB  042H,042H,042H,042H,042H,042H,040H,000H
  DB  000H,080H,040H,020H,010H,008H,006H,001H
  DB  002H,004H,008H,010H,030H,060H,020H,000H

  DB  080H,060H,000H,0FFH,010H,008H,07CH,054H ;煌
  DB  056H,055H,054H,054H,054H,07CH,000H,000H
  DB  040H,030H,00EH,003H,004H,038H,025H,025H
  DB  025H,03FH,025H,025H,025H,035H,020H,000H

  DB  010H,014H,094H,0D4H,0BFH,094H,09CH,014H ;教
  DB  050H,0F8H,00FH,008H,088H,078H,008H,000H
  DB  009H,009H,048H,088H,07EH,005H,044H,044H
  DB  020H,020H,013H,00CH,033H,0C0H,040H,000H

  DB  040H,020H,0F0H,00CH,003H,000H,038H,0C0H ;仪
  DB  001H,00EH,004H,0E0H,01CH,000H,000H,000H
  DB  000H,000H,0FFH,000H,040H,040H,020H,010H
  DB  00BH,004H,00BH,010H,020H,060H,020H,000H




 ;----------------中文演示显示程序段
MAIN:
   LCALL   INIT
   LCALL   CLEAR
   LCALL   CLEAR
   MOV     CTEMP,#0
   MOV     DIR,#0

AAA:     MOV     PAGE_,#01H
         MOV     COLUMN,CTEMP
         MOV     CODE_,#00H
         LCALL   CCW_PR

         MOV     PAGE_,#01H
         MOV     A,CTEMP
         ADD     A,#10H
         MOV     COLUMN,A
         MOV     CODE_,#01H
         LCALL   CCW_PR

         MOV     PAGE_,#01H
         MOV     A,CTEMP
         ADD     A,#20H
         MOV     COLUMN,A
         MOV     CODE_,#02H
         LCALL   CCW_PR

         MOV     PAGE_,#01H
         MOV     A,CTEMP
         ADD     A,#30H
         MOV     COLUMN,A
         MOV     CODE_,#03H
         LCALL   CCW_PR

        ; LJMP    $

         LCALL   DELAY
         LCALL   DELAY
         LCALL   DELAY
         MOV     A,DIR
         CJNE    A,#0,LEFT
         INC     CTEMP
         MOV     A,CTEMP
         CJNE    A,#58,AAA
         MOV     DIR,#1
         LJMP    AAA

LEFT:
         DEC     CTEMP
         MOV     A,CTEMP
         CJNE    A,#0,AAA
         MOV     DIR,#0
         LJMP    AAA

         ;LCALL   S_DOWN
         ;LCALL  S_UP
         ;SJMP    $



;-----------------------------------------
DELAY:  MOV    R6,#80H                 ;延时子程序
        MOV    R5,#00H
DELAY1: NOP
        DJNZ   R5,DELAY1
        DJNZ   R6,DELAY1
        RET

        END

⌨️ 快捷键说明

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