You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

8086微控制器交通灯项目:红灯4秒及LED倒计时实现求助

8086交通灯项目:实现红灯4秒倒计时LED显示

问题背景

正在开发8086微控制器交通灯项目,需求为设置红灯时长4秒,并通过LED实现倒计时显示该时长,但现有代码未实现此功能,现有代码如下:

; controlling external device with 8086 microprocessor.
; realistic test for c:\emu8086\devices\Traffic_Lights.exe

#start=Traffic_Lights.exe#

name "traffic" 


mov ax, all_red
out 4, ax


mov si, offset situation


next:
mov ax, [si]
out 4, ax   



; wait 5 seconds (5 million microseconds)
mov     cx, 4Ch    ;    004C4B40h = 5,000,000
mov     dx, 4B40h
mov     ah, 86h
int     15h   


add si, 2 ; next situation
cmp si, sit_end
jb  next
mov si, offset situation
jmp next    
            

;                        FEDC_BA98_7654_3210
situation        dw      0000_0011_0000_1100b
s1               dw      0000_0110_1001_1010b
s2               dw      0000_1000_0110_0001b
s3               dw      0000_1000_0110_0001b
s4               dw      0000_0100_1101_0011b
sit_end = $


all_red          equ     0000_0010_0100_1001b

解决方案

修改后的完整代码

; controlling external device with 8086 microprocessor.
; realistic test for c:\emu8086\devices\Traffic_Lights.exe

#start=Traffic_Lights.exe#

name "traffic" 

; 共阴数码管段码(0-9),段顺序:a b c d e f g dp
seg_code db 3Fh, 06h, 5Bh, 4Fh, 66h, 6Dh, 7Dh, 07h, 7Fh, 6Fh

mov ax, all_red
out 4, ax

mov si, offset situation

next:
mov ax, [si]
; 判断当前是否为红灯状态
cmp ax, all_red
jne skip_countdown

; 红灯4秒倒计时逻辑
mov cx, 4
countdown_loop:
; 获取当前倒计时数字的段码
mov al, cx
mov bx, offset seg_code
xlat
; 输出到LED显示端口(假设端口5对应LED数码管)
out 5, al

; 延时1秒(1,000,000微秒)
mov cx, 000Fh
mov dx, 4240h
mov ah, 86h
int 15h

dec cx
jnz countdown_loop

; 倒计时结束后清除LED显示
mov al, 00h
out 5, al

skip_countdown:
out 4, ax

; 非红灯状态保持原5秒延时
mov cx, 4Ch
mov dx, 4B40h
mov ah, 86h
int 15h

add si, 2
cmp si, sit_end
jb next
mov si, offset situation
jmp next            

;                        FEDC_BA98_7654_3210
situation        dw      all_red ; 第一个状态设为红灯,触发倒计时
s1               dw      0000_0110_1001_1010b
s2               dw      0000_1000_0110_0001b
s3               dw      0000_1000_0110_0001b
s4               dw      0000_0100_1101_0011b
sit_end = $

all_red          equ     0000_0010_0100_1001b

关键修改说明

  1. 段码表定义:添加共阴数码管段码表,对应0-9的数字显示,若使用共阳LED,需替换为对应段码(如0C0h、0F9h等)。
  2. 红灯状态判断:检测到进入红灯状态时,启动倒计时循环。
  3. 1秒延时实现:每次倒计时循环执行1秒延时,累计完成4秒红灯时长。
  4. LED输出控制:通过端口5输出当前倒计时数字的段码,实现LED动态倒计时。
  5. 初始状态调整:将situation第一个状态改为all_red,确保程序启动后先进入红灯并触发倒计时。

注意事项

  • 需确认Traffic_Lights.exe模拟器中LED数码管的对应端口,若不是端口5,需修改out 5, al中的端口值。
  • 可根据需求调整非红灯状态的延时时长。

内容的提问来源于stack exchange,提问作者qal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 17:40:30