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

📄 keyjob.asm

📁 地磁炉控制程序 (带三位8字数码管显示
💻 ASM
字号:
;******************************************
key_scan:
    call    KBkey_convert           ;
    call    KBCont_convert          ;
    ret


;*****************************************************
keyjob:
    snz     KJ_key_f                ;
    jmp     mainloop                ;

    clr     KJ_key_f                ;

	sz 		power_f  				;
	jmp		keyjob_power   			;
	
	sz		wait_f					;
	jmp		mainloop				;wait 3 seconds.	
	mov		a, KB_keycode			;
	xor		a, cPOWER  				;
	snz		z						;
	jmp		mainloop				;
	jmp		kPOWER					;

keyjob_power:
; 	sz		pot_f					;no pot,  only response to POWER key.
;	jmp		keyjmp					;
; 	snz		KB_keycode.6			;
; 	jmp		mainloop				;
keyjmp:
	mov     a, KB_keycode        ;
    and     a, 0fh               ;
	addm    a, pcl               ;
    jmp     kPOWER               ;00h
    jmp     kPRESET              ;01h

    jmp     k1                   ;02H
    jmp     k10                  ;03H
                                
    jmp     kMODE0               ;04h
    jmp     kMODE1               ;05h
    jmp     kMODE2               ;06h
    jmp     kMODE3               ;07h
    jmp     kMODE4               ;08h
    jmp     kMODE5               ;09h

    jmp     kUP                  ;0ah
    jmp     kDN                  ;0bh
    jmp     kNOP                 ;0ch
    jmp     kNOP                 ;0dh
    jmp     kNOP                 ;0eh
    jmp     kNOP                 ;0fh


;********************************************************************
kPRESET:
	call	SetBuzOnce				;

	mov		a, disp_mode 			;
	xor		a, DISP_BLINK			;

	snz		z						;
	jmp		preset_1st				;
	
	clr		disp_mode				;
	call	FillTimeValue			;
	jmp		mainloop				;
preset_1st:
	mov		a, DISP_BLINK			;
	mov		disp_mode, a			;
	mov		a, 1					;
	mov		timer_disp, a			;

	clr		time_shadow   			;clear the time_preset value first.
	
	mov		a, TOTAL_BLINK_TIMES	;total blink times.
	mov		disp_state, a			;

	jmp		mainloop				;

;********************************************************************
kMODE0:
kMODE1:
kMODE2:
kMODE3:
kMODE4:
kMODE5:
;********************************************************************
	mov		a, KB_keycode			;
	sub		a, cMODE0				;
	mov		mode_state, a			;

	call	SetMode					;
	call	DispModeLED				;
	call	DispForceLED			;

	call	SetBuzOnce				;
	call	disp2idle				;
	jmp		mainloop				;

;************************************
SetMode:
	mov		a, mode_state			;
	add		a, low(ModeValueTbl)	;
	mov		tblp, a					;
	tabrdl	force_preset			;
	mov		a, tblh					;
	mov		temp_preset, a			;

	mov		a, mode_state			;
	add		a, low(ModeTimeTbl)		;
	mov		tblp, a					;
	tabrdl	acc         			;
	mov		time_preset, a			;
	mov		time_shadow, a			;
	clr		timer_minute			;
;force changed.
SetForceChange:
	mov		a, force_preset			;
	sub		a, force_now			;
	sz 		c						;
	ret								;c=1, force_preset >= force_now
	mov		a, force_preset			;
	mov		force_now, a			;
	ret								;


;********************************************************************
kPOWER:
;********************************************************************
	snz		power_f  				;
	jmp		kpon					;
	
kpoff:
	call	power_off  				;
	call	SetBuzOnce				;

	jmp		mainloop				;

    
kpon:
	clr		disp_mode				;
	clr		vLED_POWER0				;
	clr		vLED_POWER1				;

	set		power_f  				;
	set		_fan					;
	set		fan_f					;

	clr		pot_f					;

	call	SetBuzOnce				;
	call	disp_nopot				;
	
	mov		a, MODE_INITVALUE		;
	mov		mode_state, a  			;
	clr		force_now    			;
	call	SetMode					;

	sz		error_flag 				;
	jmp		kpon_error				;

; wait for 3 seconds, pot will be checked.
;
	clr		timer_3s     			;

	jmp  	mainloop 				;

kpon_error:
	clr		disp_mode				;

	set		error_f					;
	
	clr		_switch					;
	clr		_pwm					;
	mov		a, PWM_POTCHECK			;
	mov		pwm, a					;

	clr		s3_f					;sometimes, power on voltage noise.(don't know why)
	clr		timer_3s				;
	
	jmp		mainloop				;

;***********************************
power_off:
	set		wait_f   				;after power off, wait for at least 3 seconds before power on again.
	mov		a, TIME_WAIT 			;
	mov		timer_wait, a			;

	clr		_switch					;
	clr		_pwm					;
	mov		a, PWM_POTCHECK			;
	mov		pwm, a					;
    
	set		fan_f					;
	clr		timer_fan    			;

	clr		power_f					;

	clr		pot_f					;assume no pot.
	clr		force_now				;
	clr		pot_check_f				;

	clr		vi_counter				;
	clr		vad_temp				;
	clr		iad_temp				;
	clr		iad_data				;
	mov		a, 99					;assume it's 220V
	mov		vad_data, a				;
	
	clr		temp_counter			;`
	clr		temp_hi					;
	clr		temp_lo					;

	clr		IGBT_volt_f				;

;   clr		_buzzer					;
;	clr		buz_once_f				; 
	
 	clr		disp_buf0				;
 	clr		disp_buf1				;
 	clr		disp_buf2				;
	
	clr		LED_buf0				;
	clr		LED_buf1				;
	clr		vLED_HUOGUO				;
	clr		vLED_ZENDUN				;

	mov		a, DISP_POFF			;
	mov		disp_mode, a			;
	mov		a, 1					;
	mov		timer_disp, a			;
	clr		disp_state				;
	set		vLED_POWER0				;
	set		vLED_POWER1				;

	clr		shifter0				;
	clr		shifter1				;
	call	disp_update				;display off.

	set		timer_ms				;
    clr     timer_100ms          	;
    clr		timer_3s				;
	clr		timer_minute			;
	clr		timer_120m				;
	clr		timer_PotChk			;
	ret								;


    
;********************************************************************
kUP:
;********************************************************************
	mov		a, MAX_FORCE 			;
	mov		w0, a 					;
    mov     a, offset force_preset  ;
    call    valueUp                 ;

	sz 		force_preset			;
    jmp     force_com               ;

	clr		pot_f					;
	clr		s3_f					;
	set		timer_3s				;so the next 2.5ms, pot will be checked.

	jmp		force_com				;

;********************************************************************
kDN:
;********************************************************************
    mov     a, OFFSET force_preset  ;
    call    ValueDn                 ;

	sz 		force_preset			;
	jmp		force_com				;
	call	SetForce00				;
	
force_com:
	call	SetBuzOnce				;
	clr		timer_120m				;120 minutes no key operation, off.

	call	DispForceLED			;
	call	SetForceChange			;

	jmp 	mainloop     			;

;************************************
SetForce00:
	clr		pwm_on_f				;
	clr		_switch					;
	clr		_pwm					;
	clr		timer_3s				;
	clr		s3_f					;

	mov		a, 1					;
	mov		timer_jianxie, a		;
	ret 	         				;



;********************************************************************
k10:
;********************************************************************
	mov		a, disp_mode			;
	xor		a, DISP_BLINK			;
	snz		z						;
	jmp		mainloop				;

    call    Time10                  ;
    jmp     time_com                ;

;********************************************************************
k1:
;********************************************************************
	mov		a, disp_mode			;
	xor		a, DISP_BLINK			;
	snz		z						;
	jmp		mainloop				;

    call    Time1                   ;
time_com:
	mov		a, time_shadow			;
	mov		time_preset, a			;

	call	FillTimeValue			;

	call	SetBuzOnce				;
	clr		timer_120m				;120 minutes no key operation, off.

	mov		a, TOTAL_BLINK_TIMES	;
	sz		disp_state.0			;
	mov		a, TOTAL_BLINK_TIMES-1	;
	mov		disp_state, a			;

	jmp 	mainloop     			;

;***********************************
Time10:
	clr		timer_minute			;
	
	mov		a, 10					;
	addm	a, time_shadow			;

	mov		a, time_shadow			;
	add		a, 256-MAX_TIME			;
	snz		c						;
	ret								;

	mov		a, MAX_TIME				;
	mov		time_shadow, a			;
	ret								;

;***********************************
Time1:
	clr		timer_minute			;
	
	mov		a, 1 					;
	addm	a, time_shadow			;

	mov		a, time_shadow			;
	add		a, 256-MAX_TIME			;
	snz		c						;
	ret								;

	mov		a, MAX_TIME				;
	mov		time_shadow, a			;
	ret								;


;********************************************************************
kNOP:
;********************************************************************
    jmp     mainloop                ;


    

;******************************************************************
;  do it only when  power_on
error_process:
	snz		power_f					;
	ret								;
	snz		ms100_f					;
	ret								;
	sz		error_flag 				;
	jmp		$+3						;

	clr		error_f					;
    ret                             ;

	sz		error_f					;
	jmp		ep_not1st				;not the first time, just display it.

	set		error_f					;
	clr		disp_mode				;
 	jmp 	error_response			;


ep_not1st:
;	snz		s3_f					;
;	ret								;
	jmp		disp_error				;update  error state every 3 seconds.

;***********************************
error_response:
	snz		power_f					;
	ret		           				;
	clr		_switch					;
	clr		_pwm					;
	mov		a, PWM_POTCHECK			;
	mov		pwm, a					;

	mov		a, 1					;
	mov		force_now, a  			;
disp_error:
	clr		pot_f					;

	clr		w2						;
	mov		a, 0eh  				;display "e0x"
	mov		w1,a    				;

	mov		a, 8    				;loop counter.
	mov		w0, a     				;

	mov		a, error_flag			;
de_loop:
	rrc		acc           			;
	sz 		c    					;
	jmp		de_ok    				;
	sdz     w0   					;
	jmp		de_loop					;
de_ok:
	mov		a, 9					;
	subm	a, w0       			;
	jmp		FillValue				;


;***********************************
ValueUp:
	mov		mp0, a					;
    inc     r0                      ;

    mov     a, w0                   ;
    sub     a, r0                   ;

    sz      c                       ;
    ret                             ;C=1; w0(MAX) >= R0
    mov     a, w0                   ;
    mov     r0, a                   ;
    ret                             ;
    
;******************************************************************
ValueDn:
    mov     mp0, a               	;
    sz      r0                   	;
    dec     r0                   	;
    ret                          	;



	

⌨️ 快捷键说明

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