📄 xqb5030a.asm
字号:
;
; 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 + -