【Proteus/8086】swjtu西南交大微机与接口技术实验:计时器
2023-12-21 22:35:52
实验内容:
计时器基本功能:
1)CPU必须用8086
2)计时器最小计时单位为秒。
3)以00:00格式显示计时,前2位表示分钟,后2位表示秒。
4)计时器是正计时方式
5)有暂停、继续计时功能
6)有复位计时功能
7)每次按下暂停键,能显示计时间隔时间
参考书籍:
微机原理与接口技术——基于8086和Proteus仿真(第3版)(作者:顾晖等),p273,13.1电子秒表。若有补充内容,放在评论区。
具体实现的功能描述:
1)CPU 使用 8086
2)计时器最小计时单位为秒。
3)按下 START 键,以正计时方式开始计时。以 00:00 格式在数 码管 L1 上显示计时,前 2 位表示分钟,后 2 位表示秒。
4) 数码管 L1 显示正常计时时间,数码管 L2 显示两次按下暂停 的时间间隔。在正常计时情况下,按下 PAUSE/RESUME 键,计时 器暂停计时,数码管 L1 显示暂停时刻,数码管 L2 显示从暂停 时刻从 0 开始计时的时间,直到再次按下暂停,计时器从暂停 时刻开始继续计时, L1 显示对应的计时时间,数码管 L2 开始 显示从继续计时时刻从 0 开始计时的时间,直到再次按下暂 停,回到前述的暂停情况。
5) 按下 RESET 键,计时器复位,数码管 L1 显示 0000,然后按 下 START 键,可以重新从 0000 开始计时。
电路图:
?电路图的绘制和项目创建可以参看专栏的其他文章。如:【Proteus】绘制简单的电路图-CSDN博客
1.I/O 地址译码电路:?
2.?8253 计时电路:
注意: 这里clk0设为了1khz,数码管显示比较接近1s
?3.8255A 显示及中断电路:
?
?4.总览和器件列表(图的左边)
汇编代码(部分):
A8255 EQU 0000H ;用于显示正常计时时间8255A各端口地址
B8255 EQU 0002H
C8255 EQU 0004H
CTR8255 EQU 0006H
AA8255 EQU 0300H ;用于显示暂停时间间隔8255A各端口地址
BB8255 EQU 0302H
CC8255 EQU 0304H
CCTR8255 EQU 0306H
CH0 EQU 0200H ;8253计数器0的端口地址
CTR8253 EQU 0206H ;8253 控制端口地址
AD245 EQU 0100H ;74LS245地址
CODE SEGMENT 'CODE'
ASSUME DS:DATA,CS:CODE,SS:SSEG
START:
MOV AX,SSEG
MOV SP,AX
CLI ;关中断
MOV AX,0 ;设中段向量
MOV ES,AX
MOV BX,2*4 ;NMI为2号中断
MOV AX,OFFSET INTR_KEY
MOV WORD PTR ES:[BX],AX
MOV AX,SEG INTR_KEY
MOV WORD PTR ES:[BX+2],AX
STI ;开中断
MOV AX,DATA ;初始化数据段
MOV DS,AX
MOV AX,DATA
MOV ES,AX
MOV AL,10001001B ;8255A初始化
MOV DX,CTR8255
OUT DX,AL
MOV AL,10001001B ;8255A初始化
MOV DX,CCTR8255
OUT DX,AL
RUN:
CALL RUNNING ;循环等待中断
JMP RUN
INTR_KEY PROC ;中断服务程序
PUSH AX ;现场保护
PUSH BX
PUSHF
CALL KEY ;读取按钮状态
TEST AL,01H ;检测启动按钮
JZ K1
TEST AL,02H ;检测暂停按钮
JZ K2
TEST AL,04H ;检测复位按钮
JZ K3
K1:
MOV KEYST,1 ;按钮标志位置为1
JMP FIN
K2:
MOV KEYST,2 ;按钮标志位置为 2
INC PAUSEKEY ;记录暂停按钮按下次数
JMP FIN
K3:
MOV KEYST,3 ;按钮标志位置为3
FIN:
POPF ;恢复现场
POP BX
POP AX
IRET
INTR_KEY ENDP
RUNNING PROC ;根据当前的中断触发类型,转入不同的显示
AGAIN:
CMP KEYST,1
JZ T1
CMP KEYST,2
JZ T2
CMP KEYST,3
JZ T3
JMP E0
T1:
MOV AL,0 ;正常计时和继续计时,暂停时间清零
LEA DI,PAUSEBUF
MOV CX,4
CLD
REP STOSB
CALL TIME ;转入计时
JMP E0
T2:
TEST PAUSEKEY,1 ;检测暂停按钮按下次数,转入暂停或继续计时
JZ T1
CALL PAUSETIME ;调用暂停时间计时子程序
MOV AL,0 ;奇数次,把继续计时时间暂存区清零
LEA DI,RESUMEBUF
MOV CX,4
CLD
REP STOSB
JMP E0
T3:
CALL RESET ;系统复位
E0:
CALL DISP ;调用显示子程序
CMP KEYST,3
JZ OUT2
CMP KEYST,1
JZ OUT2
TEST PAUSEKEY,1
JZ OUT1
CALL PAUSEDISP ;调用暂停计时时间显示子程序
JMP OUT2
OUT1:
CALL RESUMEDISP ;调用继续计时时间显示子程序
OUT2:RET
RUNNING ENDP
TIME PROC ;计时子程序,按时间进位规则
PUSH AX
PUSH BX
PUSH SI
PUSH DI
LEA SI,TIMEBUF ;10毫秒
MOV AH, [SI]
INC AH
CMP AH,100
JZ S1
MOV [SI],AH
JMP S5
S1:
MOV AH,0 ;秒
MOV [SI],AH
MOV AH,[SI+1]
INC AH
CMP AH,60
JZ S2
MOV [SI+1],AH
JMP S5
S2:
MOV AH,0 ;分
MOV [SI+1],AH
MOV AH,[SI+2]
INC AH
CMP AH,60
JZ S3
MOV [SI+2],AH
JMP S5
S3:
MOV AH,0 ;时
MOV [SI+2],AH
MOV AH,[SI+3]
INC AH
CMP AH,24
JZ S4
MOV [SI+3],AH
JMP S5
S4:
MOV AL,0
LEA DI,TIMEBUF
MOV CX,4
CLD
REP STOSB
S5:
CALL DIGIT ;将正常计时时间转换为数位值
CALL RESUMETIME ;从继续计时时刻开始的计时
CALL RESUMEDIGIT ;将继续计时时间转换为数位值
CALL DELAY8253 ;8253计时
POP DI
POP SI
POP BX
POP AX
RET
TIME ENDP
DIGIT PROC ;将时间转换为数位值
PUSH AX
PUSH BX
PUSH CX
PUSH SI
PUSH DI
MOV BL,4 ;4个时间单位,依次转换
LEA DI,LEDBUF
LEA SI,TIMEBUF
NEXT:
LODSB ;从TIMEBUF中依次取出时间值
MOV AH,0
MOV CL,10 ;除以10,分离出时间的个位和十位,存入 LEDBUF
DIV CL
XCHG AH,AL
STOSB
MOV AL,AH
STOSB
DEC BL
JNZ NEXT
POP DI
POP SI
POP CX
POP BX
POP AX
RET
DIGIT ENDP
DISP PROC ;显示 LEDBUF 中的值
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
LEA BX,LEDTAB
LEA SI,LEDBUF
MOV CX,8
MOV AH,7FH
LOOP1:
MOV AL,[SI]
XLAT ;换码,数位值转换成LED显示段码
MOV DX,A8255 ;段码值送8255A端口A
OUT DX,AL
CMP AH,7FH
JZ DIS1
CMP AH,0BFH
JZ DIS1
MOV AL,AH ;LED位选送 8255A端口 B
MOV DX,B8255
OUT DX,AL
DIS1: CALL DELAY
ROR AH,1
INC SI
CALL CLRLED ;LED清屏
LOOP LOOP1
POP SI
POP DX
POP CX
POP BX
POP AX
RET
DISP ENDP
CLRLED PROC ;清屏子程序
PUSH AX
PUSH DX
MOV AL,0FFH
MOV DX,B8255
OUT DX,AL
POP DX
POP AX
RET
CLRLED ENDP
DELAY8253 PROC ;8253延时子程序
PUSH AX
PUSH DX
MOV DX,CTR8253 ;设置8253控制字,计数器0,方式0
MOV AL,00010000B
OUT DX,AL
MOV DX,CH0
MOV AL,06H
OUT DX,AL
MOV DX,AD245
W1:
IN AL,DX
TEST AL,01H ;检测8253计时是否结束,计数器0输出高电平
JZ W1
POP DX
POP AX
RET
DELAY8253 ENDP
DELAY PROC ;软延时
PUSH CX
MOV CX,50
WAIT1:
LOOP WAIT1
POP CX
RET
DELAY ENDP
RESET PROC ;计数复位子程序,数据缓冲区全部清0
PUSH AX
PUSH CX
PUSH DI
MOV AL,0
LEA DI,TIMEBUF
MOV CX,13
CLD
REP STOSB
MOV AL,0
LEA DI,PAUSEBUF
MOV CX,4
CLD
REP STOSB
MOV AL,0
LEA DI,RESUMEBUF
MOV CX,4
CLD
REP STOSB
POP DI
POP CX
POP AX
RESET ENDP
KEY PROC ;读开关子程序
MOV DX,C8255
IN AL,DX
RET
KEY ENDP
更多(源文件、报告)请见:
文章来源:https://blog.csdn.net/qq_61814350/article/details/135140964
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!