求一个可任意启动停止的电子秒表,用proteus8和emu8086编译

我需要proteus仿真图和汇编程序,
要求:6位LED数码显示,计时单位为1/100秒。利用功能键进行启/停控制。其功能为:上电后计时器清0,当第一次(或奇数次)按下启/停键时开始计数。第2次(或偶数次)按下该键时停止计时,再一次按启/停键时清零后重新开始计时……

怎么显示应该说明一下吧。

.model small
.stack 100h

.data
    count dw 0     ; 计数器
    startFlag db 0 ; 启动标志,0表示未启动,1表示已启动
    display db 6 dup(0) ; 显示数码管的值

.code
main proc
    mov ax, @data
    mov ds, ax

    call initPorts  ; 初始化端口

    mov al, 0
    mov ah, 4Ch
    int 21h        ; 结束程序

initPorts proc
    mov dx, 8255h  ; 8255芯片端口地址
    mov al, 10001000b  ; 控制字:模式0,端口A、B为输出,端口C为输入
    out dx, al

    ret
initPorts endp

displayNum proc
    mov cx, 6
    mov si, offset display
    mov dx, 8255h

displayLoop:
    mov al, [si]
    out dx, al
    inc si
    loop displayLoop

    ret
displayNum endp

startStop proc
    mov dx, 60h   ; 60号中断向量(用于按键检测)

    push ax
    push bx

    mov bx, 0
    mov ax, 0
    int dx        ; 检测按键

    pop bx
    pop ax

    cmp bl, 1     ; 检查是否按下启/停键
    je startStopPressed

    ret

startStopPressed:
    mov ah, 0
    int dx        ; 读取按键状态

    cmp al, 1     ; 检查按键是否按下
    jne startStop  ; 如果未按下,继续检测

    mov al, startFlag
    xor al, 1     ; 切换启动标志的值

    mov startFlag, al

    ret
startStop endp

updateCount proc
    mov ax, count
    add ax, 1     ; 增加计数器值
    mov count, ax

    ret
updateCount endp

clearCount proc
    mov ax, 0
    mov count, ax

    ret
clearCount endp

displayCount proc
    mov bx, count

    mov al, bl
    mov [display], al

    mov al, bh
    mov [display + 1], al

    ret
displayCount endp

timerInterrupt proc
    push ax
    push bx

    call startStop
    cmp startFlag, 1
    jne skipUpdate

    call updateCount

skipUpdate:
    call displayCount

    pop bx
    pop ax

    iret
timerInterrupt endp

end main


参考一下这个:https://blog.csdn.net/weixin_48745280/article/details/131230300


; 6位LED数码显示,计时单位为1/100秒。利用功能键进行启/停控制。
; 其功能为:上电后计时器清0,当第一次(或奇数次)按下启/停键时开始计数。
; 第2次(或偶数次)按下该键时停止计时,再一次按启/停键时清零后重新开始计时……

org 0000h
ljmp main

; 变量定义
org 0030h
cnt dw 0 ; 计数器
flag bit 0 ; 记录启/停状态

; 中断服务程序
org 0023h
timer_isr:
    inc cnt ; 计数器加1
    reti

; 主程序
org 000bh
main:
    ; 初始化
    clr flag ; 启/停状态清零
    mov cnt, #0 ; 计数器清零

    ; 定时器设置
    mov TMOD, #1 ; 设置定时器0为模式1
    mov TH0, #0 ; 定时器0高位计数器清零
    mov TL0, #0 ; 定时器0低位计数器清零
    setb TR0 ; 启动定时器0
    setb EA ; 允许中断

loop:
    ; 显示计数器的值
    mov dptr, #0 ; 显示首地址
    mov a, cnt ; 取计数器的值
    movc a, @a+dptr ; 取个位数
    mov P1, a ; 显示个位数
    inc dptr ; 地址加1
    mov a, cnt ; 取计数器的值
    swap a ; 交换高4位和低4位的值
    movc a, @a+dptr ; 取十位数
    mov P2, a ; 显示十位数
    inc dptr ; 地址加1
    mov a, cnt ; 取计数器的值
    swap a ; 交换高4位和低4位的值
    movc a, @a+dptr ; 取百位数
    mov P3, a ; 显示百位数
    inc dptr ; 地址加1
    mov a, cnt ; 取计数器的值
    swap a ; 交换高4位和低4位的值
    movc a, @a+dptr ; 取千位数
    mov P4, a ; 显示千位数
    inc dptr ; 地址加1
    mov a, cnt ; 取计数器的值
    swap a ; 交换高4位和低4位的值
    movc a, @a+dptr ; 取万位数
    mov P5, a ; 显示万位数
    inc dptr ; 地址加1
    mov a, cnt ; 取计数器的值
    movc a, @a+dptr ; 取十万位数
    mov P6, a ; 显示十万位数
    inc dptr ; 地址加1

    ; 判断启/停状态
    jb P0.0, start ; 如果按下启/停键,跳转到start
    sjmp loop ; 否则继续循环

start:
    ; 切换启/停状态
    cpl flag ; 启/停状态取反
    jnb flag, stop ; 如果是奇数次按下启/停键,跳转到stop

    ; 启动定时器0
    setb TR0 ; 启动定时器0
    sjmp loop ; 跳转到loop

stop:
    ; 停止定时器0
    clr TR0 ; 停止定时器0
    sjmp loop ; 跳转到loop

end

可任意启动和停止的电子秒表的设计
你这个估计也是期末考试吧,可以参考下
https://www.docin.com/p-2679018459.html

以下是一个基于Proteus仿真图和汇编程序的示例,实现了你描述的功能。在这个示例中,使用了一个6位数码管显示计时器的值,并通过功能键控制启动/停止和清零操作。请参考下面的链接,下载示例的Proteus仿真图:
Proteus仿真图下载

ORG 0000h

CLR P1.0      ; P1.0 用作功能键输入
CLR P1.1      ; P1.1 用作计时器输入
CLR P1.2      ; P1.2 用作数码管段选
SETB P1.3     ; P1.3 用作数码管位选(共阳极)
MOV DPTR, #DELAY
MOV R6, #6
MOV P1, #0FFh ; 数码管位选初始值全为1

START:
  JB P1.0, START ; 检测功能键按下
  INC R0        ; 计时器递增
  MOV A, R0
  DIV AB, #10   ; 除以10,商存在A中,余数存在B中
  MOV R2, A     ; 十位数存放在R2中
  MOV R3, B     ; 个位数存放在R3中
  MOV A, R0
  JB ACC.3, STOP ; 检测计时器值的最高位是否为1,如果为1,表示按下功能键偶数次,停止计时
  CALL DISPLAY  ; 显示计时器值
  SJMP START    ; 循环继续

STOP:
  MOV R0, #0    ; 清零计时器
  CALL DISPLAY  ; 清零后显示0
  JB P1.0, START ; 等待功能键再次按下,重新开始计时
  SJMP START    ; 循环继续

DISPLAY:
  MOV A, R2
  ADD A, #30h   ; 将十位数转换为ASCII码
  MOV P1.2, A   ; 送段选
  MOV A, R3
  ADD A, #30h   ; 将个位数转换为ASCII码
  MOV P1.2, A   ; 送段选
  MOV A, #6     ; 位选个数
  MOV R1, #0Fh
LOOP:
  MOV P1, R1    ; 送位选
  ACALL DELAY   ; 延时
  RLC R1        ; 循环左移
  DJNZ A, LOOP  ; 继续循环
  RET

DELAY:
  MOV R7, #1
LOOP1:
  MOV R5, #250
LOOP2:
  DJNZ R5, LOOP2
  DJNZ R7, LOOP1
  RET

ORG 0200h
DELAY:
  DB 0


你这个需求,就是使用汇编语言设计一个数字秒表,其中可以使用8086作为处理器,8253来做定时功能,使用8255做锁存和并行输出功能,最后驱动7段数码管正确显示。
至于具体的实现代码,找到一个和你的需求一模一样的,有开源的代码和设计图,你可以直接参考:
微型计算机可任意启动/停止的电子秒表:https://ee.ac.cn/index.php/archives/19.html
最终实现的效果:

img