?? 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 + -