2021-06-23

;=========================================================
; 文件名:
; 功能描述: 全自动滚筒洗衣机
;=========================================================

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

猜你喜欢

转载自blog.csdn.net/L_Z_jay/article/details/118147935