西南科技大学微机原理课程设计电风扇

DATA SEGMENT
WORD1 DB '**************PLEASE TYPE IN SPEED*************$'
WORD2 DB 'A SPEED1, B SPEED2, C SPEED3, D STOP, E SETTIME$'
WORD3 DB '***********************************************$'
WORD4 DB 'SPEED1$'
WORD5 DB 'SPEED2$'
WORD6 DB 'SPEED3$'
WORD7 DB 'STOP$'
WORD8 DB 'PLEASE TYPE IN TIME$'
BUF1 DB ?
BUF2 DB ?
TIME DB 0
DATA ENDS
STACK SEGMENT
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START: MOV AX,DATA
MOV DS,AX
M: LEA DX,WORD1
MOV AH,09H
INT 21H ;输出WORD1中的内容
CALL HH ;使用换行子程序
LEA DX,WORD2
MOV AH,09H
INT 21H
CALL HH
LEA DX,WORD3
MOV AH,09H
INT 21H
CALL HH
SEARCH: MOV AH,01H
INT 16H ;读键盘状态
JZ SEARCH
CMP AL,'A'
JZ SPEED1
CMP AL,'B'
JZ SPEED2
CMP AL,'C'
JZ SPEED3
CMP AL,'D'
JZ STOP
CMP AL,'E'
JZ SETTIME
MOV AH,10H
INT 16H ;优先级D>A>B>C
JMP SEARCH
SETTIME:LEA DX,WORD8
MOV AH,09H
INT 21H
CALL HH
MOV AH,01H
INT 16H
JZ SEARCH
CALL TIMES
JMP SEARCH
STOP: LEA DX,WORD7
MOV AH,09H
INT 21H ;输出信息
CALL HH
MOV AH,10H
INT 16H
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV DL,'/'
MOV AH,02H
INT 21H
CALL FW ;保证每次都是在同一位置输出,需要将光标位置复位
CMP TIME,00H ;查询定时器是否启动
JZ WENT
MOV AL,00H
MOV TIME,AL ;将定时器复位
WENT: POP DX
POP CX
POP BX
POP AX
JMP SEARCH
SPEED1: LEA DX,WORD4
MOV AH,09H
INT 21H
CALL HH
MOV AH,10H
INT 16H
CALL RUN1 ;调用一档
JMP SEARCH
SPEED2: LEA DX,WORD5
MOV AH,09H
INT 21H
CALL HH
MOV AH,10H
INT 16H
CALL RUN2
JMP SEARCH
SPEED3: LEA DX,WORD6
MOV AH,09H
INT 21H
CALL HH
MOV AH,10H
INT 16H
CALL RUN3
JMP SEARCH
MOV AH,4CH
INT 21H
RUN1 PROC ;一档子程序
PUSH AX
PUSH BX
PUSH CX
PUSH DX
BEGIN1: MOV AH,01H
INT 16H
JNZ TYPED1 ;查询键盘是否有输入
TURNING1:CMP TIME,00H ;查询定时器是否启动
JZ GO1 ;没启动直接运行
MOV AH,2CH
INT 21H
MOV AL,BUF1
CMP AL,CL
JNZ GO1
CMP BUF2,DH
JZ STOP ;若启动查询停止时间与当前时间对比是否相等,相等就停止
GO1: MOV DL,'/'
MOV AH,02H
INT 21H
CALL FW
CALL DELAY ;延时
MOV DL,'-'
MOV AH,02H
INT 21H
CALL FW
CALL DELAY ;延时
MOV DL,'\'
MOV AH,02H
INT 21H
CALL FW
CALL DELAY ;延时
MOV DL,'|'
MOV AH,02H
INT 21H
CALL FW
CALL DELAY ;延时
JMP BEGIN1
TYPED1: CMP AL,'A'
JZ SPEED1
CMP AL,'B'
JZ SPEED2
CMP AL,'C'
JZ SPEED3
CMP AL,'D'
JZ STOP
CMP AL,'E'
JZ SETTIME
JMP TURNING1
POP DX
POP CX
POP BX
POP AX
RET
RUN1 ENDP
RUN2 PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
BEGIN2: MOV AH,01H
INT 16H
JNZ TYPED2
TURNING2:CMP TIME,00H
JZ GO2
MOV AH,2CH
INT 21H
CMP BUF1,CL
JNZ GO2

CMP BUF2,DH
JZ STOP
GO2: MOV DL,'/'
MOV AH,02H
INT 21H
CALL FW
CALL DELAY1
MOV DL,'-'
MOV AH,02H
INT 21H
CALL FW
CALL DELAY1
MOV DL,'\'
MOV AH,02H
INT 21H
CALL FW
CALL DELAY1
MOV DL,'|'
MOV AH,02H
INT 21H
CALL FW
CALL DELAY1
JMP BEGIN2
TYPED2: CMP AL,'A'
JZ SPEED1
CMP AL,'B'
JZ SPEED2
CMP AL,'C'
JZ SPEED3
CMP AL,'D'
JZ STOP
CMP AL,'E'
JZ SETTIME
JMP TURNING2
POP DX
POP CX
POP BX
POP AX
RET
RUN2 ENDP
RUN3 PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
BEGIN3: MOV AH,01H
INT 16H
JNZ TYPED3
TURNING3:CMP TIME,00H
JZ GO3
MOV AH,2CH
INT 21H
CMP BUF1,CL
JNZ GO3
CMP BUF2,DH
JZ STOP
GO3: MOV DL,'/'
MOV AH,02H
INT 21H
CALL FW
CALL DELAY2
MOV DL,'-'
MOV AH,02H
INT 21H
CALL FW
CALL DELAY2
MOV DL,'\'
MOV AH,02H
INT 21H
CALL FW
CALL DELAY2
MOV DL,'|'
MOV AH,02H
INT 21H
CALL FW
CALL DELAY2
JMP BEGIN3
TYPED3: CMP AL,'A'
JZ SPEED1
CMP AL,'B'
JZ SPEED2
CMP AL,'C'
JZ SPEED3
CMP AL,'D'
JZ STOP
CMP AL,'E'
JZ SETTIME
JMP TURNING3
POP DX
POP CX
POP BX
POP AX
RUN3 ENDP
DELAY PROC ;延时子程序
PUSH CX
PUSH DX
MOV DX,10000 ;外循环次数
A1: MOV CX,6000 ;内循环次数
A2: LOOP A2
DEC DX
JNZ A1
POP DX
POP CX
RET
DELAY ENDP
DELAY1 PROC
PUSH CX
PUSH DX
MOV DX,30000
B1: MOV CX,6000
B2: LOOP B2
DEC DX
JNZ B1
POP DX
POP CX
RET
DELAY1 ENDP
DELAY2 PROC
PUSH CX
PUSH DX
MOV DX,60000
C1: MOV CX,6000
C2: LOOP C2
DEC DX
JNZ C1
POP DX
POP CX
RET
DELAY2 ENDP
HH PROC ;换行子程序
MOV AH,03H
INT 10H ;取光标位置
INC DH ;行加1
MOV DL,0 ;列置零
MOV AH,02H
INT 10H
RET
HH ENDP
FW PROC ;复位子程序
MOV AH,03H
INT 10H ;取光标位置
MOV DL,0 ;行不变,列置零
MOV AH,02H
INT 10H
RET
FW ENDP
TIMES PROC ;定时子程序
MOV AH,10H
INT 16H
MOV AH,01H
INT 21H ;从键盘得到一个数字到AL
CALL HH
SUB AL,30H ;数字的ASCII码减30即为自身的值
MOV BUF1,AL
MOV AH,2CH
INT 21H ;取当前时间
ADD BUF1,CL ;保存分信息到BUF1
MOV BUF2,DH ;保存秒信息到BUF2
MOV AH,TIME
MOV AH,01H
MOV TIME,AH ;启动定时器
JMP M ;转到功能选择界面
RET
TIMES ENDP
CODE ENDS
END START







相关文档
最新文档