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

📄 djj.asm

📁 家电控制器代码
💻 ASM
字号:

;
;function: 2 key--- select key
;		--- start key
;	 1 led  ----auto led display
;		----motor led
;		----heat led
;        with temperature sensor
include ht48R05a-1.inc
;		  ___   ___
;		1|   \_/   |
;	HEAT_LED-|PA3	PA4|-WATER_H
;      MOTOR_LED-|PA2	PA5|-WATER_L
;	START	-|PA1	PA6|-MOTOR_OUT
;	SELECT	-|PA0	PA7|-HEAT_OUT
;	AUTO_LED-|PB2	OS2|-
;	BUZ	-|PB1	OS1|-
;	BUZ	-|PB0	VDD|-
;		-|VSS	RES|-
;		-|PC0	PC1|-
;		 |_________|
;
;----------------------------------------------------------------------
STAT_STANDY	EQU	00H
STAT_PRE_HEAT	EQU	01H
STAT_MOTOR	EQU	02H
STAT_RE_HEAT	EQU	03H	;heat
STAT_END	EQU	04H
STAT_WARNING	EQU	05H

PRE_HEAT_MAX	EQU	5
MOTOR_TIME_MAX	EQU	4	;
MOTOR_OFF_TIME	EQU	26
MOTOR_ON_TIME	EQU	18
RE_HEAT_TIME_MAX	EQU	5
RE_HEAT_OFF_MAX		EQU	25	
W1S_COUNT_MAX	EQU	50
BUZ_S		EQU	4
BUZ_LONG_MAX	EQU	25
CHECK_KEY_DB	EQU	100
BUZ_FRE		EQU	248
BUZON		EQU	10110110b
BUZOFF		EQU	10100110b
TEMP_ERR_MAX	EQU	4
MUSIC_BEAT	EQU	8
GUAPAO_TIME_MAX	EQU	42
MUSIC_CT_MAX	EQU	3
OUT_DELAY_MAX	EQU	10
BUZ_ON_MAX	EQU	60
;------------------------------------------------------------------------
;PA pin define
heat		equ	7	;out
motor		equ	6	;out
water_l		equ	5	;in	
water_h		equ	4	;in
heat_led	equ	3	;out
motor_led	equ	2	;out
start		equ	1	;in
select		equ	0	;in

;PB pin define
auto_led	equ	2	;out

;-------------------flag

music		equ	5
guapao		equ	4
key_ready	equ	3
heat_off	EQU	2
buz_warning	equ	1
buz_long	equ	0

;err_flag
water_low	equ	0

;------------------------------------------------------------------------
data		.section	'data'
wk_status	db	?
wk_stat_bak	db	?
set_stat	db	?
key_bak		db	?
key_buf		db	?
re_h_off_c	db	?	;re_heat off count -1
re_heat_time	db	?	;re_heat time -1
w1s_count	db	?	;wait 1s count 
motor_count	db	?	;motor run count 0~30s +1
motor_time	db	?	;motor run/stop time 4 -1
count1		db	?
count2		db	?
buz_count	db	?
buz_s_time	db	?
buz_s_bak	db	?
flag		db	?
err_flag	db	?
pa_out		db	?
led_count	db	?
music_count	db	?
heat1_count	db	?
heat2_count	db	?
heat3_count	db	?
music_fre	db	?
music_loop	db	?
beat_count	db	?
guapao_t1	db	?
guapao_t2	db	?
;music_ct	db	?
out_delay_c	db	?
water_normal_c	db	?
buz_on_count	db	?
;----------------------------------------------------------------------------
wcode	.section 'code'
	org	00h
	sz	TO		;判断是否是上电复位
	jmp	main		;TO=1, watchdog time out

power_on_reset:	
	call	ram_ini
	snz	pa.select
	set	flag.music
	jmp	main


set_warning:
	mov	buz_s_bak,a
	mov	a,wk_status
	mov	wk_stat_bak,a
	mov	a,STAT_WARNING
	mov	wk_status,a
	set	flag.buz_long
	set	flag.buz_warning
	ret
main:
	clr	wdt	
	
	mov	a,00110011b
	mov	pac,a
	clr	pbc
	
	clr	pa_out.heat_led
	clr	pa_out.motor_led
	clr	pb.auto_led
	
	mov	a,set_stat
	sdz	acc
	jmp	led_next1
	set	pb.auto_led
	jmp	main_1
led_next1:
	sdz	acc
	jmp	led_next2
	set	pa_out.motor_led
	jmp	main_1
led_next2:
	sdz	acc
	jmp	power_on_reset
	set	pa_out.heat_led
main_1:

	mov	a,pa_out
	and	a,11001100b
	mov	pa,a
		
	call	buz_con
	mov	a,20
	call	delay
	
wk_work:	
	sza	wk_status
	jmp	wk_work_0
	jmp	wk_standy	;=0,stand_by
	
wk_work_0:	
	sdz	acc
	jmp	wk_work_1
	jmp	wk_pre_heat	;=1,pre_heat
wk_work_1:
	sdz	acc
	jmp	wk_work_2
	jmp	wk_motor	;=2,motor
wk_work_2:		
	sdz	acc
	jmp	wk_work_3
	jmp	wk_re_heat	;=3,re heat
wk_work_3:
	sdz	acc
	jmp	wk_work_4
	jmp	wk_end		;=5,normal end
wk_work_4:	
	sdz	acc
	jmp	power_on_reset
	jmp	wk_warning	;=6,warning

	
;**待机处理模块*************************************************
wk_standy:
	mov	a,pa
	and	a,00000011b
	mov	key_buf,a
	sub	a,key_bak
	sz	acc
	jmp	save_key
	mov	a,key_buf
	sub	a,00000011b
	sz	acc
	jmp	push_key_check
	set	flag.key_ready
	jmp	off_ret
push_key_check:				
	snz	flag.key_ready	;push key ready?
	jmp	off_ret
	clr	flag.key_ready	;select key check
	
	
	mov	a,key_buf
	sub	a,00000010b
	sz	acc
	jmp	start_key_check
	inc	set_stat
	mov	a,set_stat
	sub	a,4
	snz	c
	jmp	set_status_e1
	mov	a,1
	mov	set_stat,a
	jmp	set_status_e1
	
set_status_end:
	mov	wk_status,a
	
set_status_e1:	
	mov	a,1
	mov	buz_s_time,a
	
off_ret:	
	clr	pa_out.heat
	clr	pa_out.motor
	jmp	main_ret

start_key_check:
	mov	a,key_buf
	sub	a,00000001b	;start key check
	sz	acc
	jmp	off_ret
	mov	a,set_stat
	jmp	set_status_end

;check_key_check:
;	mov	a,key_buf
;	sub	a,00000000b
;	sz	acc
;	jmp	off_ret
;	mov	a,STAT_CHECK
;	jmp	set_status_end
	
save_key:
	mov	a,key_buf
	mov	key_bak,a
	jmp	off_ret
		

;****预加热模块********************************************
wk_pre_heat:
	sz	pa.water_l
	jmp	water_too_low
	snz	pa.water_h
	jmp	water_too_high
water_normal:
	
	inc	heat1_count
	mov	a,heat1_count
	sub	a,50
	snz	c
	jmp	water_heat
	clr	heat1_count	;1 SEC
	
	inc	heat2_count
	mov	a,heat2_count
	sub	a,60
	snz	c
	jmp	water_heat
	clr	heat2_count	; 1 Mintue
	
	inc	heat3_count
	mov	a,heat3_count
	sub	a,PRE_HEAT_MAX
	snz	c
	jmp	water_heat
	
	mov	a,STAT_MOTOR
	mov	wk_status,a
	mov	a,MOTOR_TIME_MAX	;motor run 5 time
	mov	motor_time,a
	jmp	off_ret	
		
water_heat:	
	set	pa_out.heat
	clr	pa_out.motor
	jmp	main_ret

water_too_low:
	mov	a,1
	call	delay
	snz	pa.water_l
	jmp	main_ret	;double check water low
	set	err_flag.water_low
	mov	a,4
	jmp	water_warning	;sencond OTP error in here.
	
water_too_high:
	mov	a,1
	call	delay		;delay 1ms
	sz	pa.water_h
	jmp	main_ret
	mov	a,3
water_warning:	
	call	set_warning
	jmp	main_ret
	

;****电机打浆模块***************************************
wk_motor:
	sz	pa.water_l
	jmp	water_too_low
	snz	pa.water_h
	jmp	water_too_high

wk_motor_1:
	sdz	w1s_count		;假设20MS调用一次
	jmp	main_ret
	mov	a,W1S_COUNT_MAX
	mov	w1s_count,a
	inc	motor_count		;1S 计数器
	mov	a,motor_count
	sub	a,MOTOR_ON_TIME
	sz	c
	jmp	motor_off_con_p
motor_on_con:
	set	pa_out.motor
	clr	pa_out.heat
	jmp	main_ret
	
motor_off_con_p:
	mov	a,motor_count
	sub	a,MOTOR_OFF_TIME
	snz	c			;skip if a>off_time
	jmp	motor_off_con
	clr	motor_count
	sdz	motor_time
	jmp	main_ret
	
	mov	a,set_stat		;if motor program, then goto end
	sub	a,2
	sz	z
	jmp	re_heat_end
	
	mov	a,STAT_RE_HEAT
	mov	wk_status,a
	mov	a,RE_HEAT_TIME_MAX	;heat again ? time
	mov	re_heat_time,a
	jmp	main_ret
	
motor_off_con:
	jmp	off_ret
	
;****再加热模块**********************************************
wk_re_heat:
	sz	pa.water_l
	jmp	water_too_low
	
	
	sz	flag.guapao
	jmp	guapao_heat
	sz	flag.heat_off	;if heat_f=1, skip heat off 30s
	jmp	re_heat_pause
				;if heat_f=0, heat on until water over
re_heat_on:
	snz	pa.water_h
	jmp	water_heat_over
re_heat_con:
	mov	a,RE_HEAT_OFF_MAX	;30sec heat timer
	mov	re_h_off_c,a
	mov	a,W1S_COUNT_MAX
	mov	w1s_count,a
	jmp	water_heat
	
water_heat_over:
	mov	a,1
	call	delay
	snz	pa.water_h
	set	flag.heat_off	;if water heat over, STOP heat
	jmp	re_heat_con

re_heat_pause:
	sdz	w1s_count		;假设20MS调用一次
	jmp	off_ret

	mov	a,W1S_COUNT_MAX		;1 second dao
	mov	w1s_count,a
	sdz	re_h_off_c		;re_heat off 30s?
	jmp	off_ret
	
	mov	a,set_stat		;if set_stat=3, goto end.
	sub	a,3
	sz	acc
	jmp	re_heat_p22
	jmp	re_heat_end
	
re_heat_p22:
	sz	pa.water_h		;延时时间到,判断是否挂泡
	jmp	re_heat_p1
	mov	a,1
	call	delay
	sz	pa.water_h
	jmp	re_heat_p1
	set	flag.guapao		;if guapao,
	clr	guapao_t1
	clr	guapao_t2
	jmp	off_ret
	
re_heat_p1:
	mov	a,RE_HEAT_OFF_MAX	;no guapao, 30sec heat timer dao
	mov	re_h_off_c,a
	clr	flag.heat_off
	sdz	re_heat_time		;re_heat_time
	jmp	off_ret
re_heat_end:	
	mov	a,STAT_END	;if re_heat_time OK, goto END
	mov	wk_status,a
	;set	flag.music
	clr	music_count
	jmp	main_ret

guapao_heat:
	sdz	w1s_count		;假设20MS调用一次
	jmp	main_ret
	mov	a,W1S_COUNT_MAX		;1 second dao
	mov	w1s_count,a
	
	inc	guapao_t1
	mov	a,guapao_t1
	sub	a,10
	sz	c
	jmp	guapao_s1
	mov	a,guapao_t1
	sz	pa.water_h
	jmp	no_over
	sub	a,3
	jmp	guapao_h1
no_over:
	sub	a,5
guapao_h1:
	sz	c
	jmp	off_ret
	jmp	water_heat
guapao_s1:
	clr	guapao_t1
	inc	guapao_t2
	mov	a,guapao_t2
	sub	a,GUAPAO_TIME_MAX	;42*10sec =7min
	sz	c
	jmp	re_heat_end
	jmp	off_ret
	
	
;***正常结束***************************************************
wk_end:
	sdz	w1s_count		;假设20MS调用一次
	jmp	off_ret
	mov	a,W1S_COUNT_MAX
	mov	w1s_count,a
	mov	a,buz_on_count
	sub	a,BUZ_ON_MAX
	sz	c
	jmp	buz_t_end
	inc	buz_on_count
	mov	a,2
	mov	buz_s_time,a
	jmp	off_ret
	;clr	flag.music
	;clr	buz_on_count
buz_t_end:
	clr	buz_s_time
	jmp	off_ret
	
;***出错处理模块************************************************	

wk_warning:
	snz	err_flag.water_low
	jmp	off_ret
	sz	pa.water_l
	jmp	water_low_1	;
	inc	water_normal_c
	mov	a,water_normal_c
	sub	a,100
	sz	c
	jmp	water_normal_1
	clr	flag.buz_long
	clr	flag.buz_warning
	jmp	off_ret
water_low_1:
	set	flag.buz_long
	set	flag.buz_warning
	jmp	off_ret
	
water_normal_1:
	clr	water_normal_c
	clr	err_flag.water_low
	mov	a,2
	mov	buz_s_time,a
	;clr	buz_count	
	mov	a,wk_stat_bak
	mov	wk_status,a
	jmp	off_ret
	
main_ret:
	jmp	main

	
;*****自检处理模块************************************************
wk_check:
		
	jmp	off_ret
	
	
;上电初始化RAM子程序**********************************************
ram_ini:
	clr	intc
	
	mov	a,BUZOFF
	mov	tmrc,a
		
	mov	a,00110011b
	mov	pac,a
	
	clr	pa	
	clr	pbc
		
	clr	wk_status
	
	mov	a,RE_HEAT_OFF_MAX
	mov	re_h_off_c,a
	
	mov	a,RE_HEAT_TIME_MAX
	mov	re_heat_time,a
	
	mov	a,W1S_COUNT_MAX
	mov	w1s_count,a
	
	clr	motor_count
	
	mov	a,MOTOR_TIME_MAX
	mov	motor_time,a
	
	clr	flag
	
	
	clr	heat1_count
	clr	heat2_count
	clr	heat3_count
	clr	buz_on_count
	clr	guapao_t1
	clr	guapao_t2
	clr	out_delay_c
	
	mov	a,1
	mov	buz_s_time,a
	mov	set_stat,a
	
	mov	a,8
	mov	beat_count,a
	
	mov	a,2
	mov	wdts,a
	
	clr	pa_out
	
	
	ret


;*****************************************************************
;name: 延时子程序
;input: ACC=需要延时的时间值(ms) @ 4MHz
delay:
	mov	count2,a
delay_st:
	mov	a,240
	mov	count1,a
delay_loop:
	sdz	count1
	jmp	delay_loop
	mov	a,100
	mov	count1,a
delay_loop1:
	sdz	count1
	jmp	delay_loop1
	sdz	count2
	jmp	delay_st
	ret

;*****************************************************************
;name: 蜂鸣器处理子程序
;input: buz_s_time 蜂鸣器短鸣次数寄存器
;	BUZ_S
;	flag.buz_long 蜂鸣器长鸣一声标志
;	flag.music 一段音乐
buz_con:
	inc	buz_count
	sz	buz_s_time
	jmp	buz_short
	sz	flag.buz_long
	jmp	buz_long_con
	sz	flag.music
	jmp	buz_music
	mov	a,BUZOFF
	mov	tmrc,a
	clr	buz_count
	ret
buz_short:
	mov	a,buz_count
	sub	a,BUZ_S
	sz	c
	jmp	buz_short_off_p
buz_on:	
	mov	a,BUZ_FRE
	mov	tmr,a
	mov	a,BUZON
	mov	tmrc,a
	
	ret
buz_short_off_p:
	mov	a,buz_count
	sub	a,BUZ_S*2
	sz	c
	jmp	buz_short_off
buz_off:	
	mov	a,BUZOFF
	mov	tmrc,a
	
	ret
buz_short_off:
	clr	buz_count
	dec	buz_s_time
	ret

buz_long_con:	
	mov	a,buz_count
	sub	a,BUZ_LONG_MAX
	sz	c
	jmp	buz_long_off_p
	jmp	buz_on
	
buz_long_off_p:
	mov	a,buz_count
	sub	a,BUZ_LONG_MAX+5
	snz	c
	jmp	buz_off
buz_long_off:
	clr	buz_count
	sz	flag.buz_warning
	jmp	buz_long_warning
	clr	flag.buz_long
	ret
buz_long_warning:
	mov	a,buz_s_bak
	mov	buz_s_time,a
	clr	buz_count
	ret

buz_music:
	mov	a,buz_count
	sub	a,beat_count
	sz	c
	jmp	music_beat_end
