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

📄 xqb5030a.asm

📁 这是一个全自动洗衣机的控制器程序
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	MOV	A,@EP				; 取表值
	MOV	LED_1ST,A			; 取选定程序的指示灯状态
	CALL	GET_WASHTIME			; 取洗衣时间
	RET	

; ◆◆ 显示数码管高位,判断【水位】键
DISPLAY_4ST
	MOV	A,LED_4ST
	OR	A,TWINKLE_DATAH			; 闪烁位
	MOV	DISP_DATA,A
	CALL	SEND_DATA			; 段控制
	CLRB	OUTPUT_LED_4			; 位控制
	CLRB	CTRL_LED_4
	SETB	CTRL_LED_5			; 下一位显示
	NOP
	NOP
	NOP
	NOP
	BBS	END_BUZZERING,_4ST_END		; 正在结束蜂鸣,按键不响应
	BBS	TIME_BESPEAK_SUB,_4ST_END	; 正在预约等待,按键不响应
	BBS	PROC_SPINING,_4ST_END		; 正在脱水,按键不响应
	BBS	INPUT_KEYVALUE,KEY_TEST_WATLVL
	CLRB	KEY_WATLVL_L			; 【水位】键没有按下
	CLRB	KEY_WATLVL_ING
_4ST_END
	RET
KEY_TEST_WATLVL					; 检测到【水位】键按下
	BBS	KEY_WATLVL_ING,_4ST_END
	BBS	KEY_WATLVL_L,_WATLVL_1
	SETB	KEY_WATLVL_L
	RET
_WATLVL_1
	SETB	KEY_WATLVL_ING			; 【水位】键正在按下,抬起前不再响应
	SETB	KEY_BUZZER			; 置鸣响标记
	SETB	STOP_2S				; 洗衣过程中有键按下,暂停 2″
	MOV	TIME_BUZZER_4MS,#0		; 蜂鸣器鸣响计时单元清零
	MOV	TIME_TURN_4MS,#0		; 电机转动计时单元清零
	MOV	TIME_TURN_100MS,#0
	MOV	A,KEYTIMES_WATLVL
	INCW	A				; 按键次数 + 1
	MOV	KEYTIMES_WATLVL,A
	CMP	KEYTIMES_WATLVL,#4
	BLO	WATLVL_CTRL_1
	MOV	KEYTIMES_WATLVL,#0		; 第 4 次返回

WATLVL_CTRL_1
	CMP	KEYTIMES_WATLVL,#3
	BNE	WATLVL_CTRL_2
	MOV	DW_WATLVL,#20H			; 高水位
	JMP	WATLVL_CTRL_9
WATLVL_CTRL_2
	CMP	KEYTIMES_WATLVL,#2
	BNE	WATLVL_CTRL_3
	MOV	DW_WATLVL,#10H			; 中水位
	JMP	WATLVL_CTRL_9
WATLVL_CTRL_3
	MOV	DW_WATLVL,#0H			; 低水位
WATLVL_CTRL_9
	MOVW	A,#0
	MOV	A,KEYTIMES_WATLVL
	MOVW	A,#TAB_WATLVL
	CLRC
	ADDCW	A
	MOVW	EP,A
	MOV	A,@EP
	MOV	R1,A
	AND	A,#0FH
	MOV	LED_3ST,A			; 水位指示灯的值
	MOV	A,R1
	AND	A,#30H
	MOV	DW_WATLVL,A			; 水位分档
	MOV	A,R1
	RORC	A
	RORC	A
	RORC	A
	RORC	A
	RORC	A
	RORC	A
	AND	A,#03H
	MOV	FLAG_WATLVL_BESET,A		; 选定的水位所对应的标记值
	CALL	GET_WASHTIME			; 取洗衣时间
	RET

