我需要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
最终实现的效果: