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

📄 s608220v.src

📁 数码显示稳压器程序,是可以做交流稳压器用的
💻 SRC
📖 第 1 页 / 共 4 页
字号:
;S3F9454 IN 3.2MHz
;			199-241显示 230V
;-----------------------VER -------------------------------

	.INCLUDE "Hardware.SRC"
	.RAM_ORG	00H
		
		
		
FlagReg:	        .RAM_DS 1
FreshDisp:	        .EQU	01h
delay_short_long_flag:	.EQU	02h
IN_OUT_Volt_flag:	.EQU	04h
BLINK_500ms:		.EQU	08h
SelfBlink:		.EQU	10h
DispUnchange:		.EQU	20H
ThirdKeyPress:		.EQU	40H

UserFlag:	.RAM_DS 1
delay_set_bak:	.EQU	01H
FreshVolt:	.EQU	02H	
ProtectEable:	.EQU	04H
FreshAdc:	.EQU	08h
BasePoint:	.EQU	10H

Cnt500ms:	.RAM_DS  1
ms500:		.EQU	600/4
Cnt300ms:	.ram_ds	1
_300ms:		.equ	175


Cnt1000ms:	.ram_ds	1
_1000ms:	.equ	1000/4;

dispnow:	.RAM_DS 1		;动态显示位控控制
DispBuf:	.RAM_DS	3		; display buffer
DispStatus:	.RAM_DS 1
InVoltValue:	.RAM_DS 2
OutVoltValue:	.RAM_DS 2
;----------
BEFOREOutVoltValue:	.RAM_DS 2
UNNORMALOutVoltValue:	.RAM_DS 2
UNNORMALOutVolt_count:   .RAM_DS 1 
;----------
KeyAdcValue:	.RAM_DS	2

PressedTime:	        .RAM_DS	1	
keyold:			.RAM_DS 1
KeyPress3secCnt:	.RAM_DS 1

KeyStatus:		.RAM_DS 1
Key_uncertain:		.equ	0*3 
Key_wait_release:	.equ	1*3 
Key_normal:		.equ	2*3
Key_continue:		.equ	3*3 

;-----------------
key_uncertain_time:	.RAM_DS	1
_UNCERTAINTIME:		.EQU	10	
key_old:		.RAM_DS 1	
key_three_sec_cnt:	.ram_ds 1 
key3sec:			.equ	3


;=================
DelayTimeCnt:		.RAM_DS	1
_120sec:		.EQU	120
_5sec:			.EQU	6
_3sec:			.EQU	5

DispSetTime:		.RAM_DS	1
_4sec:			.EQU	9

LedStatus:	.ram_ds	1	;三个指示灯状态
ProtectStatus:	.RAM_DS	1
Pro255Time:	.RAM_DS	1	
Pro260Time:	.RAM_DS	1	


SystemTime:	.RAM_DS 1
SYS_TIME:	.EQU	(4000/80)


DELAY_300_display_flag:      .RAM_DS 1 
DELAY_time_display:          .RAM_DS 1 
GO_do_time                   .RAM_DS 1 

;=================	
AdataH:	.RAM_DS 1
AdataL:	.RAM_DS 1

RelayOnTime:	.RAM_DS 1
_6s:	.EQU	6		;短延时
_120s:	.EQU	120		;长延时

;------------------------------------------------------------
WORK_LED:          .MACRO    ON_OFF
        .IF         ON_OFF==ON
        
           AND	    DispBuf+0,#~80h
	
	.ELSE
	
           OR	    DispBuf+0,#80h	;常暗

         .ENDIF
         .ENDM
;---------
DELAY_LED:         .MACRO    ON_OFF
         .IF        ON_OFF==ON
         
           AND       DispBuf+1,#~80H
           
         .ELSE
         
           OR        DispBuf+1,#80H
           
         .ENDIF
         .ENDM
;---------
ERROR_LED:         .MACRO    ON_OFF
         .IF        ON_OFF==ON
         
           AND       DispBuf+2,#~80H
           
         .ELSE
         
           OR        DispBuf+2,#80H
           
         .ENDIF
         .ENDM
;========
	;-----------------------------
		.ORG     0000H            
	.VECTOR  00H,INT_Handler  

INT_Handler::
	TM	T0CON,#00000001B
	JR 	NZ,INT_Timer0
	IRET
;----------------------------------------------
	        .ORG     003CH 
	DB      00H   
	DB      00H 
	DB      0E7H 
	DB      03H   
	;----------------
INT_Timer0::	;80us	interrupt

	TM	ADCON,#ADC_OEC
	JR	Z,skip_fresh_adc
	LD	AdataH,ADDATAH
	LD	AdataL,ADDATAL
	OR	ADCON,#START_ADC
	OR	UserFlag,#FreshAdc
skip_fresh_adc:

	DEC	SystemTime          
	JP	NZ,end_int_timer0
	LD	SystemTime,#SYS_TIME
	
	CP      DELAY_time_display,#0
	JR      EQ,SKIP_DELAY_time_display
        DEC     DELAY_time_display
        
        CP      DELAY_time_display,#190
        JR      NE,SKIP_DELAY_time_display11
        OR      DELAY_300_display_flag,#08H
  SKIP_DELAY_time_display11:
        CP      DELAY_time_display,#0
        JR      NE,SKIP_DELAY_time_display
        OR      DELAY_300_display_flag,#01H
        AND     DELAY_300_display_flag,#~08H          
  SKIP_DELAY_time_display:   
	
  
	DEC	Cnt500ms            
	JR	NZ,skip_Cnt500ms
	LD	Cnt500ms,#ms500
	OR	FlagReg,#FreshDisp
	OR	UserFlag,#FreshVolt
	XOR	FlagReg,#BLINK_500ms 
  skip_Cnt500ms:
  	 	

        CP      Cnt300ms,#0    
        JR	Z ,skip_Cnt300ms 
        DEC	Cnt300ms  
  skip_Cnt300ms: 
    	;----------
  	DEC	Cnt1000ms        
  	JR	NZ,skip_Cnt1000ms
  	;-------------------
  	CP      GO_do_time,#0
  	JR      EQ,GO_DO_NEXT
  	DEC     GO_do_time
  	CP      GO_do_time,#0
  	JR      NE,GO_DO_NEXT
  	AND      DELAY_300_display_flag,#~10H
  GO_DO_NEXT:
  	;-------------------
  	LD	Cnt1000ms,#_1000ms
  	INC	KeyPress3secCnt
    
        CP	DelayTimeCnt,#0
        JR	EQ,skip_DelayTimeCnt
        DEC	DelayTimeCnt 
    skip_DelayTimeCnt:
    
    	CP	DispSetTime,#0
    	JR	EQ,skip_DispSetTime
    	DEC	DispSetTime
    skip_DispSetTime:
    
    
     	CP	Pro255Time,#0    
   	JR	EQ,skip_Pro255Time
   	DEC	Pro255Time
   skip_Pro255Time:
   
   	CP	Pro260Time,#0      
   	JR	EQ,skip_Pro260Time
   	DEC	Pro260Time
   skip_Pro260Time:
   
        CP	key_three_sec_cnt,#0
  	JR	EQ,skip_key_three_sec_cnt
  	DEC	key_three_sec_cnt
    skip_key_three_sec_cnt:
    
   skip_Cnt1000ms:	;一秒未到
   	
 
  	CP	PressedTime,#100     
	JR	UGE,skip_inc_PressedTime
	INC	PressedTime	
  skip_inc_PressedTime:
   	
   	CALL	display
   	
   	CP	key_uncertain_time,#0
  	JR	EQ,skip_key_uncertain_time
  	DEC	key_uncertain_time
   skip_key_uncertain_time:
   	
end_int_timer0:   	
        AND	T0CON,#0F6h
	IRET
;------------------------------------------------------
		.ORG	0100H
		JP	init_system

init_system::
	
	DI
	init_io_function	;I/O初始化
	
;	INPUT_OFF		;关断所有输入电压可控硅
	CLR	R0
    RAM_Clear:
	CLR     @R0
	INC     R0
	CP      R0,#60H
	JR      ULT,RAM_Clear
	CALL	init_parameter
	EI

;------------------------------------
	LD	R7,#OUTPUT_SEG4  
	LD	OutputStatus,R7 
	OR      DELAY_300_display_flag,#10H	
main::	
	CALL	deal_input
	CALL	check_regulate_volt
	CALL	deal_keyboard
        CALL	deal_display
	JR	main

;==============================================================================
;串行输出BYTE子程序(高位先输出):
;	入口: R13:数据,
;===================================	
_DISP_8BIT::      
        RLC	R13             
	JR	NC,SEND_LOW_BIT7
	OR      P0,#08H      
	JR      bit6
 SEND_LOW_BIT7:
        AND     P0,#~08H
        
bit6:    
        RLC	R13       
	JR	NC,SEND_LOW_BIT6
	OR      P0,#04H     
	JR      bit5
 SEND_LOW_BIT6:
        AND     P0,#~04H

bit5:
        RLC	R13           
	JR	NC,SEND_LOW_BIT5
	OR      P0,#02H     
	JR      bit4
SEND_LOW_BIT5:
        AND     P0,#~02H


bit4:
        RLC	R13            
	JR	NC,SEND_LOW_BIT4
	OR      P0,#01H    
	JR      bit3
SEND_LOW_BIT4:
        AND     P0,#~01H

bit3:
        RLC	R13          
	JR	NC,SEND_LOW_BIT3
	OR      P2,#02H    
	JR      bit2
SEND_LOW_BIT3:
        AND     P2,#~02H

bit2:
        RLC	R13          
	JR	NC,SEND_LOW_BIT2
	OR      P2,#01H   
	JR      bit1
SEND_LOW_BIT2:
        AND     P2,#~01H

bit1:
        RLC	R13          
	JR	NC,SEND_LOW_BIT1
	OR      P1,#02H     
	JR      bit0
SEND_LOW_BIT1:
        AND     P1,#~02H

bit0:
        RLC	R13           
	JR	NC,SEND_LOW_BIT0
	OR      P1,#01H     
	JR      bit0_over  
SEND_LOW_BIT0:
        AND     P1,#~01H
bit0_over:
        RET
;----------------------------------------------------------------------
;------------------------------------------------------	
display::
	OFF_DISP
	LD	R14,dispnow
	LD	R13,#DispBuf[R14]
	CALL	_DISP_8BIT	

	LD	R14,dispnow
	
	CP	R14,#0
	JR	NE,if_is_1
	ON_DIGIT_1		
	JR	medify_dispnow

if_is_1:
	CP	R14,#1
	JR	NE,is_2
	ON_DIGIT_2		
	JR	medify_dispnow
	
is_2:	
	ON_DIGIT_3	
	
medify_dispnow:
	INC	dispnow
	CP	dispnow,#3
	JR	ULT,exit_disp
	CLR	dispnow
exit_disp:

	RET	
;------------------------------------------------------------------------------		
LED_SEG_0:	.EQU	0C0H
LED_SEG_1:	.EQU	0F9H
LED_SEG_2:	.equ	0A4H
LED_SEG_5:	.EQU	92H
LED_SEG_6:	.EQU	82H
LED_SEG_8:	.EQU	80H
SIGNED_DEC:	.EQU	17	;正号偏移量
SIGNED_ADD:	.EQU	18   	;负号偏移量
LED_OFF:	.EQU	0FFH	;LED不显示
CHAR_H:		.EQU	10001001B;H
CHAR_L:		.EQU	11000111B;L
CHAR_O:		.EQU	10100011B;o
CHAR_A:		.EQU	88H
CHAR_D:		.EQU	0A1H
CHAR_U:		.EQU	11100011B;u
CHAR_T:		.EQU	10000111B;t
CHAR_R:		.EQU	10101111B;r
CHAR_C:		.EQU	0A7H
CHAR_F:		.EQU	8EH
CHAR_Y:		.EQU	10010001B;y
CHAR_E:		.EQU	86H
DISP_LED_TAB:	;七段LED显示码表,共阳极
	.DB	LED_SEG_0	;0
	.DB	LED_SEG_1	;1
	.DB	LED_SEG_2	;2
	.DB	0B0H	;3
	.DB	99H	;4
	.DB	LED_SEG_5	;5
	.DB	82H	;6
	.DB	0F8H	;7
	.DB	80H	;8
	.DB	90H	;9
	.DB	CHAR_A	;A
	.DB	83H	;B
	.DB	CHAR_C	;C
	.DB	CHAR_D	;D
	.DB	CHAR_E	;E
	.DB	CHAR_F	;F	;15
	.DB	LED_OFF	;space	;16
	.DB	0CH&0FH	;17
	.DB	00H&0FH	;18

msg_LOAD_H:;;	1	2	3	4	5	6	7	8	9      10     11   12
	.DB	CHAR_L,LED_SEG_0,CHAR_A,CHAR_D ,LED_OFF,CHAR_H,LED_OFF,LED_OFF,LED_OFF,LED_SEG_0,CHAR_F,CHAR_F,0
msg_OUT_L:
	.DB	CHAR_O,CHAR_U,CHAR_T,LED_OFF,LED_OFF,CHAR_L,LED_OFF,CHAR_D ,CHAR_E ,CHAR_L, CHAR_A ,CHAR_Y,0
msg_OUT_H:
	.DB	CHAR_O,CHAR_U,CHAR_T,LED_OFF,LED_OFF,CHAR_H,LED_OFF,CHAR_D,CHAR_E,CHAR_L,CHAR_A,CHAR_Y,0
msg_HOT:
	.DB	CHAR_H,CHAR_O,CHAR_T,LED_OFF,LED_OFF,LED_OFF,LED_OFF,LED_OFF,LED_OFF,LED_SEG_0,CHAR_F,CHAR_F,0		
msg_key_tab:
	.DB	88H,88H,88H,0
	.DB	83H,83H,83H,0
	.DB	0A7H,0A7H,0A7H,0
	.DB	0A1H,0A1H,0A1H,0
	.DB	86H,86H,86H,0
	.DB	8EH,8EH,8EH,0
set_same_dispbuf::
	LD	R0,#DispBuf
set_go:
	LD	@R0,R7
	INC	R0
	CP	R0,#DispBuf+3
	JR	ULT,set_go
	RET
;---------------------------------------------------
;------------------------------------------------------------------
; 入口: R6:数据高八位 R7:数据低八位
; 出口: BCD码->低:(R2,),R3,R4,R5
BCD_conversion::
		CLR     R2
		CLR     R3
		
		
	_1000_loop:
		LD      R4,R6	
		LD	R5,R7
		SUB     R7,#1000%256
		SBC     R6,#1000/256
		JR      C,conversion_next
		INC     R2
		JR      _1000_loop
		
        conversion_next:
		LD      R6,R4	
		LD	R7,R5
	_100_loop:
		LD      R4,R6
		LD	R5,R7
		SUB     R7,#100
		SBC	R6,#0
		JR      C,_10_loop
		INC     R3
		JR      _100_loop
					
	_10_loop:
		LD	R6,R5
		SUB	R5,#10
		JR	C,end_of_BCD_conversion
		INC	R4
		JR	_10_loop	
	end_of_BCD_conversion:
		LD	R5,R6		
		RET
;-------------------------------------------------------------	
BCD_TO_LED::
	LD	R0,#DISP_LED_TAB/256	
	LD	R1,#DISP_LED_TAB%256
	ADD	R1,R7			
	ADC	R0,#0
	LDC	R7,@RR0		
	RET	
;-------------------------------------------------
set_display_data:: ;将R3R4R5内的BCD玛放到显示缓冲区
	LD	R7,R3 
	CALL	BCD_TO_LED
	AND	DispBuf+0,#80H
	AND	R7,#~80H	
	OR 	DispBuf+0,R7
	
	LD	R7,R4
	CALL	BCD_TO_LED
	AND	DispBuf+1,#80H
	AND	R7,#~80H	
	OR 	DispBuf+1,R7
	
	LD	R7,R5 
	CALL	BCD_TO_LED
	AND	DispBuf+2,#80H
	AND	R7,#~80H
	OR 	DispBuf+2,R7
	RET	
;====================================================
dbl_divs::
	CLRWDT
	LD	R6,#16
	
	CLR	R4
	CLR	R5
 _divs_do:
 	RCF
 	RLC	R1
 	RLC	R0
 	
 	RLC	R5
 	RLC	R4
 	
 	CP	R4,R2
 	JR	ULT,no_go
 	JR	UGT,go_sub
 	CP	R5,R3
 	JR	ULT,no_go
   go_sub:
   	SUB	R5,R3
   	SBC	R4,R2
   	OR	R1,#1
   sub_en:
   no_go:
   	DEC	R6
   	JR	NZ,_divs_do
   	RET
;==========================
multiplication::          
	CLRWDT
	LD	R8,#16

	CLR	R4
	CLR	R5
	;CLR     R6
	;CLR     R7
 _mult_do:
        RRC     R2
        RRC     R3
        JR      NC,NO_add
        ADD     R5,R1
        ADC     R4,R0

 NO_add:
        RRC     R4
        RRC     R5
        RRC     R6
        RRC     R7
        
        DEC     R8
        JR      NZ,_mult_do
        
        LD      R1,R7
        LD      R0,R6
        
        RET
;===========================================
INPUTVOLT:	.equ	12
OUTVOLT:	.equ	23
KEYVOLT:	.equ	34
deal_input::
	LD	ADCON,#OUTVOLTADCON|START_ADC	
	CALL	SampleNew
	CALL	calc_volt
	LD	OutVoltValue+1,R1

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -