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

📄 xqb5030a.asm

📁 这是一个全自动洗衣机的控制器程序
💻 ASM
📖 第 1 页 / 共 5 页
字号:
;
; 2003-12-10 10:11 START
; WILI WASHER XQB5030
; FUJITSU MB89P935C (8MHz)
;

	.PROGRAM	START
	.TITLE		START

#INCLUDE XQB5030.H

; ■■■■■■■■■■■■■■■■■■■■■■■■■■■
	.SECTION	CODE,CODE,LOCATE = 0xC000
; ■■■■■■■■■■■■■■■■■■■■■■■■■■■
START
	MOVW	SP,#280H			; 堆栈
	MOVW	A,#0030H			; BANK0
	MOVW	PS,A
	CLRI					; 关中断
; ◇◇ 设置 I/O 口 ◇◇
	MOV	DDR0,#0FFH			; 方向定义: 1 -- output , 0 -- input
	MOV	PUL0,#0FFH			; 上拉设置: 1 -- pull-up on , 0 -- pull-up off
	MOV	PDR0,#0F0H			; 初始数据: 关闭显示 , 关闭控制输出
	MOV	DDR3,#11000001B
	MOV	PUL3,#0FFH
	MOV	PDR3,#11000001B			; 关显示电源
	MOV	DDR4,#0FFH
	MOV	OUT4,#0FH			; Pin output form set to CMOS push-pull type
	MOV	PDR4,#00H
	MOV	DDR5,#01H			; 空脚 , 上拉
	MOV	PUL5,#01H
	MOV	PDR5,#01H
; ◇◇ 设置中断 ◇◇
	MOV	SYCC,#10000111B			; INSTRUCTION CYCLE 0.5US (8MHz)
	MOV	STBC,#00010000B			; 正常模式
	MOV	TBTC,#01000110B			; Time-base timer			〓 Page 96 〓
	MOV	TCCR,#0				; 捕捉控制寄存器			〓 Page 136 〓
	MOV	TCR0,#01111110B			; Timer0: 水位频率计数,上升沿有效	〓 Page 138 〓
	MOV	TDR0,#20			; 每 20 脉冲中断一次			〓 Page 143 〓
	MOV	TCR1,#01100110B			; Timer1: 定时,32us (8MHz)		〓 Page 140 〓
	MOV	TDR1,#125			; 4ms 中断一次 (8MHz)			〓 Page 144 〓
	MOV	TCR2,#0				; P34 作为普通口			〓 Page 142 〓
	MOV	EIC1,#01010101B			; int10,int11 设置: 中断请求有效,下降沿有效
	MOV	EIC2,#0
	MOV	ILR1,#00111010B			; 设置中断优先级: timer1 --> int10 / int11 --> int12(低)
	MOV	ILR2,#0FFH
	MOV	ILR3,#0FFH
	MOV	ILR4,#0FFH
	MOV	TCR0,#01111111B			; Timer0 start count
	MOV	TCR1,#01100111B			; Timer1 start
	SETI					; 开中断
; ◇◇ 蜂鸣器频率设置 ◇◇
	MOV	BZCR,#0
	MOV	RCR21,#00111001B		; 计数周期 = 1us , 蜂鸣频率 = 2.7KHz
	MOV	RCR22,#00000010B		; 蜂鸣周期 = 1s / 2700 = 370us = 172H
	MOV	RCR23,#00110010B		; 占空比为 50% , 172H / 2 = 0B9H
	MOV	RCR24,#00000101B
; ◇◇ 设置看门狗 ◇◇
	MOV	WDTC,#05H			; 复位后第一次写,看门狗计时开始 (P106)
						; 第二次及以后写,清看门狗计时
	JMP	CLRRAM	; ◆◆ 调试用 ◆◆
	CMP	TEST_55,#55H			; 判断标记单元是否被改变
	BNE	CLRRAM
	CMP	TEST_AA,#0AAH
	BEQ	JMP_START
	JMP	CLRRAM
