开始 初始化8259芯片调用DIS显示子程序调用GetKey子程序扫描键值中断NY调用中断子程序进行时间计数
2、LED显示子程序流程图(他人完成)
断码表指针送入寄存器BX,显示缓冲区LedBuf指向第一位数码管显示缓冲区字符转换成数码管值输出段码输出段码关显示N6位显示完全?Y返回
3、 按键处理子程序流程图(独立负责)
调用GetKeyC键?ND键?N返回Y清空数据缓冲区Y清空数据缓冲区E键?输入闹钟时间NY执行输入时钟时间
4、中断子程序-时间计数子程序流程图(合作完成)
秒值加1中断入口到60?N Y 保护现场秒值加1恢复现场N到60?Y关显示秒值加1Y N 中断返回到24?Y 小时清零
四、结果讨论: 1、实验结果:
程序运行,数码管开始从000000走表,按C键后显示‘——————’开始对时钟进行初始值设置,设置完成后按D键后,LED显示‘——————’进入闹钟设置状态,在设置完闹钟后按E键开始运行,LED管显示为设置好的时间并接收8253的中断,实现不断走表。当显示时间达到闹钟时间时,LED管显示‘888888’,在闪烁10S结束闹钟状态,再次显示时间,并开始走表。
2、问题解决: 自己遇到的问题:
在测试C、D、E三个功能键时常常出现误输入的情况,为便于查看用户输入的值,在用户按下相应的功能键时,将LED显示为此时显示‘——————’,用户依次输入6个数字,相应地,在LED上由左向右依次显示用户输入的数字,方便查看用户是否输入了自己想测试的时间。
组员遇到的问题:
调试程序时发现时钟初始值可以设置,但是初始值设置完后时钟并没有走表,于是将8253的输出端的线接入至手动的单脉冲的发生器,进行手动给8259刺激,结果时钟开始随手按动开始走表,可以断定该8253芯片可能已经损坏,换了个试验箱后遇到了同样的情况,直至换了功能正常的实验箱后实验现象才正确展现。
附录:实验代码:(完整的源程序)
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE ; org 5000h
Port0 EQU 0FFE0H Port1 EQU 0FFE1H port00 equ 0FFF0H port33 equ 0FFF3H
OUTSEG equ 0ffdch ;段控制口
OUTBIT equ 0ffddh ;位控制口/键扫口 IN_KEY equ 0ffdeh ;键盘读入口 org 3400h
LedBuf db 6 dup(?) ;显示缓冲 CBuf db 6 dup(0fh)
buf db 6 dup(?) ;临时存放时刻
buttonC DB 02H ;若C键被按则置1 buttonD DB 03H ;若D键被按则置1
buttonE DB 00H ;若E键被按则置1
flag DB 00h ;时间从BUF取出到LEDBUF标志 cflag DB 00h Start:
;mov cflag,00
mov LedBuf+0,00h ;开启时显示\mov LedBuf+1,00h mov LedBuf+2,00h mov LedBuf+3,00h mov LedBuf+4,00h mov LedBuf+5,00h mov si,0
;;;;;;;;;;;;;;;;;;;;;;;;初始化;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; push ax push dx
MOV DX,port33 MOV AL,36H OUT DX,AL MOV DX,port00 MOV AL,00H OUT DX,AL MOV AL,4BH OUT DX,AL pop dx pop ax CLI
MOV AX,OFFSET INT8259 MOV BX,003CH MOV [BX],AX MOV BX,003EH MOV AX,0000H MOV [BX],AX CALL FOR8259 STI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; con8:
CALL DIS
call GetKey ;扫描键盘并读取键值 cmp al,20h ;检测是否按下按键 jz con8
and al,0fh ;显示键码 cmp al,0dh ;d:设置闹钟 jz setD