📄 无延时.asm
字号:
COM EQU 20H
DAT EQU 21H
COLUMN EQU 30H ;列地址寄存器(0-191)
PAGE1 EQU 31H
CODE1 EQU 32H ;字符代码寄存器
COUNT EQU 33H ;计数器
CSA EQU P3.0 ;片选/CSA
CSB EQU P3.1 ;片选/CSB
DI EQU P3.2 ;寄存器选择信号
RW EQU P3.3 ;读/写选择信号
E EQU P3.4 ;使能信号
WATCHDOG EQU P3.6
;==============================主程序==================================
;中文演示显示程序段
MAIN: LCALL INT ;初始化子程序
LCALL FENG1 ;调用封面子程序1
LCALL YANSHI1 ;延时子程序
LCALL CLEAR ;清屏
LCALL FENG2 ;调用封面子程序2
LCALL YANSHI1 ;延时子程序
LCALL CLEAR ;清屏
MOV P0, #0FFH
MMNN0: MOV A, P0
ANL A, #1FH
CJNE A, #01H, MMNN1
LCALL DJ50V
LJMP TTYY8
MMNN1: CJNE A, #02H, MMNN2
LCALL DJ110V
LJMP TTYY8
MMNN2: CJNE A, #04H, MMNN3
LCALL DJ220V
LJMP TTYY8
MMNN3: CJNE A, #08H, MMNN4
LCALL DJ330V
LJMP TTYY8
MMNN4: CJNE A, #10H, MMNN0
LCALL DJ500V
TTYY8: CLR C
CPL WATCHDOG
MOV A, P2
MOV R2, A
LCALL DELAY2
MOV A, P2
SUBB A, R2
JNZ TTYY8
MOV A, R2
ANL A, #0EH ;检测A,B,C三相有无电(p2.3,p2.2,p2.1)
CJNE A, #00H, TTYY1
;三相均有电,顺序执行;否则,转TT1
LCALL AXYD
LCALL BXYD
LCALL CXYD
LCALL JZCZ
CLR P3.5
LJMP TTYY8
TTYY1: CJNE A, #08H, TTYY2 ;A无电,B,C均有电
LCALL AXWD
LCALL BXYD
LCALL CXYD
LCALL JZCZ
CLR P3.5
LJMP TTYY8
TTYY2: CJNE A, #04H, TTYY3 ;B无电,A,C均有电
LCALL AXYD
LCALL BXWD
LCALL CXYD
LCALL JZCZ
CLR P3.5
LJMP TTYY8
TTYY3: CJNE A, #02H, TTYY4 ;C无电,B,A均有电
LCALL AXYD
LCALL BXYD
LCALL CXWD
LCALL JZCZ
CLR P3.5
LJMP TTYY8
TTYY4: CJNE A, #06H, TTYY5 ;A有电,B,C均无电
LCALL AXYD
LCALL BXWD
LCALL CXWD
LCALL JZCZ
CLR P3.5
LJMP TTYY8
TTYY5: CJNE A, #0AH, TTYY6 ;B有电,A,C均无电
LCALL AXWD
LCALL BXYD
LCALL CXWD
LCALL JZCZ
CLR P3.5
LJMP TTYY8
TTYY6: CJNE A, #0CH, TTYY7 ;C有电,B,A均无电
LCALL AXWD
LCALL BXWD
LCALL CXYD
LCALL JZCZ
CLR P3.5
LJMP TTYY8
TTYY7: CJNE A, #0EH, XXX ;A,B,C均无电
LCALL AXWD
LCALL BXWD
LCALL CXWD
LCALL YXCZ
SETB P3.5
LJMP TTYY8
XXX: LJMP TTYY8
;========================左区驱动子程序=======================
;-------------------------------------------------------------
;写指令代码子程序(左)
PRL0:
RET
;-------------------------------------------------------------
;写显示数据子程序(左)
PRL1:
RET
;-------------------------------------------------------------
;读显示数据子程序(左)
PRL2:
RET
;========================中区驱动子程序=======================
;-------------------------------------------------------------
;写指令代码子程序(中)
PRM0: CLR CSA ;片选设置为"01"
SETB CSB ;
CLR DI ;DI=0
SETB RW ;RW=1
PRM01: MOV P1, #0FFH ;P1口置"1"
SETB E ;E=1
MOV A, P1 ;读状态字
CLR E ;E=0
; CPL P2.0 ;;ADD20050916
JB ACC.7, PRM01 ;判"忙"标志为"0"否,否再读
CLR RW ;RW=0
MOV P1, COM ;写指令代码
SETB E ;E=1
CLR E ;E=0
RET
;-------------------------------------------------------------
;写显示数据子程序(中)
PRM1: CLR CSA ;片选设置为"01"
SETB CSB ;
CLR DI ;DI=0
SETB RW ;RW=1
PRM11: MOV P1, #0FFH ;P1口置"1"
SETB E ;E=1
MOV A, P1 ;读状态字
CLR E ;E=0
; CPL P2.0 ;;ADD 20050916
JB ACC.7, PRM11 ;判"忙"标志为"0"否,否再读
SETB DI ;DI=1
CLR RW ;RW=0
MOV P1, DAT ;写数据
SETB E ;E=1
CLR E ;E=0
RET
;-------------------------------------------------------------
;读显示数据子程序(中)
PRM2: CLR CSA ;片选设置为"01"
SETB CSB ;
CLR DI ;DI=0
SETB RW ;RW=1
PRM21: MOV P1, #0FFH ;P1口置"1"
SETB E ;E=1
MOV A, P1 ;读状态字
CLR E ;E=0
; CPL P2.0 ;;ADD 20050916
JB ACC.7, PRM21 ;判"忙"标志为"0"否,否再读
SETB DI ;DI=1
MOV P1, #0FFH ;P1口置"1"
SETB E ;E=1
MOV DAT, P1 ;读数据
CLR E ;E=0
RET
;========================右区驱动子程序=======================
;-------------------------------------------------------------
;写指令代码子程序(右)
PRR0: SETB CSA ;片选设置为"10"
CLR CSB ;
CLR DI ;DI=0
SETB RW ;RW=1
PRR01: MOV P1, #0FFH ;P1口置"1"
SETB E ;E=1
MOV A, P1 ;读状态字
CLR E ;E=0
; CPL P2.0 ;;ADD 20050916
JB ACC.7, PRR01 ;判"忙"标志为"0"否,否再读
CLR RW ;RW=0
MOV P1, COM ;写指令代码
SETB E ;E=1
CLR E ;E=0
RET
;-------------------------------------------------------------
;写显示数据子程序(右)
PRR1: SETB CSA ;片选设置为"10"
CLR CSB ;
CLR DI ;DI=0
SETB RW ;RW=1
PRR11: MOV P1, #0FFH ;P1口置"1"
SETB E ;E=1
MOV A, P1 ;读状态字
CLR E ;E=0
; CPL P2.0 ;;ADD 20050916
JB ACC.7, PRR11 ;判"忙"标志为"0"否,否再读
SETB DI ;DI=1
CLR RW ;RW=0
MOV P1, DAT ;写数据
SETB E ;E=1
CLR E ;E=0
RET
;-------------------------------------------------------------
;读显示数据子程序(右)
PRR2: SETB CSA ;片选设置为"10"
CLR CSB ;
CLR DI ;DI=0
SETB RW ;RW=1
PRR21: MOV P1, #0FFH ;P1口置"1"
SETB E ;E=1
MOV A, P1 ;读状态字
CLR E ;E=0
; CPL P2.0 ;;ADD 20050916
JB ACC.7, PRR21 ;判"忙"标志为"0"否,否再读
SETB DI ;DI=1
MOV P1, #0FFH ;P1口置"1"
SETB E ;E=1
MOV DAT, P1 ;读数据
CLR E ;E=0
RET
;=======================中文字符写入子程序==========================
CCW_PR: MOV DPTR, #CCTAB ;确定字符字模首地址
MOV A, CODE1 ;取代码
MOV B, #20H ;字模块宽度为32个字节
MUL AB ;代码*32
ADD A, DPL ;字符字模块首地址=字模库首地址+代码*32
MOV DPL, A ;
MOV A, B
ADDC A, DPH
MOV DPH, A
PUSH COLUMN ;列地址入栈
PUSH COLUMN ;列地址入栈
MOV CODE1, #00H ;代码寄存器借用为间址寄存器
CCW_1: MOV COUNT, #10H ;计数器设置为16
MOV A, PAGE1 ;读页地址寄存器
ANL A, #07H ;
ORL A, #0B8H ;"或"页地址设置代码
MOV COM, A ;写页地址设置指令
LCALL PRL0 ;
LCALL PRM0 ;
LCALL PRR0 ;
POP COLUMN ;取列地址值
MOV A, COLUMN ;读列地址寄存器
CJNE A, #40H, TT1
LJMP TT2
TT1: JC LITTLE
LJMP TT2
LITTLE: ADD A, #80H
MOV COLUMN, A
TT2: CLR C ;
SUBB A, #40H ;列地址-64
JC CCW_2 ;<0为左屏显示区域
MOV COLUMN, A ;
SUBB A, #40H ;列地址-64
JC CCW_11 ;<0为中屏显示区域
MOV COLUMN, A ;>=0为右屏显示区域
MOV A, PAGE1 ;
SETB ACC.5 ;设置区域标志位
MOV PAGE1, A ;"00"为左,"01"为中,"10"为右
LJMP CCW_2 ;
CCW_11: MOV A, PAGE1 ;
SETB ACC.4 ;设置区域标志位
MOV PAGE1, A ;
CCW_2: MOV COM, COLUMN ;设置列地址值
ORL COM, #40H ;"或"列地址指令标志位
MOV A, PAGE1 ;判区域标志以确定设置哪个控制器
ANL A, #30H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -