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

📄 s597g1.src

📁 数码管显示交流稳压器,使用9454单片机编写,汇编言语
💻 SRC
📖 第 1 页 / 共 3 页
字号:
	RET
		
   go_mmmm:
  	
  	LD	KeyStatus,#Key_continue
  	LD	key_old,R7
  	LD	key_three_sec_cnt,#_3sec
	RET
	;---------------------------
CaseKey_wait_release:	
	CP	R7,#0
	JR	NE,key_not_release
	LD	KeyStatus,#Key_normal
  key_not_release:
	CLR	R7
	RET	
	;-------------------------------------------------------
CaseKey_normal:	
	CP	R7,#0
	JR	EQ,end_of_CaseKey_normal
	LD	KeyStatus,#Key_uncertain	
	LD	key_uncertain_time,#_UNCERTAINTIME
	LD	key_old,R7
  end_of_CaseKey_normal:
  	CLR	R7
  	RET
CaseKey_continue:          
	CP	R7,key_old
	JR	NE,new_key_press	
	CP	key_three_sec_cnt,#0	
	JR	NE,exit_CaseKey_continue
	LD	KeyStatus,#Key_wait_release
	CP	R7,#K_IN_OUT  
	JR	EQ,ret_K_inout3s
	CLR	R7           
	RET                   
	
   ret_K_inout3s:
   	LD	R7,#K_INOUT3s
   	RET

   new_key_press:	
   	LD	key_uncertain_time,#_UNCERTAINTIME
   	LD	KeyStatus,#Key_uncertain
exit_CaseKey_continue:	
	CLR	R7
	RET
;-------------------------------------------------------------------
K_NULL:          .equ	00h
K_IN_OUT:        .equ	01H
K_DELAY:         .equ	02H
K_INOUT3s        .equ	03H
deal_keyboard::
	CALL	read_key
	CLR	R6
	LD	R4,R7
	ADD	R7,R4
	ADC	R6,#0
	ADD	R7,R4,
	ADC	R6,#0
	ADD	R7,#key_case_tab%256
	ADC	R6,#key_case_tab/256
	JP	@RR6
key_case_tab:
	JP	CaseK_NULL       
	JP	CaseK_IN_OUT     	
	JP	CaseK_DELAY
	JP	CaseK_INOUT3s
CaseK_NULL:
	RET
	;=================================
CaseK_DELAY:
        TM      delaydeal_f,#02H
        JR      NZ,go_hhh
        AND	FlagReg,#~PRECTION_FLAG
        AND	FlagReg,#~DELAY_FLAG
        JR      go_vvvvv  
        
  go_hhh:
        OR	FlagReg,#PRECTION_FLAG
        OR	FlagReg,#DELAY_FLAG
  go_vvvvv:      
	CP	DispStatus,#DISP_DELAY
	JR	EQ,is_key_delay
	CP	DispStatus,#DISP_NORMAL
	JR	EQ,is_thhgh
	CP	DispStatus,#DISP_PREC_PRESS
	JR	EQ,is_thhgh
	CP	DispStatus,#DISP_INVOLT
	JR	NE,is_thhgh
 is_thhgh:
	TM	FlagReg,#PRECTION_FLAG
	JR	NZ,set_prec_high
	LD	precision,#PREC_L
	JR	exit_case_KEY_PRECISION
 set_prec_high:
	LD	precision,#PREC_H
 exit_case_KEY_PRECISION:
	LD	DispStatus,#DISP_PREC_PRESS
	CLR	SetDispTime	
	OR	FlagReg,#FreshDisp
 end_of_this_key:
	RET
 is_key_delay:
  	TM	FlagReg,#DELAY_FLAG  
 	JR	NZ,go_set_delay_long 
 	LD	RelayOnTime,#_6s     
 	JR	go_skip_long_here    
 go_set_delay_long:                  
 	LD	RelayOnTime,#_120s   
 go_skip_long_here:                  
        RET                          
;=================================
CaseK_IN_OUT:
        CP	DispStatus,#DISP_DELAY
	JR	EQ,is_delay_status
	
	TM 	UserFlag,#DispUnchange
	JR      Z,no_display_cuur
	
	CP	DispStatus,#DISP_NORMAL
	JR	EQ,set_disp_involt
	
	CP	DispStatus,#DISP_INVOLT
	JR	EQ,set_disp_normal_ 
	
        CP	DispStatus,#DISP_PREC_PRESS
	JR	EQ,set_disp_normal_
	RET
 no_display_cuur:
	CP	DispStatus,#DISP_NORMAL
	JR	EQ,set_disp_involt
		
	CP	DispStatus,#DISP_INVOLT
	JR	EQ,set_disp_normal_
	
	CP	DispStatus,#DISP_PREC_PRESS
	JR	EQ,set_disp_normal_
	
	RET

  set_disp_involt:
  	LD	DispStatus,#DISP_INVOLT
  	CLR	SetDispTime
  	OR	FlagReg,#FreshDisp
	RET
  set_disp_normal_:
  	LD	DispStatus,#DISP_NORMAL
  	OR	FlagReg,#FreshDisp 
  is_delay_status:
        RET
;=================================
CaseK_INOUT3s: 
	XOR	UserFlag,#DispUnchange
	LD	DispStatus,#DISP_NORMAL
 skip_unchange:
	RET
;=================================
GetMaxMinData::
	
	AND	UserFlag,#~FreshAdc
	
watie_djfdkfjDSL:
	CLRWDT	
	TM	UserFlag,#FreshAdc
	JR	Z,watie_djfdkfjDSL
	CLR	R0
	CLR	R1
	
	LD	R2,#0FFH
	LD	R3,#0FFH
	
	
start_get_:
	AND	UserFlag,#~FreshAdc
	
waite_over__:	
	CLRWDT
	TM	UserFlag,#FreshAdc
	JR	Z,waite_over__
	
	CLR	R4
	LD	R5,AdataH
	LD	R8,AdataL
	AND	R8,#03H
	RCF
	RLC	R5
	RLC	R4
	RCF
	RLC	R5
	RLC	R4
	OR	R5,R8

			
	CP	R4,R0
	JR	UGT,set_max
	JR	ULT,check_min
	CP	R5,R1
	JR	ULE,check_min
set_max:
	LD	R0,R4
	LD	R1,R5
	JR	check_min
check_over_time:
	SUB	R7,#1	
	SBC	R6,#0
	JR	NC,waite_over__
	RET
check_min:	
	CP	R4,R2
	JR	UGT,check_over_time
	JR	ULT,set_min
	CP	R5,R3
	JR	UGE,check_over_time
set_min:
	LD	R2,R4
	LD	R3,R5
	JR	check_over_time	
;----------------------------------------------------------------
cal_outvolt::	
	
 	LD	R1,R7
 	LD	R0,R6
	
	SUB	R1,#OUT_100ADC%256
	SBC	R0,#OUT_100ADC/256
	JR	NC,calc_continu_out
	COM	R1
	COM	R0
	ADD	R1,#1
	ADC	R0,#0
	CALL	calc_IN_volt_acture
	COM	R1
	COM	R0
	ADD	R1,#221  
	ADC	R0,#0
	JR	NC,ret_zero_volt
	JR	rejtjel
calc_continu_out:
	CALL	calc_IN_volt_acture
	ADD	R1,#220 
	ADC	R0,#0	
rejtjel:
 	LD	OutVoltValue+1,R1
 	LD	OutVoltValue,R0
	RET
ret_zero_volt:
	CLR	OutVoltValue+1
	CLR	OutVoltValue
	RET
;=================================
DC_2V:	.EQU	   102  
MAX_SAMPLE_TIME:	.EQU	240 
MIN_SAMPLE_TIME:	.EQU	122 

SampleNew::
wait_first_do:
	CLRWDT	
	TM	UserFlag,#FreshAdc
	JR	Z,wait_first_do
	AND	UserFlag,#~FreshAdc	
	CLR	R8
	CLR	R9
	OR	UserFlag,#BasePoint	
	CLR	R4
	CLR	R5	
	
	CLR	R6	
	CLR	R7
wait_adc_act_over:
	AND	UserFlag,#~FreshAdc
wait_adc_act_over_:
	CLRWDT	
	TM	UserFlag,#FreshAdc
	JR	Z,wait_adc_act_over_
	LD	R0,AdataH
	LD	R1,AdataL		
	LD	R3,R0
	
	SUB	R3,#DC_2V
	JR	NC,compare_c
	COM	R3
	INC	R3
compare_c:
	CP	R3,#3
	JR	UGT,not_base_point	
	
	TM	UserFlag,#BasePoint
	JR	Z,is_end_point
	AND	UserFlag,#~BasePoint
	CLR	R8
	CLR	R9
	
	JR	compare_next_p
	;--------------------
is_end_point:	
	CP	R8,#MIN_SAMPLE_TIME/256
	JR	UGT,set_adc_over
	JR	ULT,is_continue_sum
	CP	R9,#MIN_SAMPLE_TIME%256
	JR	UGT,set_adc_over
	JR	is_continue_sum
	;---------------
not_base_point:
	TM	UserFlag,#BasePoint
	JR	NZ,base_point_not_found	
is_continue_sum:	
	CLR	R3
	RCF
	RLC	R0
	RLC	R3
	RCF
	RLC	R0
	RLC	R3
	OR	R0,R1

	SUB	R0,#407%256
	SBC	R3,#407/256
	JR	NC,add_ccongn
	COM	R0
	COM	R3
	ADD	R0,#1
	ADC	R3,#0
	
add_ccongn:
	ADD	R5,R0
	ADC	R4,R3	
	JR      OV,is_overflow
	LD      R11,R5
	LD      R10,R4
	JR      is_not_overflow
is_overflow:            
        LD      R5,R11
	LD      R4,R10
	JR      set_adc_over
is_not_overflow:
	INC	R7	
	JR	NZ,compare_next_p
	INC	R6
	;------------
compare_next_p:
base_point_not_found:	
	INC	R9
	JR	NZ,sikip_hgekjhte
	INC	R8
sikip_hgekjhte:
	CP	R8,#MAX_SAMPLE_TIME/256
	JR	UGT,set_adc_over
	JR	ULT,wait_adc_act_over
	CP	R9,#MAX_SAMPLE_TIME%256	
	JP	ULT,wait_adc_act_over	

set_adc_over:
	LD	R3,R6
	OR	R3,R7
	JR	Z,_is_return_zero
	
	LD	R0,R4
	LD	R1,R5
	
	LD	R3,R7
	LD	R2,R6
	
	RCF
	RRC	R2
	RRC	R3
	
	CALL	dbl_divs		
	LD	R7,R1			
	LD	R6,R0
	RET
_is_return_zero:
	CLR	R6
	CLR	R7
	RET
;=================================
VOLT_200:    .EQU    285

calc_involt::
	;=================================
 	LD	R1,R7
 	LD	R0,R6
	
	SUB	R1,#VOLT_200%256
	SBC	R0,#VOLT_200/256
	JR	NC,calc_continu_in
	COM	R1
	COM	R0
	ADD	R1,#1
	ADC	R0,#0
	CALL	calc_IN_volt_acture
	COM	R1
	COM	R0
	ADD	R1,#222
	ADC	R0,#0
	JR	NC,ret_zero_volt_in
	JR	rejtjel_in
calc_continu_in:
	CALL	calc_IN_volt_acture
	ADD	R1,#219
	ADC	R0,#0
rejtjel_in:
 	LD	InVoltValue+1,R1
 	LD	InVoltValue,R0
	RET
ret_zero_volt_in:
	CLR	InVoltValue+1
	CLR	InVoltValue
	RET
;=================================
calc_IN_volt_acture: 
	LD	R7,R1
	LD	R6,R0
	RCF
	RRC	R6
	RRC	R7
	RCF
	RRC	R6
	RRC	R7
	
	RCF
	RLC	R1
	RLC	R0
	LD	R5,R1
	LD	R4,R0
	ADD	R1,R7
	ADC	R0,R6

	RCF
	RLC	R5
	RLC	R4
	RCF
	RLC	R5
	RLC	R4
	ADD	R1,R5
	ADC	R0,R4
	LD	R3,#13
	CLR	R2
	CALL	dbl_divs	
	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
;=================================
deal_input::
	LD	ADCON,#TEMP_ADCONTROL|START_ADC
	LD	R7,#30
	CLR	R6
	CALL	GetMaxMinData
	LD	TempValue,R0
	LD	TempValue+1,R1
	
	LD	ADCON,#KEYADCON|START_ADC
	LD	R7,#30
	CLR	R6
	CALL	GetMaxMinData
	LD	KeyAdcValue,R0
	LD	KeyAdcValue+1,R1
	
 Continue_Sample:
	LD	ADCON,#OUTVOLT_ADCONTROL|START_ADC
	CALL	SampleNew
	INC     Out_Volt_Count
	ADD     Out_Volt_before+1,R7
	ADC     Out_Volt_before,R6
	CP      Out_Volt_Count,#3
	JR      ULE,Continue_Sample
	RCF     
	RRC     Out_Volt_before
	RRC     Out_Volt_before+1
	
	RCF 
	RRC     Out_Volt_before
	RRC     Out_Volt_before+1
	 
	LD     R6,Out_Volt_before
	LD     R7,Out_Volt_before+1
	CLR    Out_Volt_before
	CLR    Out_Volt_before+1
	CLR    Out_Volt_Count
	LD	OutVoltRegulate+1,R7
	LD	OutVoltRegulate,R6  
	CALL	cal_outvolt

	LD	ADCON,#INVOLT_ADCONTROL|START_ADC
	CALL	SampleNew
	CALL	calc_involt

	RET
;=================================
OUT_100ADC:	.EQU	295
PREC_H:		.EQU	3
PREC_L:		.EQU	9
OutVoltRegulate: .RAM_DS 2
Out_Volt_before: .RAM_DS 2 
Out_Volt_Count:  .RAM_DS 1 

auto_regulate::
	CLR	R2	
	LD	R7,OutVoltRegulate+1
	LD	R6,OutVoltRegulate
	SUB	R7,#OUT_100ADC%256
	SBC	R6,#OUT_100ADC/256
	JR	NC,skip_abs
	LD	R2,#1	
	COM	R7
	COM	R6
	ADD	R7,#1
	ADC	R6,#0
skip_abs:
	CP	R6,#0
	JR	NZ,start_regulate
	CP	R7,precision
	JR	UGT,start_regulate
	CLR	RegulateTime
	VoltUndo
	RET
start_regulate:
	CALL	calc_regulate_time
	LD	RegulateTime,R0
	CP	R2,#1
	JR	EQ,set_volt_up
	VoltUp
	RET
set_volt_up:
	VoltDn	
	RET
;=================================
;调节时间计算
;----------------------------------------------
calc_regulate_time::
	CLR	R0	
cal_regulate_time_conti:	
	CP	R6,#0
	JR	NE,OVER_255_timr
	        
	CP	R7,#5
	JR	ULT,set_regulat_low
	
	CP	R7,#20 
	JR	UGT,OVER_255_timr
	
	LD	R0,R7
	RCF
	RRC	R7
	
	RCF
	RRC	R7
	
	RCF     
	RRC	R7
	
	ADD	R0,R7
	RET
	
OVER_255_timr:
	LD	R0,#100 
	RET
	
set_regulat_low:
	LD	R0,#3
	RET
;=================================
start_up:
		DI
	init_io_function	
	
	LD	R0,#0bfH
    RAM_Clear:
	CLR     @R0
	DEC	R0
	JR      NZ,RAM_Clear
	CLR	@R0
	CALL	init_parameter
	LD	DispBuf+0,#LED_OFF
	LD	DispBuf+1,#LED_OFF
	LD	DispBuf+2,#LED_OFF
	EI
	ALARM_UNDO         
main::	
	CLRWDT
	CALL	deal_input
 	CALL	auto_regulate
	CALL	deal_keyboard
	CLRWDT              
	CALL	deal_display
	CALL	deal_protect
	JR	main
;=================================
init_parameter::
        buzzer_on 
	LD	FreshDipsTimer,#_500ms
	LD	DispStatus,#DISP_DELAY
	LD	SystemTimer,#_4ms
	LD	LedBlinkTimer,#_200ms
	LD	SeconCnt,#_1s
	OR	FlagReg,#RelayStatus
	AND	FlagReg,#~DELAY_FLAG
	LD	precision,#PREC_H
	OR	FlagReg,#PRECTION_FLAG	
	LD	RelayOnTime,#_6s
	AND	UserFlag,#~DispUnchange	
	LD	Timer2ms,#(_4ms)/2  

	LD	VoltProtect10s,#_10s
	LD	VoltProtect5s,#_5s
	LD	VoltProtect3s,#_3s
	OR      delaydeal_f,#80H

	CLR    Out_Volt_before 
	CLR    Out_Volt_before+1
	CLR    Out_Volt_Count
	RET
;=================================
	.END

⌨️ 快捷键说明

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