JMP_START
	JMP	START_LOOP
; ◇◇ 清 RAM : 0080H -- 027FH ◇◇
CLRRAM
	MOVW	IX,#80H
CLRRAM_LOOP
	NOP
	MOV	@IX,#0
	INCW	IX
	MOVW	A,IX
	MOVW	A,#280H
	CMPW	A
	BLO	CLRRAM_LOOP
	MOV	TEST_55,#55H			; 测试位
	MOV	TEST_AA,#0AAH
; ◇◇ 等待上电 ◇◇
	MOV	LED_1ST,#0FFH			; 数码管/指示灯暗
	MOV	LED_2ST,#0FFH
	MOV	LED_3ST,#0FFH
	MOV	LED_4ST,#0FFH
	MOV	LED_5ST,#0FFH
LOOP_POWERTEST
	MOV	WDTC,#05H			; 清看门狗
	BBC	KEY_POWER,LOOP_POWERTEST	; 【电源】按键检测
; ★★ 判是否老化试验 ★★
	BBC	KEY_STARTHOLD,NORMALLY_POWER	; 【起/停】按键检测
CONTWASH_POWER
	SETB	KEY_BUZZER			; 置鸣响标记
DELAY_BUZZER
	CMP	TIME_BUZZER_4MS,#50
	MOV	WDTC,#05H			; 清看门狗
	BLO	DELAY_BUZZER
	MOV	TIME_BUZZER_4MS,#0		; 蜂鸣器鸣响计时单元清零
	SETB	TEST_CONTWASH			; 进入老化试验	
	JMP	NORMALLY_POWER
NOWATER_POWER
; ★★ 判是否无水检查 ★★

NORMALLY_POWER
	SETB	KEY_BUZZER			; 置鸣响标记
	MOV	TIME_BUZZER_4MS,#0		; 蜂鸣器鸣响计时单元清零
	SETB	CTRLPOWER			; 上电
; ◇◇ 初始化 ◇◇
	MOV	LED_1ST,#11111110B		; "标准"指示灯亮
	MOV	LED_2ST,#11110001B		; "洗涤","漂洗","脱水"指示灯亮
	MOV	LED_3ST,#11111011B		; "少量"指示灯亮
	MOV	LED_4ST,#0FFH			; 数码管暗
	MOV	LED_5ST,#0FFH
	MOV	FLAG_PROC,#00001110B		; 初始过程: 洗漂脱
	MOV	KEYTIMES_PROC,#0
	MOV	KEYTIMES_PROG,#0
	MOV	KEYTIMES_BESPEAK,#0
	MOV	KEYTIMES_WATLVL,#1		; "少量"水位
	MOV	DW_WATLVL,#0			; 低水位
	MOV	FLAG_WATLVL_BESET,#1
	MOV	LEDCTRL_BIT,#80H		; 指示灯循环显示
	CALL	GET_WASHTIME			; 取洗衣时间

; ◇◇ 主循环 ◇◇
START_LOOP
	MOV	WDTC,#05H			; 清看门狗

;	CALL	SONG_FLOWER

;	BBS	FLAG_ALARM,LOOP_111
;	CALL	TEST_WATERSENSOR		; 水位传感器异常检测
;LOOP_111

	CALL	CONTROL_OUTPUT			; ▲▲▲▲应在过零中断中调用

	BBS	KEY_POWER,START_MAIN
; ◆◆ 断电处理 ◆◆
POWER_DOWN
	MOV	TEST_55,#5AH			; 按下"电源"键,重新初始化
	MOV	LED_1ST,#0FFH			; 数码管/指示灯暗
	MOV	LED_2ST,#0FFH
	MOV	LED_3ST,#0FFH
	MOV	LED_4ST,#0FFH
	MOV	LED_5ST,#0FFH
	MOV	CTRL_OUTPUT,#0			; 关断控制输出
	CALL	CONTROL_OUTPUT			; ▲▲▲▲应在过零中断中调用
