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

📄 s597g1.src

📁 数码管显示交流稳压器,使用9454单片机编写,汇编言语
💻 SRC
📖 第 1 页 / 共 3 页
字号:

	.INCLUDE "kbs597 hardware.src"


TEMP_OVER_LIMIT		.EQU	210 
TEMP_RESET_LIMIT	.EQU	240 
TEMP_FAN_ON             .EQU    431 
TEMP_FAN_OFF            .EQU    460
	
	.RAM_ORG 0
FlagReg:	.RAM_DS 1
BLINK_500ms:	.EQU	1
VoltHigh:	.EQU	2
RelayStatus:	.EQU	4
DELAY_FLAG:	.EQU	10H
FreshDisp:	.EQU	20h
PRECTION_FLAG:	.EQU	40h
;=================================
UserFlag:	.RAM_DS 1
DispUnchange:	.EQU	1
FreshAdc:	.EQU	2
BasePoint:	.EQU	4
haltalarmFLAG2  .EQU	08h  
lessfound:	.equ	10h
SelfBlink:	.EQU	20h  
SpkFlag:	.EQU	40h  
;=================================
SystemTimer::	.RAM_DS 1
_4ms:	.EQU	4000/T0INT_TIME

LedBlinkTimer:	.RAM_DS 1
_200ms:	.EQU	200/4
;=================================
AdataH:	.RAM_DS 1
AdataL:	.RAM_DS 1

RelayOnTime:	.RAM_DS 1
_6s:	.EQU	180		
_120s:	.EQU	3		

;=================================
dispnow:	.RAM_DS 1 
DispBuf:	.RAM_DS	3 

SeconCnt:	.RAM_DS 1
_1s:	.EQU	1000/4

InVoltValue:	.RAM_DS 2
OutVoltValue:	.RAM_DS 2
TempValue:	.RAM_DS 2
KeyAdcValue:	.RAM_DS 2
;=================================
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
_3sec:			.equ	3

_15s	.EQU	10
_10s:	.EQU	5
_5s:	.EQU	3
_3s:	.EQU	2
_5m:	.EQU	210
_30m:	.EQU	1350
_60m:	.EQU	2700
;电压保护时间
VoltProtect10s:	.RAM_DS 1
VoltProtect5s:	.RAM_DS 1
VoltProtect3s:	.RAM_DS 1

SetDispTime:		.RAM_DS		1
SETDISPTIME_LIMIT:	.EQU		4
precision:		.RAM_DS 1	
RegulateTime:		.RAM_DS 1

FreshDipsTimer:	.RAM_DS 1
_500ms:		.EQU	(580/4) 
Timer2ms:	.RAM_DS 1
;---------------
Cnt100ms:	.RAM_DS 1
_100ms:		.EQU	100/4    
HaltAlarmTime:	.RAM_DS 1        
HALTSPKTIME:	.EQU	30       
;------------------------------------------------------------
INPUT_LED:	.MACRO	Status		
	AND	LedStatus,#~GRN_LED_STATUS
	.if	Status==ON
		
		OR	LedStatus,#GRN_ON
	.else	
		.if	Status==OFF
		   OR	LedStatus,#GRN_OFF
		.else	
		    .if	Status==BLINK
		 	OR	LedStatus,#GRN_BLINK
		    .else	
		    	.if	Status==SKIP
				OR	LedStatus,#GRN_SKIP
			.endif
		     .endif
		.endif
	.endif
		.ENDM
	;--------------------------------------
OUTPUT_LED:	.MACRO	Status		
	AND	LedStatus,#~YEL_LED_STATUS
	.if	Status==ON
		
		OR	LedStatus,#YEL_ON
	.else	
		.if	Status==OFF
			OR	LedStatus,#YEL_OFF
		
		.else	
			.if	Status==BLINK
				OR	LedStatus,#YEL_BLINK
		
			.else	
			   .if	Status==SKIP
				OR	LedStatus,#YEL_SKIP
			   .endif
		        .endif
		.endif
	.endif

		.ENDM
	;-------------------------------------
WORKING_LED:	.MACRO	Status		
	AND	LedStatus,#~RED_LED_STATUS
	.if	Status==ON
		
		OR	LedStatus,#RED_ON
	.else	
		.if	Status==OFF
			OR	LedStatus,#RED_OFF
		.else	
			.if	Status==BLINK
				OR	LedStatus,#RED_BLINK
			.else	
				.if	Status==SKIP
					OR	LedStatus,#RED_SKIP
				.endif
		     	.endif
		.endif
	.endif

		.ENDM
	;-----------------------------


;=================================
	.ORG	0
	.VECTOR  00H,INT_Handler  
	;------------------
        .ORG     003CH  
	DB      00H     
	DB      00H     
	DB      00H     ; LVR disable
	DB      01H     
	;------------------
INT_Handler:
	TM	T0CON,#00000001B
	JR 	NZ,INT_Timer0
	IRET
	;=================================
INT_Timer0::
	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	Timer2ms
	JR	NZ,skip_Timer2ms
	LD	Timer2ms,#(_4ms)/2
  	CP	RegulateTime,#0		
 	JR	NE,_dec_RegulateTime
 	VoltUndo	
 	JR	RegulateTime_over
  _dec_RegulateTime:
  	DEC     RegulateTime	    
  RegulateTime_over:
  
skip_Timer2ms:	
	
	DEC	SystemTimer
	JP	NZ,skip_SystemTimer
	LD	SystemTimer,#_4ms

	DEC	LedBlinkTimer		
	JR	NZ,skip_LedBlinkTimer
	XOR	FlagReg,#BLINK_500ms
	LD	LedBlinkTimer,#_200ms
	CALL	led_control
 skip_LedBlinkTimer:
        DEC	Cnt100ms
	JR	NZ,skip_100ms
	LD	Cnt100ms,#_100ms
	INC	BellFreeTime1		

	CP	BellFreeTime,#0		
	JR	EQ,skip_BellFreeTime
	DEC	BellFreeTime
  skip_100ms:
  skip_BellFreeTime:
	CALL	bell_controll
 	DEC	SeconCnt
 	JR	NZ,skip_SeconCnt
 	LD	SeconCnt,#_1s
 	CP	HaltAlarmTime,#0
	JR	EQ,skip_HaltAlarmTime
	DEC	HaltAlarmTime
   skip_HaltAlarmTime:

	CP	VoltProtect10s,#0
	JR	EQ,skip_VoltProtect10s
	DEC	VoltProtect10s
   skip_VoltProtect10s:

	CP	VoltProtect5s,#0
	JR	EQ,skip_VoltProtect5s
	DEC	VoltProtect5s
   skip_VoltProtect5s:

	CP	VoltProtect3s,#0
	JR	EQ,skip_VoltProtect3s
	DEC	VoltProtect3s
   skip_VoltProtect3s:
   
     	CP	key_three_sec_cnt,#0
  	JR	EQ,skip_key_three_sec_cnt
  	DEC	key_three_sec_cnt
    skip_key_three_sec_cnt:
 
 	CP	RelayOnTime,#0
	JR	EQ,skip_RelayOnTime
	DEC	RelayOnTime
   skip_RelayOnTime:
        
        CP      SetDispTime,#8
        JR      UGE,skip_setDisplayTime
   	INC	SetDispTime
   skip_setDisplayTime:                
   
 skip_SeconCnt:

	DEC	FreshDipsTimer
  	JR	NZ,skip_FreshDipsTimer
  	LD	FreshDipsTimer,#_500ms
  	OR	FlagReg,#FreshDisp
  	
  skip_FreshDipsTimer:	

	CALL display	

  	CP	key_uncertain_time,#0	
  	JR	EQ,skip_key_uncertain_time
  	DEC	key_uncertain_time
   skip_key_uncertain_time:


	
skip_SystemTimer:	
	AND	T0CON,#0F6H
	IRET	
;=================================
	ORG	0100H
	JP	start_up
;=================================
;	入口: R13:数据,
;=================================
DISP_8BIT: .MACRO	
	LD      R12,#8	
 SEND_GOON:
	DISP_DATA_BUS	HIGH
	RLC	R13			
	JR	C,MD_CLK		
	DISP_DATA_BUS	LOW	
  MD_CLK:
	MAKE_IO_CLK
	DEC	R12
        JR      NZ,SEND_GOON		 
        ;RET
        .ENDM
;-----------------------------------
display::	
	OFF_DISP
	LD	R14,dispnow
	LD	R13,#DispBuf[R14]	
	DISP_8BIT		
	CP	R14,#0
	JR	NE,if_is_1
	ON_DIGIT_1		
	JR	RE_BIT

if_is_1:
	CP	R14,#1
	JR	NE,is_2
	ON_DIGIT_2			
	JR	RE_BIT
is_2:	
	ON_DIGIT_3			
	
RE_BIT:
	INC	dispnow     
	CP	dispnow,#3 
	JR	ULT,ex_disp
	CLR	dispnow 
ex_disp:
	RET	
;=================================
LED_SEG_0:	.EQU	0C0H
LED_SEG_1:	.EQU	0F9H
LED_SEG_2:	.equ	0A4H
LED_SEG_5:	.EQU	92H
SIGNED_DEC:	.EQU	17	
SIGNED_ADD:	.EQU	18   
LED_OFF:	.EQU	0FFH	
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
CHAR_P:		.EQU	10001100B
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::
MSG_PRECISION_L:	.DB	CHAR_P,CHAR_C,CHAR_L	
MSG_PRECISION_H:	.DB	CHAR_P,CHAR_C,CHAR_H
MSG_TEMP_HIGH:		.DB	CHAR_T,LED_OFF,CHAR_H
MSG_VOLT_HIGH:		.DB	LED_OFF,CHAR_H,LED_OFF
MSG_VOLT_LOW:		.DB	LED_OFF,CHAR_L,LED_OFF
MSG_ERROR:		.DB	CHAR_E,CHAR_R,CHAR_R

load_string::
	LDCI	R0,@RR6
	AND	R0,#~80H
	AND	DispBuf+0,#80H
	OR	DispBuf+0,R0
	
	LDCI	R0,@RR6
	AND	R0,#~80H
	AND	DispBuf+1,#80H
	OR	DispBuf+1,R0
	
	LDCI	R0,@RR6
	AND	R0,#~80H
	AND	DispBuf+2,#80H
	OR	DispBuf+2,R0
	RET
;-----------------------------------------
; 出口: 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:: 
	
	AND	DispBuf+2,#80H
	AND	DispBuf+0,#80H
	AND	DispBuf+1,#80H
	
	LD	R7,R3
	CALL	BCD_TO_LED
	AND	R7,#~80H
	OR 	DispBuf+0,R7
	
	LD	R7,R4
	CALL	BCD_TO_LED
	AND	R7,#~80H	
	OR 	DispBuf+1,R7
	
	LD	R7,R5 
	CALL	BCD_TO_LED
	AND	R7,#~80H	
	OR 	DispBuf+2,R7
	RET
	;=================================
;------------------------------------------------------
GRN_LED_STATUS:	.equ	00000011b
YEL_LED_STATUS:	.equ	00001100b
RED_LED_STATUS:	.equ	00110000b
GRN_OFF:	.equ	00000000b
YEL_OFF:	.equ	00000000b
RED_OFF:	.equ	00000000b
GRN_ON:		.equ	00000001b
YEL_ON:		.equ	00000100b
RED_ON:		.equ	00010000b
GRN_BLINK:	.equ	00000010b
YEL_BLINK:	.equ	00001000b
RED_BLINK:	.equ	00100000b
GRN_SKIP:	.equ	00000011b
YEL_SKIP:	.equ	00001100b
RED_SKIP:	.equ	00110000b
LedStatus:	.ram_ds	1

led_control::
	LD	R12,LedStatus
	LD	R13,R12
	AND	R12,#GRN_LED_STATUS ;
	CP	R12,#GRN_SKIP
	JR	EQ,skip_deal_grn_led
	CP	R12,#GRN_OFF
	JR	NE,if_grn_on
  grn_is_off:
	OR	DispBuf+1,#80h	
	JR	skip_deal_grn_led
  if_grn_on:
  	CP	R12,#GRN_ON	
  	JR	NE,grn_is_blink
  grn_is_on:
  	AND	DispBuf+1,#~80h
  	JR	skip_deal_grn_led
  	
  grn_is_blink:
  	TM	FlagReg,#BLINK_500ms
  	JR	Z,grn_is_on
  	JR	grn_is_off		
  skip_deal_grn_led:
  
  	LD	R12,R13
  	AND	R12,#YEL_LED_STATUS ;
	CP	R12,#YEL_SKIP
	JR	EQ,skip_deal_YEL_led
	CP	R12,#YEL_OFF
	JR	NE,if_YEL_on
  YEL_is_off:
	OR	DispBuf+0,#80h	
	JR	skip_deal_YEL_led
  if_YEL_on:
  	CP	R12,#YEL_ON	
  	JR	NE,YEL_is_blink
  YEL_is_on:
  	AND	DispBuf+0,#~80h
  	JR	skip_deal_YEL_led
  	
  YEL_is_blink:
  	TM	FlagReg,#BLINK_500ms 
  	JR	Z,YEL_is_on
  	JR	YEL_is_off		
  skip_deal_YEL_led:
 
  	LD	R12,R13
  	AND	R12,#RED_LED_STATUS ;
	CP	R12,#RED_SKIP
	JR	EQ,skip_deal_RED_led
	CP	R12,#RED_OFF
	JR	NE,if_RED_on
  RED_is_off:
	OR	DispBuf+2,#80h	
	JR	skip_deal_RED_led
  if_RED_on:
  	CP	R12,#RED_ON
  	JR	NE,RED_is_blink
  RED_is_on:
  	AND	DispBuf+2,#~80h
  	JR	skip_deal_RED_led
  	
  RED_is_blink:
  	TM	FlagReg,#BLINK_500ms 
  	JR	Z,RED_is_on
  	JR	RED_is_off		
  skip_deal_RED_led:
	RET	
