;=========================================================
; 文件名:
; 功能描述: 全自动滚筒洗衣机
;=========================================================
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:DATA
START:
;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