MOV NUM,AX;转换为计数初值
MOV AL,00110110B;8254方式3BCD码 MOV DX,30CH OUT DX,AL MOV DX,300H MOV AX,NUM OUT DX,AL MOV AL,AH OUT DX,AL STI
JMP AG1
;通过行扫描法,将键值存储到al中
INPUT PROC
PUSH DX PUSH BX PUSH SI PUSH DI
WT: MOV AL,00H ;00H为不显示任何信息时对应的七段代码 MOV DX,PORT1 OUT DX,AL MOV AL,00000000B MOV DX,PORT2 OUT DX,AL ;使数码管全灭,并使3根列线输出全0 NOP
NOP
MOV DX,PORT2
IN AL,DX ;(粗扫描)若无键按下转至WT执行,否则顺序执行 AND AL,0FH
CMP AL,0FH JZ WT
CALL DELAY MOV DX,PORT2 ;再次确认是否有键按下 IN AL,DX AND AL,0FH
CMP AL,0FH JZ WT MOV CX,3 ;(细扫描)开始对每一列进行逐列扫描 MOV BL,0FEH
NEXT: MOV AL,BL;在横线上添加一条语句
11
MOV DX,PORT2 OUT DX,AL NOP NOP
IN AL,DX
AND AL,0FH CMP AL,0FH JNZ KEY
ROL BL,1 ;在横线上添加一条语句 LOOP NEXT
JMP WT ;按键过早释放,可能导致无法识别 KEY: SHL BL,4 ;8088/8086指令集中该指令格式错误!
OR AL,BL ;字节键码信息存入AL,高4位为列信息低4位为行信息
LEA SI,KEYCOD LEA DI,KEYVAL MOV CX,12 NEXT1: CMP AL,[SI]
JZ FIND INC SI INC DI LOOP NEXT1
JMP WT ;本程序不支持多个按键同时按下 FIND: MOV AL,[DI] ;AL中内容为所按键的键面值
PUSH AX MOV AL,00000000B MOV DX,PORT2 OUT DX,AL ;使数码管全灭,并使3根列线输出全0 NOP
NOP
NEXT2: MOV DX,PORT2
IN AL,DX ;(粗扫描)若无键按下转至WT执行,否则顺序执行 AND AL,0FH CMP AL,0FH JNZ NEXT2 POP AX CALL DELAY
POP DI POP SI POP BX POP DX RET INPUT ENDP
12
;中断服务程序
RUN PROC FAR PUSH AX PUSH DX CMP FLAG,0 JZ ZHZ ROL RNUM,1 MOV AL,RNUM MOV DX,203H OUT DX,AL SUB STEP,1 JMP END1 ZHZ: ROR RNUM,1 MOV AL,RNUM MOV DX,203H OUT DX,AL ADD STEP,1 END1:
MOV CL,STEP CMP STEP,0 JGE W1 NEG CL MOV AL,05H MOV DX,20AH OUT DX,AL JMP W2 W1: MOV AL,0AH MOV DX,20AH OUT DX,AL W2: CMP CL,99 JB END2 MOV STEP,0 END2: MOV AL,CL MOV AH,00H DIV TEN XLAT
MOV DX,202H OUT DX,AL XCHG AH,AL XLAT
MOV DX,206H OUT DX,AL
13
MOV AL,20H MOV DX,3A0H OUT DX,AL POP DX POP AX IRET RUN ENDP
DELAY PROC
MOV CX,2000 LOOP $ RET
DELAY ENDP CODE ENDS END BEG
四、 运行调试
在按要求连接完线后,运行程序。
键盘上最上面一排三个键为控制键,依次代表启动停止键,正转,反转。从第二行开始横着依次代表数字0—8。在测试的时候,按下起止键在开始和停止两个状态切换;按下正转或反转后跟上三个数字键,该数字即为你需要运行的速度。正常运行前两块数码管显示速度信息,第三块显示步数信息,电机正常转动。
五、 总结
这次课程设计完成的是一个步进电机的旋转实验,主要涉及了数码管显示,按键识别,步进电机控制等几个部分,是对我们平时实验的一个综合。在实验过程中我采用了分解的方法将实验分为了几个部分,逐一实现。按键部分主要是在按键识别与现实的基础上进行改写,通过行扫描法来实现的。通过对程序的改写我也温习了一下以前学习的知识,熟悉了扫描方法的编程。在改写的过程到应用的过程中我也遇到了一些麻烦,最后在老师的指导下我顺利的解决了相关问题,通过这一点我也明白了解决问题时我们需要全面考虑,任何一个小的方面都可能影响到我们程序的运行。在编写其他功能时,前面的实验对我也有很大的启发,我想这也在说明平时的实验认真完成的重要性。应该来说,通过这次试验我学到了很多,收获颇丰,在实验结束时,看着自己的作品还是相当高兴的。但是,在实验过程中我也发现了自己的一些不足,例如对实验的调试过程还不是太熟悉,因此,对于解决一些问题也带来了很大的障碍,这是我今后学习中应该注意的地方。
14