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
关键修改说明
- 段码表定义:添加共阴数码管段码表,对应0-9的数字显示,若使用共阳LED,需替换为对应段码(如0C0h、0F9h等)。
- 红灯状态判断:检测到进入红灯状态时,启动倒计时循环。
- 1秒延时实现:每次倒计时循环执行1秒延时,累计完成4秒红灯时长。
- LED输出控制:通过端口5输出当前倒计时数字的段码,实现LED动态倒计时。
- 初始状态调整:将
situation第一个状态改为all_red,确保程序启动后先进入红灯并触发倒计时。
注意事项
- 需确认Traffic_Lights.exe模拟器中LED数码管的对应端口,若不是端口5,需修改
out 5, al中的端口值。 - 可根据需求调整非红灯状态的延时时长。
内容的提问来源于stack exchange,提问作者qal
相关产品推荐
相关产品推荐