DELAY_100MS
	CMP	TIME_BUZZER_4MS,#25		; 等待鸣响
	BLO	DELAY_100MS
DELAY_KEYUP
	CALL	KEY_INPUT			; 等待按键抬起
	BBS	KEY_PRESSING,DELAY_KEYUP
	JMP	START				; 关断电源
; ◆◆ 上电工作状态 ◆◆
START_MAIN
	SETB	CTRLPOWER			; 上电
	BBS	KEY_STARTHOLD,WASH_START
WASH_HOLD
; ▲▲ "暂停"状态 ▲▲
	CMP	TIME_POWER_1MIN,#10		; 上电 10′没有按下[启停]键,自动断电
	BHS	WASH_RESTART
	MOV	CTRL_OUTPUT,#0			; 关断控制输出
	JMP	START_LOOP
WASH_START
; ▲▲ "启动"状态 ▲▲
	BBS	TIME_BESPEAK_SUB,WASH_BESPEAK
	BBS	STOP_2S,WASH_STOP_2S
	BBS	SPINING_DELAY9S,WASH_DELAY_9S
	CALL	WASH_MAIN			; 洗衣主程序
	CMP	WASH_OK,#05AH			; 洗衣完成,重新运行
	BEQ	WASH_RESTART

	JMP	START_LOOP

WASH_STOP_2S
; ▲▲ 洗衣过程中有键按下,暂停 2″ ▲▲
	CMP	TIME_BUZZER_4MS,#125
	BHS	WASH_STOP_2S_1
	MOV	CTRL_OUTPUT,#0			; 关断控制输出
	JMP	START_LOOP
WASH_STOP_2S_1
	CLRB	STOP_2S
	JMP	START_LOOP

WASH_DELAY_9S
; ▲▲ 排水阀打开延时 9.5″开电机 ▲▲
	CMP	TIME_TURN_100MS,#95
	BHS	WASH_DELAY_9S_1
	CLRB	F_ELECMOTOR_Z			; 电机正转
	CLRB	F_ELECMOTOR_F			; 电机反转
	SETB	F_OUTWATER			; 打开排水牵引器
	CLRB	F_INWATER			; 关闭进水阀
	JMP	START_LOOP
WASH_DELAY_9S_1
	CLRB	SPINING_DELAY9S
	JMP	START_LOOP

WASH_BESPEAK
; ▲▲ 预约等待状态 ▲▲
	JMP	START_LOOP

WASH_RESTART
; ▲▲ 进入待机状态 ▲▲
	MOV	TEST_55,#5AH
	JMP	START

; ■■■■■■■■■■■■■■■■■■■■■■■■■
; ■■						■■
; ■■	子程序: 显示数据/指示灯,按键输入判断	■■
; ■■	使用:	A,R3				■■
; ■■	调用:	SEND_DATA			■■
; ■■						■■
; ■■■■■■■■■■■■■■■■■■■■■■■■■
DISPLAY
	SETB	OUTPUT_LED_1			; 关显示电源
	SETB	OUTPUT_LED_2
	SETB	OUTPUT_LED_3
	SETB	OUTPUT_LED_4
	SETB	OUTPUT_LED_5
	NOP
	NOP
	NOP
	NOP
	BBC	CTRL_LED_1,JMP_901
	JMP	DISPLAY_1ST
JMP_901
	BBC	CTRL_LED_2,JMP_902
	JMP	DISPLAY_2ST
JMP_902
	BBC	CTRL_LED_3,JMP_903
	JMP	DISPLAY_3ST
JMP_903
	BBC	CTRL_LED_4,JMP_904
	JMP	DISPLAY_4ST
JMP_904
	BBC	CTRL_LED_5,JMP_905
	JMP	DISPLAY_5ST