; ◆◆ 显示数码管低位,判断【预约】键
DISPLAY_5ST
	MOV	A,LED_5ST
	OR	A,TWINKLE_DATAL			; 闪烁位
	MOV	DISP_DATA,A
	CALL	SEND_DATA			; 段控制
	CLRB	OUTPUT_LED_5			; 位控制
	CLRB	CTRL_LED_5
	SETB	CTRL_LED_1			; 下一位显示
	NOP
	NOP
	NOP
	NOP
	BBS	END_BUZZERING,_5ST_END		; 正在结束蜂鸣,按键不响应
	BBS	TIME_BESPEAK_SUB,_5ST_END	; 正在预约等待,按键不响应
	BBS	PROC_SOAKING,_5ST_END		; 正在浸泡,按键不响应
	BBS	PROC_WASHING,_5ST_END		; 正在洗涤,按键不响应
	BBS	PROC_RINSEING,_5ST_END		; 正在漂洗,按键不响应
	BBS	PROC_SPINING,_5ST_END		; 正在脱水,按键不响应
	BBS	INPUT_KEYVALUE,KEY_TEST_BESPEAK
	CLRB	KEY_BESPEAK_L			; 【预约】键没有按下
	CLRB	KEY_BESPEAK_1ST
	CLRB	KEY_BESPEAK_ADD
_5ST_END
	RET
KEY_TEST_BESPEAK				; 检测到【预约】键按下
	BBS	KEY_BESPEAK_L,_BESPEAK_1
	SETB	KEY_BESPEAK_L
	RET
_BESPEAK_1
	BBC	KEY_BESPEAK_1ST,BESPEAK_CTRL_2
	BBS	KEY_BESPEAK_ADD,BESPEAK_CTRL_3
	CMP	TIME_TURN_100MS,#12
	BLO	_5ST_END
	SETB	KEY_BESPEAK_ADD			; 预约连续计数
	MOV	TIME_TURN_4MS,#0
	MOV	TIME_TURN_100MS,#0
	RET
BESPEAK_CTRL_3
	CMP	TIME_TURN_100MS,#2		; 每 0.2″加 1
	BLO	_5ST_END
	MOV	TIME_TURN_4MS,#0
	MOV	TIME_TURN_100MS,#0
	JMP	BESPEAK_CTRL_5
BESPEAK_CTRL_2
	SETB	KEY_BESPEAK_1ST			; 检测到"预约"键第一次按下
	MOV	TIME_TURN_4MS,#0		; 计时 1.5s
	MOV	TIME_TURN_100MS,#0
	SETB	KEY_BUZZER			; 置鸣响标记
BESPEAK_CTRL_5
	MOV	TIME_BUZZER_4MS,#0		; 蜂鸣器鸣响计时单元清零
	MOV	A,KEYTIMES_BESPEAK
	INCW	A
	MOV	KEYTIMES_BESPEAK,A
	CMP	KEYTIMES_BESPEAK,#24
	BLO	BESPEAK_CTRL_1
	MOV	KEYTIMES_BESPEAK,#0		; 第 24 次返回
BESPEAK_CTRL_1
	MOVW	A,#0
	MOV	A,KEYTIMES_BESPEAK
	MOVW	A,#TAB_BESPEAK
	CLRC
	ADDCW	A
	MOVW	EP,A
	MOV	A,@EP				; 取值
	MOV	WASHTIME_BESPEAK,A
	CALL	GET_DISPDATA			; 取显示表值
	RET

; ◆◆◆ "过程"按键表 ◆◆◆
TAB_PROC
	.DATA.B	0E1H,02DH,069H,0C3H,087H,0F0H
; 上表的说明:	数据的高四位由高到低分别对应脱、漂、洗、浸各过程是否有效(1为有效)
;		低四位由高到低分别对应脱、漂、洗、浸各指示灯是否有效(0为有效)
; 		6个数据分别对应按【过程】键的次数

; ◆◆◆ "程序"按键表 ◆◆◆
TAB_PROG
	.DATA.B	0EH,0DH,0BH,07H
; 上表的说明:	数据的低四位由高到低分别对应快速、轻柔、加强、标准指示灯是否有效(0为有效)
; 		4个数据分别对应按【程序】键的次数

; ◆◆◆ "水位"按键表 ◆◆◆
TAB_WATLVL
	.DATA.B	0BH,4DH,09EH,0E7H
; 上表的说明:	数据的低四位由高到低分别对应少量、低位、中位、高位指示灯是否有效(0为有效)
;		BIT 8,7 --	00: 少量水位	选定的水位标记值
;				01: 低位
;				10: 中位
;				11: 高位
;		BIT 6,5 --	00: 低水位
;				01: 中水位
;				10: 高水位
; 		4个数据分别对应按【水位】键的次数

; ◆◆◆ "预约"按键表 ◆◆◆
TAB_BESPEAK
	.DATA.B	00H,02H,03H,04H,05H,06H,07H,08H,09H,10H,11H,12H
	.DATA.B 13H,14H,15H,16H,17H,18H,19H,20H,21H,22H,23H,24H
; 上表的说明:	对应预约时间, BCD码, 单位:小时

; ■■■■■■■■■■■■■■■■■■■■■■■■■
; ■■						■■
; ■■	子程序: 移位送 8 位数据			■■
; ■■	使用:	A,R3(暂存移位次数)		■■
; ■■						■■
; ■■■■■■■■■■■■■■■■■■■■■■■■■
SEND_DATA
	MOV	R3,#0
DISP_3
	CLRB	LED_CLK				; 时钟脉冲
	BBS	DISP_DATA:7,DISP_1
	CLRB	LED_DATA			; 数据
	JMP	DISP_2
DISP_1
	SETB	LED_DATA
DISP_2
	SETB	LED_CLK
	NOP
	NOP
	NOP
	NOP
	MOV	A,DISP_DATA
	ROLC	A				; 左移 1 位
	MOV	DISP_DATA,A
	INC	R3
	CMP	R3,#8				; 送 8 bit
	BLO	DISP_3
	CLRB	LED_CLK
	RET

; ■■■■■■■■■■■■■■■■■■■■■■■■■
; ■■						■■
; ■■	子程序: 判断【电源】键			■■
; ■■						■■
; ■■■■■■■■■■■■■■■■■■■■■■■■■
POWER_CTRL
	BBS	INPUT_KEYPOWER,KEY_TEST_POWER
	CLRB	KEY_POWER_L			; 【电源】键没有按下
	CLRB	KEY_POWER_ING
_POWER_END
	RET
KEY_TEST_POWER					; 检测到【电源】键按下
	BBS	KEY_POWER_ING,_POWER_END
	BBS	KEY_POWER_L,_POWER_1
	SETB	KEY_POWER_L
	RET
_POWER_1
	SETB	KEY_POWER_ING			; 【电源】键正在按下,抬起前不再响应
	SETB	KEY_BUZZER			; 置鸣响标记
	MOV	TIME_BUZZER_4MS,#0		; 蜂鸣器鸣响计时单元清零
	BBS	KEY_POWER,POWER_CTRL_1
	SETB	KEY_POWER			; 置"上电"
	SETB	CTRLPOWER			; 控制输出
	RET
POWER_CTRL_1
	CLRB	KEY_POWER			; 置"断电"
	CLRB	CTRLPOWER			; 控制输出
	RET

; ■■■■■■■■■■■■■■■■■■■■■■■■■
; ■■						■■
; ■■	子程序: 取选定组合过程对应的洗衣时间	■■
; ■■	使用:	A,R7,R6				■■
; ■■						■■
; ■■■■■■■■■■■■■■■■■■■■■■■■■
GET_WASHTIME
	MOV	A,FLAG_PROC
	AND	A,#00001111B			; 取选定的洗衣过程
	MOV	R7,A
	BBC	LED_REGULAR,GET_REGULAR		; 根据指示灯状态判断
	BBC	LED_ENHANCE,GET_ENHANCE
	BBC	LED_GENTLE,GET_GENTLE
	BBC	LED_SPEEDY,GET_SPEEDY
	RET
GET_REGULAR					; "标准"程序
	MOV	A,DW_WATLVL			; 水位情况
	CLRC
	ADDC	A,R7
	MOV	R7,A
	MOVW	A,#0
	MOV	A,R7
	MOVW	A,#TAB_WASHTIME_REGULAR
	JMP	GET_TIME
GET_ENHANCE					; "加强"程序
	MOV	A,DW_WATLVL			; 水位情况
	CLRC
	ADDC	A,R7
	MOV	R7,A
	MOVW	A,#0
	MOV	A,R7
	MOVW	A,#TAB_WASHTIME_ENHANCE
	JMP	GET_TIME
GET_GENTLE					; "轻柔"程序
	MOVW	A,#0
	MOV	A,R7
	MOVW	A,#TAB_WASHTIME_GENTLE
	JMP	GET_TIME
GET_SPEEDY					; "快速"程序
	MOVW	A,#0
	MOV	A,R7
	MOVW	A,#TAB_WASHTIME_SPEEDY
GET_TIME
	CLRC
	ADDCW	A
	MOVW	EP,A
	MOV	A,@EP
	MOV	WASHTIME_PROC,A			; 取洗衣时间
	CMP	WASHTIME_BESPEAK,#0
	BNE	GET_TIME_END
	CALL	GET_DISPDATA			; 取显示表值
GET_TIME_END
	RET

; ◆◆◆ 各种程序所对应的不同过程的时间表 ◆◆◆
; "标准"程序
TAB_WASHTIME_REGULAR
; 低水位
	.DATA.B	00H,00H,13H,00H,00H,00H,31H,00H,09H,00H,00H,00H,27H,00H,39H,54H
; 中水位
	.DATA.B	00H,00H,15H,00H,00H,00H,33H,00H,09H,00H,00H,00H,27H,00H,41H,66H
; 高水位
	.DATA.B	00H,00H,18H,00H,00H,00H,36H,00H,09H,00H,00H,00H,27H,00H,44H,79H
; "大物"程序
TAB_WASHTIME_ENHANCE
; 低水位
	.DATA.B	00H,00H,13H,00H,00H,00H,31H,00H,09H,00H,00H,00H,27H,00H,39H,64H
; 中水位
	.DATA.B	00H,00H,15H,00H,00H,00H,33H,00H,09H,00H,00H,00H,27H,00H,41H,76H
; 高水位
	.DATA.B	00H,00H,18H,00H,00H,00H,36H,00H,09H,00H,00H,00H,27H,00H,44H,89H
; "快速"程序
TAB_WASHTIME_SPEEDY
	.DATA.B	00H,00H,09H,00H,00H,00H,17H,00H,06H,00H,00H,00H,14H,00H,22H,00H
; "轻柔"程序
TAB_WASHTIME_GENTLE
	.DATA.B	00H,00H,05H,00H,00H,00H,20H,00H,04H,00H,00H,00H,19H,00H,24H,00H
;                       ↑              ↑      ↑              ↑      ↑   ↑
;                      单洗            洗漂    单脱            漂脱  洗漂脱 浸洗漂脱
;
; 上表的说明:	第 3 字节数据 -- 单洗	FLAG_PROC = xxxx0010
;		第 7 字节数据 -- 洗漂			0110
;		第 9 字节数据 -- 单脱			1000
;		第 13 字节数据 -- 漂脱			1100
;		第 15 字节数据 -- 洗漂脱		1110
;		第 16 字节数据 -- 浸洗漂脱		1111
;		时间单位: 分钟 , 均为 BCD 码

; ■■■■■■■■■■■■■■■■■■■■■■■■■
; ■■						■■
; ■■	子程序: 取数码管显示数据		■■
; ■■	使用:	A,R0,R6,EP			■■
; ■■						■■
; ■■■■■■■■■■■■■■■■■■■■■■■■■
GET_DISPDATA
	MOV	R0,A
	AND	A,#0FH				; 数码管低位
	MOV	R6,A
	MOVW	A,#0
	MOV	A,R6
	MOVW	A,#TAB_DISPDATA
	CLRC
	ADDCW	A
	MOVW	EP,A
	MOV	A,@EP
	MOV	LED_5ST,A			; 显示值
;
	MOV	A,R0
	RORC	A
	RORC	A
	RORC	A
	RORC	A
	AND	A,#0FH				; 数码管高位
	MOV	R0,A
	CMP	A,#0
	BNE	_H_1
	MOV	LED_4ST,#0FFH			; 数码管高位暗
	RET
_H_1
	MOVW	A,#0
	MOV	A,R0
	MOVW	A,#TAB_DISPDATA
	CLRC
	ADDCW	A
	MOVW	EP,A
	MOV	A,@EP
	MOV	LED_4ST,A			; 显示值
	RET
	
; ▲▲▲ 数码管显示数据表 ▲▲▲
TAB_DISPDATA
	.DATA.B	0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H
