;=========================================================
; 文件名:
; 功能描述: 全自动滚筒洗衣机
;=========================================================SSTACK SEGMENT STACK
DW 256 DUP(?)
SSTACK ENDS
DATA SEGMENT
led db 6FH,7FH,07H,7DH,6DH,66H,4FH,5BH,06H,3FH
ioporta equ 600h
ioportb equ 602h
ioportc equ 604h
TABDT DB 01H,03H,02H,06H,04H,0CH,08H,09H
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATASTART:
;Begin=======
MOV AX, DATA MOV DS, AX mov dx,606h mov al,88H;方式0,A输出,B输出,C低四位输出 out dx,al
BEGIN:
CALL TUBE_STOP
MOV DX, 0604H
IN AL, DX ;读C口输入
MOV BL, AL
MOV CL, 4 SHR BL, CL ;获取低四位 CMP BL, 0 JZ BEGIN CMP BL, 1 ;若开关1打开,甩干模式 JZ FASTEST CMP BL, 02H JZ FAST CMP BL, 04H JZ SLOW
FASTEST:
CMP DI,10 ;甩干模式出来停止
JZ BEGIN
call meantime
;MOV DI, 1000H ;约定使用DI来传递参数(延时长短)
;CALL SPEED ;甩干模式,急速快
FAST:
MOV DI, 4000H ;约定使用DI来传递参数(延时长短)
CALL SPEED ;开关1被打开,速度1标准
SLOW:
MOV DI, 0FFFFH ;约定使用DI来传递参数(延时长短)
CALL SPEED ;开关2被打开,速度2轻柔
;读取开关子程序
READ PROC
PUSH DX
PUSH AX
PUSH BX
PUSH CX
MOV DX, 0604H IN AL, DX ;读C口输入 MOV BL, AL MOV CL, 4 SHR BL, CL ;获取低四位 CMP BL, 0 JZ BEGIN
CMP BL, 1 ;若开关1打开,甩干模式
; JZ Q1
; CMP BL, 02H ;若开关2打开,标准模式
; JZ FAST
; CMP BL, 04H ;若开关3打开,轻柔模式
; JZ SLOW
POP CX
POP BX
POP AX
POP DX
RET
READ ENDP
;动态数码管停止;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TUBE_STOP PROC PUSH AX PUSH BX PUSH DX mov dx,606h mov al,88H;方式0,A输出,B输出,C低四位输出 out dx,al ;初始化8255 mov bx,offset led mov al,11111001b ;选择全部 mov dx,ioportc out dx,al ;出C口 选择个位 mov al,[bx+9] ; mov dx,ioporta out dx,al ;从a口输出 POP DX POP BX POP AX RET TUBE_STOP ENDP
;同步
meantime proc
mov dx,606h mov al,10001000b;方式0,A输出,B输出,C输出 out dx,al ;初始化8255 mov bx,offset led mov si,0;个位 mov di,8;十位 mov cx,6
digit1: ;动态刷新一次数码管数字
CALL GEW ;从a口输出 call delay;1000 CALL TEN CALL shuaigan call read ;读开关 loop digit1 digit3: mov cx,6 inc si cmp si,9 jbe digit1
CMP DI,9 ;只为判断最后一次00情况 Ja DIGIT4 inc di ;满十进一 mov si,0;清零个位
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
digit2: ;个位刷成0,十位刷成 原来-1
CALL GEW call delay;1000 CALL TEN CALL shuaigan call read ;读开关 loop digit2 mov cx,6 CMP DI,9 JBe DIGIT3
DIGIT4: ;输出为0结束程序
call tube_stop
jmp begin
meantime endp
;个位*
GEW PROC
PUSH AX
PUSH BX
PUSH DX
PUSH SI
mov bx,offset led
mov al,11111011b ;选择个位
mov dx,ioportC
out dx,al ;出C口 选择个位
mov al,[bx+SI] ; NOT AL mov dx,ioporta out dx,al ;从a口输出 POP SI POP DX POP BX POP AX RET
GEW ENDP
;十位*
TEN PROC
PUSH AX
PUSH BX
PUSH DX
PUSH DI
mov bx,offset led mov al,11111101B ;选择十位 mov dx,ioportC out dx,al ;出c口 选择十位 mov al,[bx+di]; NOT AL mov dx,ioporta out dx,al ;从a口输出 POP DI POP DX POP BX POP AX RET
TEN ENDP
;延时子程序***
delay proc
push cx
mov cx,1000h
del:
;nop
nop
loop del
pop cx
ret
delay endp
;甩干子程序**
shuaigan proc
push ax
push bx
push cx
push dx
MOV BX, OFFSET TABDT
MOV CX, 0008H
Q2:
call gew MOV AL,[BX] MOV DX, 0602H ; 写B口 OUT DX, AL INC BX call delay ; 控制步进电机的+转速1000 CALL TEN call delay LOOP Q2 pop dx pop cx pop bx pop ax ret
shuaigan endp
;延时子程序*
DALLY PROC
; PUSH DI
PUSH CX
MOV CX, DI
A3: PUSH AX
POP AX
LOOP A3
POP CX
; POP DI
RET
DALLY ENDP
;电机驱动子程序*******
SPEED PROC
MAIN: MOV AL, 88H ; 控制B口工作于方式0,输出
MOV DX, 0606H
OUT DX, AL
MOV SI, 0 ;SI用于计算反转时间
;正转**
A1:
MOV BX, OFFSET TABDT MOV CX, 0008H
A2: MOV AL,[BX]
MOV DX, 0602H ; 写B口
OUT DX, AL
CALL DALLY ; 控制步进电机的+转速 INC BX LOOP A2 CALL READ INC SI ;SI用于计算反转时间 CMP SI, 8H ;8次后反转 JB A1 PUSH DI MOV DI, 0FFFFH CALL DALLY ;正反转切换,需停止休息 POP DI PUSH DI MOV DI, 0FFFFH CALL DALLY ;正反转切换,需停止休息 POP DI PUSH DI MOV DI, 0FFFFH CALL DALLY ;正反转切换,需停止休息 POP DI JMP A5
A8: JMP A1
; CALL DALLY ;正反转切换,需停止休息(模仿现实中洗衣机)
; CALL DALLY ;正反转切换,需停止休息
;反转
A5:
MOV BX, OFFSET TABDT+7
MOV CX, 0008H
A4:
MOV AL,[BX]
MOV DX, 0602H ; 写B口
OUT DX, AL
CALL DALLY ; 控制步进电机的+转速
DEC BX
LOOP A4
CALL READ DEC SI ;SI用于计算反转时间 CMP SI, 0 ;0后正转 JA A5 PUSH DI MOV DI,0FFFFH CALL DALLY ;正反转切换,需停止休息 POP DI PUSH DI MOV DI,0FFFFH CALL DALLY ;正反转切换,需停止休息 POP DI PUSH DI MOV DI,0FFFFH CALL DALLY ;正反转切换,需停止休息 POP DI ; CALL DALLY ;正反转切换,需停止休息 ; CALL DALLY ;正反转切换,需停止休息 JZ A8 RET
SPEED ENDP
CODE ENDS
END START