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

📄 source.asm

📁 低价位瑞萨豆浆机程序
💻 ASM
字号:
-M34508G4
;**********************************
; MAIN PROGRAM
;**********************************
;Copyright(C) 2007. Renesas Technology Corp., All rights reserved. 
;Frequency 500K HZ
;
test		.equ	0
;-------------------------------------------------------------------------
;		Definition Table
;-------------------------------------------------------------------------
c_s_limith	.equ	8h		; Limit value of AD result
c_s_limitl	.equ	0h
c_t_limith	.equ	7h
c_t_limitl	.equ	8h
c_y_limith	.equ	7h
c_y_limitl	.equ	6h
c_k1_on		.equ	0100b
c_k2_on		.equ	0001b
c_k3_on		.equ	0010b
c_k1_off	.equ	1011b
c_k2_off	.equ	1110b
c_k3_off	.equ	1101b
;
;-------------------------------------------------------------------------
;		RAM Table
;-------------------------------------------------------------------------
s_ad_sl		.EQU 	0,0,0		; Last value
g_ad_sl		.EQU	0,0,1		; Average of last two values
s_ad_yl		.EQU	0,0,2
g_ad_yl		.EQU	0,0,3
s_ad_tl		.EQU 	0,0,4
g_ad_tl		.EQU	0,0,5
s_ad_sh		.EQU 	0,1,0
g_ad_sh		.EQU	0,1,1
s_ad_yh		.EQU	0,1,2
g_ad_yh		.EQU	0,1,3
s_ad_th		.EQU 	0,1,4
g_ad_th		.EQU	0,1,5
s_ad_target	.EQU	0,0,6
;
g_beep_cnt	.equ	0,0,7
bf_mode		.equ	0,0,0,8
bf_beep		.equ	1,0,0,8
g_back_flag	.equ	0,0,9
t_temp		.equ	0,0,10
g_mode		.equ	0,0,11
s_wait0		.equ	0,0,12
s_wait1		.equ	0,0,13
s_wait2		.equ	0,0,14
s_wait3		.equ	0,0,15
s_ktemp		.equ	0,1,6
bf_2ms		.equ	0,0,1,7
bf_alarm	.equ	1,0,1,7
s_bak_p0	.equ	0,1,8
;-------------------------------------------------------------------------
;		Code
;-------------------------------------------------------------------------
	.org 0,0
reset:
	DI			; Disable all interrupts
	DWDT			; Disable Watch Dog Timer
	WRST
	.if test
	LA 	1100b		; Stop Xin, set f(RING) and direct clock mode
	.else
	LA	0011b
	.endif
	TMRA
;
clear_ram:
	LXY	0,0
	LZ	0
clear1:
        LA 0
        XAMI 0
        B clear1
        LXY 1,0
clear2: LA 0
        XAMI 0
        B clear2
;
;
;-------------------------------------------------------------------------
;		Initialize
; Function: 	Light up POWER LED, initialize SFR and start beep
;
;-------------------------------------------------------------------------
light_power:
	LXY 	0,1		; Light up Power LED on port D1
	RD
;
init_SFR:
set_IO:		
	LA	1000b
	OP0A			; Shut all relays and LEDs
	LA	0111b
	TFR0A			; Set relays control ports CMOS output mode
;	
	LA	1101b		
	OP1A			; Shut buzzer and LEDs
	LA	0010b
	TFR1A			; Set buzzer output pin to CMOS mode
;
	LA	1000b
	TPU0A			; Enable pull-up at P03
	LA	0001b
	TPU1A			; Enable pull-up at P10
;
set_ad:
	LA	0100b
	TQ1A			; Set AN4 as AD input, check T signal
	ADST
;
set_int:
	LA	1000b
	TI1A			; Enable INT input
	NOP
	SNZ0
	NOP
set_pwm:
	LA 	0110b
	TBA
	LA 	1101b
	T2AB			; Set data to Timer 2 and Timer 2 reload register R2L (220us = 500KHz * (109+1))
	T2HAB			; Set data to Timer 2 reload register R2H (220us = 500KHz * (109+1))
;
	LA	1111b		; Set Timer control register W2
	TW2A			;  Timer 2 Operating
				;  Select Timer 2 count source, System clock (STCK)
				;  PWM2 function valid
;
set_2ms_int:
	LA	0
	TBA
	LA	8
	TPSAB			; Set prescaler 1/9
;
	LA	2
	TBA
	LA	4
	T1AB			; Set Timer 1 interval 2ms
;
	LA	0100b
	TV1A			; Enable Timer 1 interrupt
;
	LA	0101b
	TW1A			; Start Timer 1, disable pwm1 and select prescaler as clock input
;	
	LA	1
	TPAA			; Start prescaler
;
	EI			; Enable interrupt
;
power_on_beep:
	BM	start_buzzer
	LA	1
	BM	wait_n100ms
	LA	0000b		; Disable pwm output
	TW6A

;
wait_for_key:
check_d:			; Check P10 pin
	LA	0001b		
	LXY	t_temp
	TMA	0
	IAP1
	AND
	SEAM
	BL	check_d2	; Check twice
	BL	check_m
check_d2:
	LA	0
	BM	wait_n100ms	; Wait 100ms for debounce
	LA	0001b		
	LXY	t_temp
	TMA	0
	IAP1
	AND
	SEAM
	BL	mode_lvdou	; Go to mode	
check_m:			; Check P03 pin
	LA	1000b
	LXY	t_temp
	TMA	0
	IAP0
	AND
	SEAM
	BL	check_m2	; Check twice	
	BL	check_n
check_m2:
	LA	0
	BM	wait_n100ms	; Wait 100ms for debounce	
	LA	1000b
	LXY	t_temp
	TMA	0
	IAP0
	AND
	SEAM
	BL	mode_lvdou	; Go to mode	
check_n:
	LXY	0,0		; Load 0 into Y
	SZD			; Check D0 pin
	B	check_d
	LA	0
	BM	wait_n100ms	; Wait 100ms for debounce	
	LXY	0,0		; Load 0 into Y
	SZD			; Check twice
	B	check_d
	BL	mode_lvdou	
;
;********************************************************************************
		.org		1,0
;================================================================================
;=
;=		Interrput Vector Table
;=
;================================================================================
	EI			; External 0 interrupt <not use>
	RTI			;
;+++++++++++++++++++++++++++++++;
	EI			;
	RTI			;
;+++++++++++++++++++++++++++++++;
	BL	t1_ih		; Timer 1 interrupt <in use>
				;
;+++++++++++++++++++++++++++++++;
	EI			; Timer 2 interrupt <not use>
	RTI			;
;+++++++++++++++++++++++++++++++;
	EI			;
	RTI			;
;+++++++++++++++++++++++++++++++;
	EI			;
	RTI			;
;+++++++++++++++++++++++++++++++;
	EI			; A/D interrupt <not use>
	RTI			;
;+++++++++++++++++++++++++++++++;
	EI			; 
	RTI			;
;
;-------------------------------------------------------------------
;	t1_ih
;-------------------------------------------------------------------
t1_ih:
	.clb	bf_2ms
adc:
	SNZAD
	B	adc		; Wait for ADC stop
	LXY	s_ad_target	; Check which signal is converted
	TAM	0
	A	0fh
	B	check_1
	LA	2		; When it comes to f, reset it to 2
	TMA	0
	LA	0101b		; Change AD channel to AN5, S signal
	TQ1A
	B	adc_t_store	; T signal result available
check_1:
	TMA	0
	SEA	1
	B	adc_y_store	; Y signal result available
	LA	0000b		; Change AD channel to AN0, Y signal
	TQ1A
	B	adc_s_store	; S signal result available
adc_y_store:
	LA	0100b		; Change AD channel to AN4, T signal
	TQ1A
	LXY	s_ad_yl
adc_s_store:
	LXY	s_ad_sl		; S signal result available
adc_t_store:
	LXY	s_ad_tl
	TABAD			; Transmit AD result register A&B
	XAM	0		; Exchange the lower 4 bits of the latest result and the previous one's
	AMC			; Add two lower 4 bits
	INY
	XAMD	1		; Temporarily save the lower 4 bits of the middle result
	TAB
	XAM	0		; Save the higher 4 bits of the latest result
	AMC			; Add two higher 4 bits
	RAR			; Right rotate = divide by 2
	INY
	TMA	1		; Save the higher 4 bits of the average
	TAM	0		
	RAR
	TMA	0		; Save the lower 4 bits of the average
;
	.if 1
	TAY
	SEA	1
	B	start_ad
s_analyse:
	LA	c_s_limith
	TBA
	LA	c_s_limitl
	BM	compare_8
	.szxyb	bf_alarm
	B	alarm
not_alarm:
	SZC
	B	start_alarm	; S value over limit, alarm
	B	start_ad	; No S signal, return
start_alarm:
	LXY	s_bak_p0
	LA	1001b
	TMA	0
	IAP0			; Save relays' status
	XAM	0
	AND
	OP0A			; Shut K1 and K3
	LA	1000b
	TW6A			; Enable pwm1 output
	.seb	bf_alarm
	B	t1_loop		; Loop in ADC sub routine
alarm:
	SZC			
	B	t1_loop		; Loop in ADC sub routine
stop_alarm:
	LA	0000b		; Disable pwm1 output
	TW6A
	LA	c_k2_off
	BM	shut_kn
	LXY	s_bak_p0
	LA	c_k3_on
	SZB	1
	BM	open_kn
	LXY	s_bak_p0
	LA	c_k1_on
	SZB	2
	BM	open_kn
	LXY	s_bak_p0
	LA	c_k2_on
	SZB	0
	BM	open_kn
	.clb	bf_alarm
	.endif
start_ad:
	ADST			; Start a new ADC process
t1_exit:
	EI			; Enable interrupt
	RTI
t1_loop:
	LA	0101b
	TQ1A
	LXY	s_ad_target
	LA	2
	TMA	0
	ADST
	B	adc
;********************************************************************************
;-------------------------------------------------------------------
;	Subroutines
;-------------------------------------------------------------------
	.org 2,0
;-------------------------------------------------------------------
;	Start_buzzer
;-------------------------------------------------------------------
start_buzzer:	
	LA	1000b		; Set Timer control register W6
	TW6A			;  Select P1_1(input)/CNTR1(I/O)
	RT	
;-------------------------------------------------------------------------
;		Compare_8
; Function: 	Compare M(DP)&M(DP^1) and AB
; Output: 	M(DP)&M(DP^1) < AB C = 0;
;		M(DP)&M(DP^1) >=AB C = 1;
;-------------------------------------------------------------------------
compare_8:				
	CMA
	RC			
	AMC			; M(DP) + COM(A)
	TAM	1		; Set DP to DP^1
	TAB			; Load higher 4 bits
	CMA
	AMC			; M(DP^1) + COM(B)
	RT
;-------------------------------------------------------------------
;	wait_n100ms n = A + 1
;-------------------------------------------------------------------
wait_n100ms:
	LXY	s_wait0
w100ms_loop0:
	TMA	0
	LXY	s_wait1
	LA	4		; (4+1)*(9+1)*2ms= 100ms
w100ms_loop1:
	TMA	0
	LA	9	
w100ms_loop2:	
	.szxyb	bf_2ms
	B	w100ms_loop2
	.seb	bf_2ms
	A	0fh
	B	w100ms_loop2
	LXY	s_wait1
	TAM	0
	A	0fh
	B	w100ms_loop1
	LXY	s_wait0
	TAM	0
	A	0fh
	B	w100ms_loop0	
	RT
;-------------------------------------------------------------------
;	wait_n1s n = A + 1
;-------------------------------------------------------------------
wait_n1s:
	LXY	s_wait2
w1s_loop:
	TMA	0
	LA	10
	BM	wait_n100ms
	LXY	s_wait2
	TAM	0
	A	0fh
	B	w1s_loop
	RT
;-------------------------------------------------------------------
;	open_kn
;-------------------------------------------------------------------
open_kn:
	SNZ0			; Clear INT interrupt flag
	NOP
	;DI			; Disable interrupt
op_kn_loop:
	SNZ0
	B	op_kn_loop
	LXY	s_ktemp
	TMA	0
	IAP0			; Read P0 port
	OR
	OP0A			; Execute the change on P0
	;EI			; Enable interrupt
	RT
;-------------------------------------------------------------------
;	shut_kn
;-------------------------------------------------------------------
shut_kn:
	SNZ0			; Clear INT interrupt flag
	NOP
	;DI			; Disable interrupt
sh_kn_loop:
	SNZ0
	B	sh_kn_loop
	LXY	s_ktemp
	TMA	0
	IAP0			; Read P0 port
	AND
	OP0A			; Execute the change on P0
	;EI			; Enable interrupt
	RT
;-------------------------------------------------------------------
;	check_t
;-------------------------------------------------------------------
check_t:
	LA	c_t_limith
	TBA
	LA	c_t_limitl
	LXY	g_ad_tl
	BM	compare_8
	SZC
	RT
	RTS