;		 0     1   2    3    4    5    6    7
	.DATA.B	080H,090H,088H,083H,0C6H,0A1H,086H,08EH
;		 8    9    A    b    C    d    E    F

; ■■■■■■■■■■■■■■■■■■■■■■■■■
; ■■						■■
; ■■	子程序: 控制输出			■■
; ■■						■■
; ■■■■■■■■■■■■■■■■■■■■■■■■■
CONTROL_OUTPUT
	BBS	F_INWATER,CTRL_1
	CLRB	INWATER				; 关闭进水阀
	JMP	CTRL_2
CTRL_1
	SETB	INWATER				; 打开进水阀
CTRL_2
	BBS	F_OUTWATER,CTRL_3
	CLRB	OUTWATER			; 关闭排水牵引器
	JMP	CTRL_4
CTRL_3
	SETB	OUTWATER			; 打开排水牵引器
CTRL_4
	BBS	F_ELECMOTOR_Z,CTRL_5
	CLRB	ELECMOTOR_Z			; 电机停正转
	JMP	CTRL_6
CTRL_5
	SETB	ELECMOTOR_Z			; 电机正转
CTRL_6
	BBS	F_ELECMOTOR_F,CTRL_7
	CLRB	ELECMOTOR_F			; 电机停反转
	RET
CTRL_7
	SETB	ELECMOTOR_F			; 电机反转
	RET

; ■■■■■■■■■■■■■■■■■■■■■■■■■
; ■■						■■
; ■■	子程序: 各种水流搅拌			■■
; ■■	使用:	A,EP				■■
; ■■						■■
; ■■■■■■■■■■■■■■■■■■■■■■■■■
CTRL_WASHING
; 判断选择哪一种洗衣程序
	BBC	LED_REGULAR,W_REGULAR		; 标准
	BBC	LED_ENHANCE,W_ENHANCE		; 加强
	BBC	LED_GENTLE,W_GENTLE		; 轻柔
	BBC	LED_SPEEDY,W_SPEEDY		; 快速
	RET
W_REGULAR					; "标准" 程序
	MOV	PROG_STEPS,#4			; 4 步一个周期
	MOV	A,DW_WATLVL			; 判断水位
	CMP	A,#20H
	BEQ	W_REGULAR_HIGH
	CMP	A,#10H
	BEQ	W_REGULAR_MIDDLE
	CMP	A,#0
	BEQ	W_REGULAR_LOW
	RET
W_REGULAR_HIGH
	MOVW	A,#0
	MOV	A,ELECTRO_STEPS
	MOVW	A,#TIMETAB_REGULAR_HIGH		; 高水位: 水流 B
	JMP	TURN_WASHING
W_REGULAR_MIDDLE
	MOVW	A,#0
	MOV	A,ELECTRO_STEPS
	MOVW	A,#TIMETAB_REGULAR_MIDDLE	; 中水位: 水流 C
	JMP	TURN_WASHING
W_REGULAR_LOW
	MOVW	A,#0
	MOV	A,ELECTRO_STEPS
	MOVW	A,#TIMETAB_REGULAR_LOW		; 低水位: 水流 D
	JMP	TURN_WASHING
W_ENHANCE					; "加强" 程序
	MOV	PROG_STEPS,#4			; 4 步一个周期
	MOV	A,DW_WATLVL			; 判断水位
	CMP	A,#20H
	BEQ	W_ENHANCE_HIGH
	CMP	A,#10H
	BEQ	W_ENHANCE_MIDDLE
	CMP	A,#0
	BEQ	W_ENHANCE_LOW
	RET
W_ENHANCE_HIGH
	MOVW	A,#0
	MOV	A,ELECTRO_STEPS
	MOVW	A,#TIMETAB_ENHANCE_HIGH		; 高水位: 水流 B
	JMP	TURN_WASHING
W_ENHANCE_MIDDLE
	MOVW	A,#0
	MOV	A,ELECTRO_STEPS
	MOVW	A,#TIMETAB_ENHANCE_MIDDLE	; 中水位: 水流 C
	JMP	TURN_WASHING
W_ENHANCE_LOW
	MOVW	A,#0

⌨️ 快捷键说明

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