📄 sonix松翰sn8p2系列vfd驱动子程序pt6311.txt
字号:
;===========================================
DISP_CHAR_WELCOME:
MOV A,#04 ;设定最后地址
MOV Position,A
MOV A,#'E'-37H
CALL CODE_TO_SEG
MOV A,#'M'-37H
CALL CODE_TO_SEG
MOV A,#'O'-37H
CALL CODE_TO_SEG
MOV A,#'C'-37H
CALL CODE_TO_SEG
MOV A,#'L'-37H
CALL CODE_TO_SEG
MOV A,#'E'-37H
CALL CODE_TO_SEG
MOV A,#'W'-37H
CALL CODE_TO_SEG
RET
;===========================================
; 清余中间显示部份(SEG1-SEG22)
;===========================================
DISP_CLEAR_MID:
;清全部显示暂存器
MOV A,#SEG1
MOV Z,A
DISP_CLEAR_MID_TO_CLEAR:
MOV A,#00H
CLR Y
B0MOV @YZ,A
INCMS Z
NOP
MOV A,#SEG22+1
CMPRS A,Z
JMP DISP_CLEAR_MID_TO_CLEAR
RET
;===========================================
; 清全部显示暂存器(SEG1-SEG26)
;===========================================
DISP_CLEAR_ALL:
MOV A,#SEG1
MOV Z,A
DISP_CLEAR_ALL_TO_CLEAR:
MOV A,#00H
CLR Y
B0MOV @YZ,A
INCMS Z
NOP
MOV A,#SEG26+1
CMPRS A,Z
JMP DISP_CLEAR_ALL_TO_CLEAR
RET
;=================================================================================
; 将数送到 SEG 中
; 位置->osition (20-0) 码-> A
;=================================================================================
CODE_TO_SEG:
B0MOV Y,#VFD_CHAR_TAB$M
B0MOV Z,#VFD_CHAR_TAB$L
ADD Z,A
MOVC
MOV BufA,A
CLR Y
BCLR FC
MOV A,Position ; ->A
ADD A,#SEG1
MOV Z,A
MOV A,BufA
MOV @YZ,A
INCMS Position ;+1 ->A
MOV A,Position
ADD A,#SEG1
MOV Z,A
MOV A,R
MOV @YZ,A
INCMS Position
RET
;=================================================================================
;=================================================================================
; V F D 子程序
;=================================================================================
; 局部变量:A Y Z R BufA Loop
;=================================================================================
;=================================================================================
; 初始化VFD,并清全部显示暂存器(SEG1-SEG26)
;=================================================================================
VFD_INIT:
BSET VFDpSTB
BSET VFDpCLK
BSET VFDpDATA
BSET VFDioSTB ;输出
BSET VFDioCLK
BSET VFDioDATA
CALL DISP_CLEAR_ALL
;=================================================================================
; 送内部暂存器到VFD
;=================================================================================
VFD_SEND_ALL:
MOV A,#01000000B ;COMMAND2
CALL VFD_SEND_8BIT
BSET VFDpSTB
CALL VFD_SEND_28DATA
MOV A,#00001100B ;COMMAND1 ;14DIGx14SEG
CALL VFD_SEND_8BIT
BSET VFDpSTB
MOV A,#10001111B
CALL VFD_SEND_8BIT
BSET VFDpSTB
RET
;=================================================================================
; 读按键
;=================================================================================
VFD_READ_KEY:
;============ 送COMMAND2 READ KEY =============
MOV A,#01000010B ;COMMAND2 READ KEY
CALL VFD_SEND_8BIT
;============ 读KEY K1-K4,SG1-SG2 =============
CALL VFD_INCEPT_8BIT
AND A,#11101100B ;去掉多余的位
RET
;=================================================================================
; VFD 内部子程序
;=================================================================================
;==============================================
VFD_SEND_28DATA:
;=============== 送地址 00H ===============
MOV A,#11000000B ;COMMAND3
CALL VFD_SEND_8BIT
;=============== 送28个数据 ===============
MOV A,#SEG1
MOV Z,A
MOV A,#3
MOV BufA,A
VFD_SEND_28DATA_26Byte:
CLR Y
B0MOV A,@YZ
MOV Y,A
MOV A,#8
MOV Loop,A
VFD_SEND_28DATA_8Bit:
RRCM Y
BTS1 FC ;C为1跳
JMP $+3
BSET VFDpDATA ;传送数据1
JMP $+2
BCLR VFDpDATA ;传送数据0
nop
BCLR VFDpCLK
nop
BSET VFDpCLK
DECMS Loop
JMP VFD_SEND_28DATA_8Bit
;跳过无用寄存器
DECMS BufA
JMP VFD_SEND_28DATA_DD
MOV A,#3
MOV BufA,A
JMP VFD_SEND_28DATA_D
VFD_SEND_28DATA_DD:
INCMS Z
VFD_SEND_28DATA_D:
;判断是否到头
MOV A,#SEG26+1
CMPRS A,Z
JMP VFD_SEND_28DATA_26Byte
BSET VFDpSTB
RET
;==============================================
VFD_SEND_8BIT:
BSET VFDioDATA ;输出
BCLR VFDpSTB
MOV Y,A
MOV A,#8
MOV Loop,A
VFD_SEND_8BIT_A:
RRCM Y
BTS1 FC ;C为1跳
JMP $+3
BSET VFDpDATA ;传送数据1
JMP $+2
BCLR VFDpDATA ;传送数据0
nop
BCLR VFDpCLK
nop
BSET VFDpCLK
DECMS Loop
JMP VFD_SEND_8BIT_A
; BSET VFDpSTB ;在外面设1
RET
;==============================================
VFD_INCEPT_8BIT:
BCLR VFDioDATA ;输入
BCLR VFDpSTB
MOV A,#8
MOV Loop,A
VFD_INCEPT_8BIT_A:
BCLR VFDpCLK
NOP
BTS1 VFDpDATA ;C为1跳
JMP $+3
BSET FC ;传送数据1
JMP $+2
BCLR FC ;传送数据0
RRCM Y
BSET VFDpCLK
DECMS Loop
JMP VFD_INCEPT_8BIT_A
MOV A,Y
BSET VFDpSTB
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -