📄 vfd时钟.asm
字号:
;*******************************************************************************
; FILENAME : 2602A_TEMPLATE.ASM for S8KE ICE
; AUTHOR : SONiX
; PURPOSE : Template Code for SN8P1602
; REVISION : 06/05/2004 V1.0 First issue
; : 07/07/2004 V1.1 Remove ICE_MODE definition and some macro
; for SN8ICE 2K and Add push/pop in ISR
;*******************************************************************************
;* (c) Copyright 2004, SONiX TECHNOLOGY CO., LTD.
;*******************************************************************************
CHIP SN8P2622 ; Select the CHIP
//{{SONIX_CODE_OPTION
.Code_Option Reset_Pin P15
.Code_Option Watch_Dog Always_On ; Watchdog still enable even in Green and Sleep mode
.Code_Option High_Clk 4M_X'tal ; Crystal/Resonator: 2Mhz~10Mhz
.Code_Option Security Enable
//}}SONIX_CODE_OPTION
;-------------------------------------------------------------------------------
; Include Files
;-------------------------------------------------------------------------------
.nolist ; do not list the macro file
INCLUDESTD MACRO1.H
INCLUDESTD MACRO2.H
INCLUDESTD MACRO3.H
.list ; Enable the listing function
;-------------------------------------------------------------------------------
; Constants Definition
;-------------------------------------------------------------------------------
; ONE EQU 1
;-------------------------------------------------------------------------------
; Variables Definition
;-------------------------------------------------------------------------------
.DATA
org 0h ;Data section start from RAM address 0
; Wk00 DS 1 ;Temporary buffer for main loop
; Iwk00 DS 1 ;Temporary buffer for ISR
; AccBuf DS 1 ;Accumulater buffer
; PflagBuf DS 1 ;PFLAG buffer
; t1 DS 1
; PFLAG DS 1
ACCBUF DS 1
PFLAGBUF DS 1
FLAG DS 1
FLAGA DS 1
FLAGB DS 1
WORK_TIME DS 1
TIME_10MS DS 1
TIME_20MS DS 1
DEL_10MS DS 1
DEL_100MS DS 1
TIME_SEC DS 1
TIME_MIN DS 1
TIME_HOUR DS 1
TIME_MS DS 1
BUZ_TIME DS 1
MOD_CONT DS 1
;----------------------------------------
KEY_RAM DS 1
KEY_TEST DS 1
KEY_DELAY DS 1
XS_DATA1 DS 1
XS_DATA2 DS 1
DISP_COM DS 1
FY_CONT DS 1
;----------------------------------------
VFD_DATA1 DS 1
VFD_DATA2 DS 1
VFD_DATA3 DS 1
VFD_DATA4 DS 1
VFD_DATA5 DS 1
VFD_DATA6 DS 1
VFD_DATA7 DS 1
VFD_DATA8 DS 1
;-------------------------------------------------------------------------------
; Bit Variables Definition
;-------------------------------------------------------------------------------
; Wk00B0 EQU Wk00.0 ;Bit 0 of Wk00
; Iwk00B1 EQU Iwk00.1 ;Bit 1 of Iwk00
;----------------------------------------
;FLAG
ON_OFF EQU FLAG.0
BUZ EQU FLAG.1
LOW_FG EQU FLAG.2
STR_FG EQU FLAG.3
FJ_FG EQU FLAG.4
LT_FG EQU FLAG.5
DS_FG EQU FLAG.6
KEY_YES EQU FLAG.7
;----------------------------------------
;FLAGA
MIN_FG EQU FLAGA.0
HOUR_FG EQU FLAGA.1
SHUN EQU FLAGA.2
FIR_FG EQU FLAGA.3
; CS_FG EQU FLAGA.4
; BJ_OPEN EQU FLAGA.5
; DEL_FG EQU FLAGA.6
; DS_FG EQU FLAGA.7
;--------------------------------------------------------
; I/O Variables Definition
;--------------------------------------------------------
;P0
; EQU P0.0
;-------------------------------------------
;P1
; EQU P1.0
; LT_OUT EQU P1.1
; STR_OUT EQU P1.2
BUZ_OUT EQU P1.3
; EQU P1.4
; EQU P1.5
;-------------------------------------------
;P5
; FJ_OUT EQU P5.0
LED_COM EQU P5.2
; DATA EQU P5.3
DATA_16312 EQU P5.4
CLK_16312 EQU P5.5
STB EQU P5.6
; CLK_16312 EQU P5.7
; DAT EQU P5M.3
;-------------------------------------------------------------------------------
; Code section
;-------------------------------------------------------------------------------
.CODE
ORG 0 ;Code section start
JMP $+1
JMP $+1
JMP $+1
JMP $+1
JMP $+1
JMP $+1
JMP $+1
JMP PROGRAM_START ;Reset vector
;Address 4 to 7 are reserved
ORG 8
JMP INT_START ;Interrupt vector
ORG 10H
;=======================================
XS_TABLE:
; B0ADD PCL,A
;DECGFBAP
DB 01110111B ;0
DB 00010010B ;1
DB 01011101B ;2
DB 01011011B ;3
DB 00111010B ;4
DB 01101011B ;5
DB 01101111B ;6
DB 01010010B ;7
DB 01111111B ;8
DB 01111011B ;9
DB 00000000B ;
;=======================================
ORG 1BH
;=======================================
DISP_TABLE:
; B0ADD PCL,A
;EFGPBACD
DB 00000010B ;0
DB 00000100B ;1
DB 00001000B ;2
DB 00000000B ;3
;==============================================================================
INT_START:
;-------------------------------------------------------------------------------
; Isr (Interrupt Service Routine)
; Arguments :
; Returns :
; Reg Change:
;-------------------------------------------------------------------------------
;-----------------------------------
; Save ACC
;-----------------------------------
B0XCH A,ACCBUF ;B0xch instruction do not change C,Z flag
B0MOV A,PFLAG
B0MOV PFLAGBUF,A
; push ;Save A and Pflag
;-----------------------------------
; Interrupt service routine
;-----------------------------------
;INTP00CHK: ; Check INT0 interrupt request
; B0BTS1 FP00IEN ; Check P00IEN
; JMP INTTC0CHK ; Jump check to next interrupt
; B0BTS0 FP00IRQ ; Check P00IRQ
; JMP INTP00 ; Jump to INT0 interrupt service routine
;INTTC0CHK: ; Check TC0 interrupt request
B0BTS1 FTC0IEN ; Check TC0IEN
JMP INT_EXIT ; Jump to exit of IRQ
B0BTS1 FTC0IRQ ; Check TC0IRQ
JMP INT_EXIT ; Jump to exit of IRQ
;-------------------------------------------------------------------------------
; TC0 interrupt service routine
;-------------------------------------------------------------------------------
INTTC0:
B0BCLR FTC0IRQ
B0BCLR FTC0IEN ; 禁止TC0 中断
B0BCLR FTC0ENB ; 停止TC0 计数
MOV A,#139;#252D
B0MOV TC0C,A ; 设置TC0C 的初始值74H
; B0ADD TC0C,A ; 定时时间256 us
B0BSET FTC0IEN ; 使能TC0 中断
B0BSET FTC0ENB ; 开始TC0 计数
MOV A,#5AH
B0MOV WDTR,A ;Clear watchdog timer
B0BTS0 BUZ
JMP SET_BUZ_SOUND
B0MOV A,BUZ_TIME
B0BTS0 FZ
JMP BUZ_CLR
MOV A,#00001000B
XOR P1,A
JMP BUZ_SOUND_END
SET_BUZ_SOUND:
MOV A,#10
B0MOV BUZ_TIME,A
BUZ_CLR:
B0BCLR BUZ
B0BCLR BUZ_OUT
BUZ_SOUND_END:
;==============================
INCMS TIME_MS
NOP
B0MOV A,TIME_MS
SUB A,#40
B0BTS1 FC
JMP TIME_END
B0MOV TIME_MS,A
INCMS TIME_10MS
NOP
INCMS TIME_20MS
NOP
B0MOV A,DEL_100MS
B0BTS1 FZ
DECMS DEL_100MS
NOP
B0MOV A,BUZ_TIME
B0BTS1 FZ
DECMS BUZ_TIME
NOP
TIME_END:
;-----------------------------------
; Exit interrupt service routine
;-----------------------------------
INT_EXIT:
; pop ;Restore A and Pflag
B0MOV A,PFLAGBUF
B0MOV PFLAG,A ;Restore the PFlag
B0XCH A,ACCBUF ;Restore the Reg. A
;B0xch instruction do not change C,Z flag
RETI ;Exit the interrupt routine
;-------------------------------------------------------------------------------
; INT0 interrupt service routine
;-------------------------------------------------------------------------------
;INTP00:
; B0BCLR P00IRQ
;
; ;Process P0.0 external interrupt here
;
; JMP INT_EXIT
;------------------------------------
;脉冲输出
;------------------------------------
;CLK_OUT:
; B0BSET CLK
; NOP
; B0BCLR CLK
; RET
;------------------------------------
;段码输出
;------------------------------------
VFD_OUT:
B0MOV DISP_COM,A
MOV A,#8
B0MOV KEY_RAM,A
VFD_DATAOUT1:
B0BCLR DATA_16312
B0BTS0 DISP_COM.0
B0BSET DATA_16312
; NOP
B0BSET CLK_16312
RRCM DISP_COM
B0BCLR CLK_16312
DECMS KEY_RAM
NOP
B0MOV A,KEY_RAM
B0BTS1 FZ
JMP VFD_DATAOUT1
RET
;-------------------------------------
;BCD码的转换
;-------------------------------------
BCD_CHANG:
B0MOV XS_DATA1,A
CLR XS_DATA2
BCD_DA:
B0MOV A,XS_DATA1
SUB A,#10
B0BTS1 FC
RET
B0MOV XS_DATA1,A
INCMS XS_DATA2
NOP
JMP BCD_DA
;-------------------------------------
;查表子程序
;-------------------------------------
CHECK_TABLE:
B0MOV KEY_RAM,A
B0MOV Y,#XS_TABLE$M
B0MOV Z,#XS_TABLE$L
B0MOV A,KEY_RAM
B0ADD Z,A
B0BTS1 FC
JMP GETDATAEE
INCMS Y
NOP
GETDATAEE:
MOVC
RET
;-------------------------------------------------------------------------------
; Program reset section
;-------------------------------------------------------------------------------
PROGRAM_START:
MOV A,#07FH ;Initial stack pointer and
B0MOV STKP,A ;disable global interrupt
CLR PFLAG
CLR INTEN
CLR INTRQ
MOV A,#00H ;Initial system mode
B0MOV OSCM,A
MOV A,#01110000B ;111:Fcpu/2
B0MOV TC0M,A
MOV A,#131
B0MOV TC0C,A ;0.25us{Osc16Mhz/4}*2{fcpu/2}*(256-56)=100us
B0BSET FTC0IEN ;To enable TC1 interrupt service
B0BCLR FTC0IRQ ;To clear TC1 interrupt request
B0BSET FTC0ENB ;To enable TC1 timer
MOV A,#5AH
B0MOV WDTR,A ;Clear watchdog timer
; CLR P0
CLR P1
CLR P5
;-------------------------------------------------------------------------------
; ClrRAM
; Use index @YZ to clear RAM (00h~2Fh)
;-------------------------------------------------------------------------------
ClrRAM:
CLR Y
MOV A,#2FH
B0MOV Z,A ;Set @YZ address from 2fh
ClrRAM10:
CLR @YZ ;Clear @YZ content
DECMS Z ;z = z - 1 , skip next if z=0
JMP ClrRAM10
CLR @YZ ;Clear address $00
MOV A,#12
B0MOV TIME_HOUR,A
B0BSET MOD_CONT.0
B0BSET BUZ
RES_MAIN:
MOV A,#01110000B ;111:Fcpu/2
B0MOV TC0M,A
;-------------------------------------------------------------------------------
; Main routine
;-------------------------------------------------------------------------------
MAIN:
;---------------------------------------------
;端口设置
;---------------------------------------------
COMM_START:
B0BSET FGIE ;Enable global interrupt
B0BSET FTC0IEN ; 使能TC0 中断
B0BSET FTC0ENB ; 开始TC0 计数
B0BCLR FP00IEN
; CLR P0UR ;无上拉
CLR P1UR
CLR P5UR
; CLR P0M ;置I/O方向
MOV A,#11111111B
B0MOV P1M,A
B0MOV P5M,A
B0BSET P5.7
B0BSET P5.2
;------------------------------------------
;时间处理子程序
;------------------------------------------
TIME_START:
MOV A,#20
B0BTS0 LOW_FG
MOV A,#10
B0BTS0 STR_FG
MOV A,#5
SUB A,TIME_20MS
B0BTS0 FC
JMP TIME_ENDDD
CLR TIME_20MS
INCMS FY_CONT
NOP
TIME_ENDDD:
B0BCLR SHUN
MOV A,TIME_10MS
SUB A,#50
B0BTS1 FC
B0BSET SHUN
MOV A,TIME_10MS
SUB A,#100
B0BTS1 FC
JMP TIME_ENDEE
B0MOV TIME_10MS,A
B0MOV A,WORK_TIME
B0BTS1 FZ
DECMS WORK_TIME
NOP
B0MOV A,DEL_10MS
B0BTS1 FZ
DECMS DEL_10MS
NOP
B0MOV A,DEL_10MS
B0BTS1 FZ
JMP $+3
B0BCLR HOUR_FG
B0BCLR MIN_FG
INCMS TIME_SEC
NOP
MOV A,TIME_SEC
SUB A,#1
B0BTS1 FC
JMP TIME_ENDEE
CLR TIME_SEC
INCMS TIME_MIN
NOP
MOV A,TIME_MIN
SUB A,#60
B0BTS1 FC
JMP TIME_ENDEE
CLR TIME_MIN
INCMS TIME_HOUR
NOP
MOV A,TIME_HOUR
SUB A,#24
B0BTS1 FC
JMP TIME_ENDEE
CLR TIME_HOUR
TIME_ENDEE:
;====================================
;VFD数据确定
;------------------------------------
VFD_DISP_PRO:
CLR VFD_DATA1
CLR VFD_DATA2
CLR VFD_DATA3
CLR VFD_DATA4
CLR VFD_DATA5
CLR VFD_DATA6
CLR VFD_DATA7
CLR VFD_DATA8
B0MOV A,TIME_HOUR
B0BTS0 DS_FG
MOV A,#0
CALL BCD_CHANG
B0MOV A,XS_DATA1
CALL CHECK_TABLE
B0MOV VFD_DATA3,A
B0MOV A,XS_DATA2
CALL CHECK_TABLE
B0MOV VFD_DATA4,A
B0BTS0 SHUN
B0BSET VFD_DATA3.7
B0BTS0 BUZ
B0BSET VFD_DATA3.7
B0MOV A,TIME_MIN
B0BTS0 DS_FG
B0MOV A,WORK_TIME
CALL BCD_CHANG
B0MOV A,XS_DATA1
CALL CHECK_TABLE
B0MOV VFD_DATA1,A
B0MOV A,XS_DATA2
CALL CHECK_TABLE
B0MOV VFD_DATA2,A
B0MOV A,DEL_10MS
B0BTS0 FZ
JMP DISP_NEXT_DD
B0BTS0 FIR_FG
JMP DISP_NEXT_DD
B0BTS0 SHUN
JMP DISP_NEXT_DD
CLR VFD_DATA1
CLR VFD_DATA2
CLR VFD_DATA3
CLR VFD_DATA4
DISP_NEXT_DD:
;------------------------------------
;显示子程序
;------------------------------------
VFD_XS_START:
B0BSET STB
MOV A,#00000000B;@0B00000001
B0BCLR STB
CALL VFD_OUT
MOV A,#01000000B
B0BCLR STB
CALL VFD_OUT
B0BSET STB
MOV A,#11000000B
B0BCLR STB
CALL VFD_OUT
B0MOV A,VFD_DATA1
; MOV A,#10000001B
CALL VFD_OUT
B0MOV A,VFD_DATA2
; MOV A,#00000000B
CALL VFD_OUT
B0MOV A,VFD_DATA3
; MOV A,#00000000B
CALL VFD_OUT
B0MOV A,VFD_DATA4
; MOV A,#00000000B
CALL VFD_OUT
B0MOV A,VFD_DATA5
; MOV A,#00000000B
CALL VFD_OUT
B0MOV A,VFD_DATA6
; MOV A,#00000000B
CALL VFD_OUT
B0MOV A,VFD_DATA7
; MOV A,#00000000B
CALL VFD_OUT
B0MOV A,VFD_DATA8
; MOV A,#11100000B
CALL VFD_OUT
; NOP
B0BSET STB
MOV A,#10001111B
B0BCLR STB
CALL VFD_OUT
B0BSET STB
;--------------------------------------
;确定输出状态
;--------------------------------------
OUT_START:
JMP MAIN
ENDP;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -