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

📄 vfd时钟.asm

📁 SN8P2602B的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 + -