JMP_905
	RET

; ◆◆ 显示【程序】指示灯,判断【起/停】键
DISPLAY_1ST
	MOV	A,LED_1ST
	OR	A,TWINKLE_PROG			; 闪烁位
	MOV	DISP_DATA,A
	CALL	SEND_DATA			; 段控制
	CLRB	OUTPUT_LED_1			; 位控制
	NOP
	NOP
	NOP
	NOP
	CLRB	CTRL_LED_1
	SETB	CTRL_LED_2			; 下一位显示
	BBS	END_BUZZERING,_1ST_END		; 正在结束蜂鸣,按键不响应
	BBS	INPUT_KEYVALUE,KEY_TEST_STARTHOLD
	CLRB	KEY_STARTHOLD_L			; 【起/停】键没有按下
	CLRB	KEY_STARTHOLD_ING
_1ST_END
	RET
KEY_TEST_STARTHOLD				; 检测到【起/停】键按下
	BBS	KEY_STARTHOLD_ING,_1ST_END
	BBS	KEY_STARTHOLD_L,_STARTHOLD_1
	SETB	KEY_STARTHOLD_L
	RET
_STARTHOLD_1
	SETB	KEY_STARTHOLD_ING		; 【起/停】键正在按下,抬起前不再响应
	SETB	KEY_BUZZER			; 置鸣响标记
	SETB	IFPRESS_SH			; 已经按下"启动/暂停"键,不进行 10′的自动断电计时
	SETB	TEST_OUTWATER			; 排水开始时检测是否空桶
	MOV	TIME_BUZZER_4MS,#0		; 蜂鸣器鸣响计时单元清零
	MOV	ELECTRO_STEPS,#0		; 计数电机转动周期清零
	MOV	TIME_TURN_4MS,#0		; 电机转动计时单元清零
	MOV	TIME_TURN_100MS,#0
	MOV	TIME_TWINKLE_4MS,#0
	MOV	TIMES_SOAK_ADD,#0		; 浸泡次数计数单元
	BBS	KEY_STARTHOLD,SH_CTRL_HOLD
	SETB	KEY_STARTHOLD			; 置"启动"状态
	CMP	WASHTIME_BESPEAK,#0
	BEQ	SH_CTRL_4
	MOV	A,WASHTIME_PROC			; 预约等待开始
	CMP	A,#60H
	BLO	SUB_1HOUR
SUB_2HOUR
	MOV	A,WASHTIME_BESPEAK		; 洗衣时间超过 60′时,预约时间 2 小时转换为 120′
	CLRC
	SUBC	A,#2
	DAS
	MOV	BESPEAK_SUB_1H,A
	MOV	A,WASHTIME_PROC			; washtime - 60′
	CLRC
	SUBC	A,#60H
	DAS
	MOV	R0,A
	MOV	A,#60H				; 60′- (washtime - 60′) = 120′- washtime
	CLRC
	SUBC	A,R0				; 预约时间 - 程序的运行时间
	DAS
	JMP	SH_CTRL_3
SUB_1HOUR
	MOV	A,WASHTIME_BESPEAK		; 洗衣时间小于 60′时,预约时间 1 小时转换为 60′
	CLRC
	SUBC	A,#1
	DAS
	MOV	BESPEAK_SUB_1H,A
	MOV	A,#60H
	CLRC
	SUBC	A,WASHTIME_PROC			; 预约时间 - 程序的运行时间
	DAS
SH_CTRL_3
	MOV	BESPEAK_SUB_1MIN,A
	SETB	TIME_BESPEAK_SUB		; 预约减计时开始
SH_CTRL_4
	BBC	_HOLD_SPINING,SH_CTRL_2
	SETB	SPINING_DELAY9S			; 延时9.5″开电机
	RET
SH_CTRL_HOLD
	CLRB	KEY_STARTHOLD			; 置"暂停"状态
	MOV	TWINKLE_PROC,#0			; "脱漂洗浸"不闪烁
SH_CTRL_2
	RET

; ◆◆ 显示【过程】指示灯,判断【过程】键
DISPLAY_2ST
	MOV	A,LED_2ST
	OR	A,TWINKLE_PROC			; 闪烁位
	MOV	DISP_DATA,A
	CALL	SEND_DATA			; 段控制
	CLRB	OUTPUT_LED_2			; 位控制
	CLRB	CTRL_LED_2
	SETB	CTRL_LED_3			; 下一位显示
	NOP
	NOP
	NOP
	NOP
	BBS	END_BUZZERING,_2ST_END		; 正在结束蜂鸣,按键不响应
	BBS	TIME_BESPEAK_SUB,_2ST_END	; 正在预约等待,按键不响应
	BBS	PROC_RINSEING,_2ST_END		; 正在漂洗,按键不响应
	BBS	PROC_SPINING,_2ST_END		; 正在脱水,按键不响应
	BBS	INPUT_KEYVALUE,KEY_TEST_PROCESS
	CLRB	KEY_PROCESS_L			; 【过程】键没有按下
	CLRB	KEY_PROCESS_ING
_2ST_END
	RET
KEY_TEST_PROCESS				; 检测到【过程】键按下
	BBS	KEY_PROCESS_ING,_2ST_END
	BBS	KEY_PROCESS_L,_PROCESS_1
	SETB	KEY_PROCESS_L
	RET
_PROCESS_1
	SETB	KEY_PROCESS_ING			; 【过程】键正在按下,抬起前不再响应
	SETB	KEY_BUZZER			; 置鸣响标记
	SETB	STOP_2S				; 洗衣过程中有键按下,暂停 2″
	MOV	TIME_BUZZER_4MS,#0		; 蜂鸣器鸣响计时单元清零
	MOV	ELECTRO_STEPS,#0		; 计数电机转动周期清零
	MOV	WASH_STEPS,#0			; 洗衣时各过程的步骤计数
	MOV	TIME_MAIN_4MS,#0		; 清主计时单元
	MOV	TIME_MAIN_SECH,#0
	MOV	TIME_MAIN_SECL,#0
	MOV	TIME_STEP_4MS,#0		; 清分步计时单元
	MOV	TIME_STEP_SECH,#0
	MOV	TIME_STEP_SECL,#0
	MOV	TIME_TURN_4MS,#0		; 电机转动计时单元清零
	MOV	TIME_TURN_100MS,#0
	MOV	A,KEYTIMES_PROC
	INCW	A				; 按键次数 + 1
	MOV	KEYTIMES_PROC,A
	CMP	KEYTIMES_PROC,#4
	BNE	PROC_CTRL_2
	MOV	TWINKLE_WATLVL,#00001111B	; 利用【过程】键选择只进行脱水时,水位灯熄灭(置1)
	JMP	PROC_CTRL_3
PROC_CTRL_2
	MOV	TWINKLE_WATLVL,#0
PROC_CTRL_3
	BBC	LED_SPEEDY,PROC_CTRL_3A
	BBC	LED_GENTLE,PROC_CTRL_3A
	CMP	KEYTIMES_PROC,#6
	BLO	PROC_CTRL_1
	MOV	KEYTIMES_PROC,#0		; 第6次返回到初始状态
	JMP	PROC_CTRL_1
PROC_CTRL_3A
	CMP	KEYTIMES_PROC,#5		; 当选择"轻柔"或"快速"时,跳过"浸泡"洗
	BLO	PROC_CTRL_1
	MOV	KEYTIMES_PROC,#0		; 第5次返回到初始状态
PROC_CTRL_1
	MOVW	A,#0
	MOV	A,KEYTIMES_PROC
	MOVW	A,#TAB_PROC
	CLRC
	ADDCW	A
	MOVW	EP,A
	MOV	A,@EP				; 取值
	MOV	R2,A
	RORC	A
	RORC	A
	RORC	A
	RORC	A
	AND	A,#00001111B
	MOV	R1,A
	MOV	A,FLAG_PROC
	AND	A,#11110000B
	OR	A,R1
	MOV	FLAG_PROC,A			; 取选定过程
	MOV	A,R2
	AND	A,#00001111B
	MOV	LED_2ST,A			; 取选定过程的"脱漂洗浸"指示灯状态
	CALL	GET_WASHTIME			; 取洗衣时间
	RET

; ◆◆ 显示【水位】指示灯,判断【程序】键
DISPLAY_3ST
	MOV	A,LED_3ST
	OR	A,TWINKLE_WATLVL		; 闪烁位
	MOV	DISP_DATA,A
	CALL	SEND_DATA			; 段控制
	CLRB	OUTPUT_LED_3			; 位控制
	CLRB	CTRL_LED_3
	SETB	CTRL_LED_4			; 下一位显示
	NOP
	NOP
	NOP
	NOP
	BBS	END_BUZZERING,_3ST_END		; 正在结束蜂鸣,按键不响应
	BBS	TIME_BESPEAK_SUB,_3ST_END	; 正在预约等待,按键不响应
	BBS	PROC_RINSEING,_3ST_END		; 正在漂洗,按键不响应
	BBS	PROC_SPINING,_3ST_END		; 正在脱水,按键不响应
	BBS	INPUT_KEYVALUE,KEY_TEST_PROGRAM
	CLRB	KEY_PROGRAM_L			; 【程序】键没有按下
	CLRB	KEY_PROGRAM_ING
_3ST_END
	RET
KEY_TEST_PROGRAM				; 检测到【程序】键按下
	BBS	KEY_PROGRAM_ING,_3ST_END
	BBS	KEY_PROGRAM_L,_PROGRAM_1
	SETB	KEY_PROGRAM_L
	RET
_PROGRAM_1
	SETB	KEY_PROGRAM_ING			; 【程序】键正在按下,抬起前不再响应
	SETB	KEY_BUZZER			; 置鸣响标记
	SETB	STOP_2S				; 洗衣过程中有键按下,暂停 2″
	MOV	TIME_BUZZER_4MS,#0		; 蜂鸣器鸣响计时单元清零
	MOV	ELECTRO_STEPS,#0		; 计数电机转动周期清零
	MOV	WASH_STEPS,#0			; 洗衣时各过程的步骤计数
	MOV	TIME_MAIN_4MS,#0		; 清主计时单元
	MOV	TIME_MAIN_SECH,#0
	MOV	TIME_MAIN_SECL,#0
	MOV	TIME_STEP_4MS,#0		; 清分步计时单元
	MOV	TIME_STEP_SECH,#0
	MOV	TIME_STEP_SECL,#0
	MOV	TIME_TURN_4MS,#0		; 电机转动计时单元清零
	MOV	TIME_TURN_100MS,#0
	MOV	A,KEYTIMES_PROG
	INCW	A				; 按键次数 + 1
	MOV	KEYTIMES_PROG,A
	BBS	PROC_SOAK,PROG_CTRL_2
	CMP	KEYTIMES_PROG,#4
	BLO	PROG_CTRL_1
	MOV	KEYTIMES_PROG,#0		; 第4次返回到初始状态
	JMP	PROG_CTRL_1
PROG_CTRL_2					; 选择了浸泡洗时,跳过"轻柔""快速"
	CMP	KEYTIMES_PROG,#2
	BLO	PROG_CTRL_1
	MOV	KEYTIMES_PROG,#0		; 第2次返回到初始状态
PROG_CTRL_1
	MOVW	A,#0
	MOV	A,KEYTIMES_PROG
	MOVW	A,#TAB_PROG
	CLRC
	ADDCW	A
	MOVW	EP,A

⌨️ 快捷键说明

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