play_music:
	mov	a,music_count
	add	a,0c6h
	mov	tblp,a
	tabrdl	music_fre
	mov	a,tblh
	mov	music_loop,a
	mov	a,music_fre
	sub	a,0ffh			;if music_fre =0ffh, then end.
	sz	acc
	jmp	play_m01
	mov	a,BUZOFF		;play music end
	mov	tmrc,a
	clr	music_count
	clr	buz_count
	
;	sdz	music_ct
;	ret
	clr	flag.music
	ret
play_m01:
	mov	a,music_fre
	add	a,0b0h
	mov	tblp,a
	tabrdl	acc
	mov	tmr,a
	sz	acc
	jmp	play_m02
	mov	a,BUZOFF		;if =0, stop voice
	jmp	play_m03

play_m02:	
	mov	a,BUZON
play_m03:	
	mov	tmrc,a
	mov	a,MUSIC_BEAT
	mov	beat_count,a
	
beat_loop:	
	sdz	music_loop
	jmp	beat_rl	
	ret
beat_rl:
	rl	beat_count
	jmp	beat_loop	

music_beat_end:
	clr	buz_count
	inc	music_count
	ret
;Tone frequency tab
;
;3rd			4th		5th
;C	130.81	1	261.63	/1	523.25		1046.52		0
;C#	138.59		277.18		554.37		1108.72		1
;D	146.83	2	293.66		587.33		1174.64		2
;D#	155.56		311.13		622.25		1244.52		3
;E	164.81	3	329.63		659.26		1318.52		4
;F	174.61	4	349.23		698.46		1396.92		5
;F#	185.00		369.99		739.99		1479.96		6
;G	196.00	5	392.00		783.99		1568.00		7
;G#	207.65		415.30		830.61		1661.20		8
;A	220.00	6	440.00		880.00		1760.00		9
;A#	233.08		466.16		932.23		1864.64		a
;B	246.94	7	496.48		987.77		1985.92		b
;
	
;	org	300h
;	dc	137,143,150,156,161,167,172,176,181,185,189,193,0,0,0,0
;	dc	196,200,203,206,209,211,214,216,218,220,222,225,0,0,0,0
;	         1       2       3   4       5       6       7
;	dc	226,228,229,231,232,234,235,236,237,238,239,240,0,0,0,0
;	dc	241,242,243,243,244,245,245,246,247,247,248,248

	         
	org	1b0h
;		    1   2   3 	4   5   6   7          1  2  3  4  5  6  7
	dc	00;,137,150,161,167,176,185,193	;^  0, 1  2, 3  4  5, 6, 7
	dc	   196,203,209,211,216,220,225	;      8, 9, a  b  c  d  e
	dc	   226,229,232,234,236,238,240	;_     f 10 11 12 13 14 15
	dc	   241,243,244,245,246,247,248	;     16,17 18,19,1a,1b,1c 
	
	org	1c6h
	;dc	114h,112h,400h,0ffh

	dc	20dh,10dh,10ch,20ah,20ch	;music世上只有妈妈好
	dc	20fh,10dh,10ch,30dh
	dc	20ah,10ch,10dh,20ch,20ah
	dc	108h,106h,10ch,10ah,309h
	dc	209h,109h,10ah,20ch,10ch,10dh
	dc	20ah,209h,308h
	dc	20ch,10ch,10ah,109h,108h,106h,108h
	dc	405h,0ffh
	
	
	
;	dc	30dh,20dh,20ch,30ah,30ch	;music世上只有妈妈好
;	dc	30fh,20dh,20ch,40dh
;	dc	30ah,20ch,20dh,30ch,30ah
;	dc	208h,206h,20ch,20ah,409h
;	dc	309h,209h,20ah,30ch,20ch,20dh
;	dc	30ah,309h,408h
;	dc	30ch,20ch,20ah,209h,208h,206h,208h
;	dc	505h,0ffh
	
	
;	dc	26h,15h,23h,25h
;	dc	28h,16h,15h,36h
;	dc	23h,15h,16h,25h,13h,12h
;	dc	11h,16h,15h,13h,32h
;	dc	22h,13h,25h,26h
;	dc	23h,22h,31h
;	dc	25h,13h,12h,11h,16h,11h
;	dc	45h,0ffh

⌨️ 快捷键说明

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