;================================
BELL_IDLE:	.EQU	0
BELL_ON:	.EQU	1*3
BELL_OFF:	.EQU	2*3
BellStatus:	.RAM_DS	1 
;BELL	COMMAND
SOUND_UNDO	        .EQU	00000000b
SOUND_ONE	        .EQU	00010000b
SOUND_TWO	        .EQU	00100000b
SOUND_CONTINUE	        .EQU	00110000b
SOUND_TWOCONTINUE:	.EQU	01000000b

BellFreeTime:	.RAM_DS 	1	
BELL_SOUND_TIME: .EQU		3	
BellFreeTime1	.RAM_DS		1	
BellCycleTime	.RAM_DS 	1	

ALARM_ONE_SOUND::	.MACRO
		DI
		AND	BellStatus,#0fh
		OR	BellStatus,#SOUND_ONE
		EI
		.ENDM
ALARM_TWO_SOUND::		.MACRO
		DI
		AND	BellStatus,#0fh
		OR	BellStatus,#SOUND_TWO
		LD	BellCycleTime,#BELL_SOUND_TIME+1
		EI
		.ENDM
ALARM_ONE_CONTINUE::	.MACRO
		DI
		AND	BellStatus,#0fh
		OR	BellStatus,#SOUND_CONTINUE
		EI
		.ENDM
ALARM_TWO_CONTINUE::	.MACRO
		DI
		AND	BellStatus,#0fh
		OR	BellStatus,#SOUND_TWOCONTINUE
		EI
		.ENDM
ALARM_UNDO::	.MACRO
		AND	BellStatus,#0fh
		ENDM
		
bell_controll::	
	LD	R15,BellStatus
	AND	R15,#0Fh
	CLR	R14
	ADD	R15,#bell_case_tab%256
	ADC	R14,#bell_case_tab/256
	JP	@RR14
bell_case_tab:
	JP	CaseBELL_IDLE
	JP	CaseBELL_ON
	JP	CaseBELL_OFF
	
CaseBELL_IDLE:
	buzzer_on
	LD	R15,BellStatus
	AND	R15,#0f0h
	CP	R15,#SOUND_UNDO
	JR	EQ,end_CaseBELL_IDLE	
	AND	UserFlag,#~SpkFlag	
	JP	set_bell_on		
end_CaseBELL_IDLE:
	RET	
	;------------------------------------
CaseBELL_ON:
	CP	BellFreeTime,#0
	JR	NE,skip_change_bell_status
	AND	BellStatus,#0f0h
	OR	BellStatus,#BELL_OFF

skip_change_bell_status:
	buzzer_off
	RET
	;------------------------------------
CaseBELL_OFF:
	CP	BellFreeTime1,BellCycleTime
 	JR	ULT,skip_check_bell_command
 					
 	LD	R15,BellStatus
 	RR	R15
 	RR	R15
 	RR	R15
 	RR	R15
 	AND	R15,#0fh
 	LD	R14,R15
 	ADD	R15,R14
 	ADD	R15,R14
 	CLR	R14
 	ADD	R15,#bell_command_tab%256
 	ADC	R14,#bell_command_tab/256
 	JP	@RR14
 bell_command_tab:
 	JP	case_SOUND_UNDO	
 	JP	case_SOUND_ONE	
 	JP	case_SOUND_TWO	
 	JP	case_SOUND_CONTINUE		
 	JP	case_SOUND_TWOCONTINUE 	
 case_SOUND_UNDO:
 case_SOUND_ONE:
 	
 	LD	BellStatus,#(SOUND_UNDO|BELL_IDLE)
 	JR	set_bell_off

⌨️ 快捷键说明

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