;-------------------------------------------------------------------
;	check_y
;-------------------------------------------------------------------
check_y:
	LA	c_y_limith
	TBA
	LA	c_y_limitl
	LXY	g_ad_yl
	BM	compare_8
	SZC
	RT
	RTS
;
;-------------------------------------------------------------------
;	lvdou procedure
;-------------------------------------------------------------------	
	.org	3,0
mode_lvdou:
	LA	0000b
	OP0A			; Light up LED of Lvdou	
	BM	start_buzzer
	LA	0		; beep 3 times
	BM	wait_n100ms
	LA	0000b
	TW6A
	LA	0
	BM	wait_n100ms
	LA	1000b
	TW6A
	LA	0
	BM	wait_n100ms
	LA	0000b
	TW6A
	LA	0
	BM	wait_n100ms
	LA	1000b
	TW6A
	LA	0
	BM	wait_n100ms
	LA	0000b
	TW6A
phase1:
	BM	check_t
	B	phase2
	LA	c_k1_on
	BM	open_kn		; Start heater
	LA	c_k2_on
	BM	open_kn
p1_loop1:
	BM	check_t		; Check temperature
	B	phase2
p1_check_y:
	BM	check_y		; Check overflow signal Y
	B	phase1
	LA	c_k1_off
	BM	shut_kn
	B	p1_loop1
phase2:		
	BM	start_buzzer
	LA	0		; Beep twice
	BM	wait_n100ms
	LA	0000b
	TW6A
	LA	0
	BM	wait_n100ms
	LA	1000b
	TW6A	
	LA	0
	BM	wait_n100ms
	LA	0000b
	TW6A
;
	LA	c_k2_off
	BM	shut_kn		; Stop heater
	LA	c_k1_off
	BM	shut_kn
;
	LA	0		; Wait 1.3s
	BM	wait_n1s
	LA	2
	BM	wait_n100ms	
	LA	c_k3_on
	BM	open_kn		; Start motor, half speed
;
	LA	0		; Wait 1.7s
	BM	wait_n1s
	LA	6
	BM	wait_n100ms
	LA	c_k2_on
	BM	open_kn		; Switch to full speed
;
	LA	1		; Wait 2.7s
	BM	wait_n1s
	LA	6
	BM	wait_n100ms
	LA	c_k2_off
	BM	shut_kn		; Back to half speed
;
	LA	1		; Wait 1.7s
	BM	wait_n1s
	LA	6
	BM	wait_n100ms
	LA	c_k3_off
	BM	shut_kn		; Stop motor
;
	LA	7		; Wait 800ms
	BM	wait_n100ms
	LA	c_k1_on
	BM	open_kn		; Start heater
	LA	c_k2_on
	BM	open_kn
phase3:
	BM	check_y
	B	phase3
	LA	c_k2_off
	BM	shut_kn
	LA	c_k1_off
	BM	shut_kn
;
	LA	12
	BM	wait_n1s
	LA	10
	BM	wait_n1s
	LA	c_k3_on
	BM	open_kn
;
	LA	5
	BM	wait_n100ms
	LA	c_k3_off
	BM	shut_kn
;
	LA	2
	BM	wait_n1s
	LA	c_k3_on
	BM	open_kn
;
	LA	1
	BM	wait_n1s
	LA	c_k2_on
	BM	open_kn
;
	LA	13
	BM	wait_n1s
	LA	c_k2_off
	BM	shut_kn
;
	LA	2
	BM	wait_n1s
	LA	c_k3_off
	BM	shut_kn
;
	LA	0
	BM	wait_n1s
	LA	c_k1_on
	BM	open_kn
;
	LA	7
	BM	wait_n1s
	LA	c_k1_off
	BM	shut_kn
;
	LA	0
	BM	wait_n1s
	LA	c_k3_on
	BM	open_kn
;
	LA	1
	BM	wait_n1s
	LA	c_k2_on
	BM	open_kn
;
	LA	13
	BM	wait_n1s
	LA	c_k2_off
	BM	shut_kn
;
	LA	2
	BM	wait_n1s
	LA	c_k3_off
	BM	shut_kn
;
	LA	3
	BM	wait_n1s
	LA	c_k1_on
	BM	open_kn
;
phase4:
	LXY	t_temp
	LA	01h
p4_loop:
	TMA	0
	LA	0fh
	BM	wait_n1s
	LXY	t_temp
	TAM	0
	A	0fh
	B	p4_loop
;
	LA	c_k1_off
	BM	shut_kn
;
	BM	start_buzzer
end:	B	end
	.END

⌨️ 快捷键说明

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