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

Turbo C++ 3.1中如何设置键盘中断以避免循环减速检测按键?

在DOS下用Turbo C++通过键盘中断实现无延迟循环终止

在DOS环境下,确实可以通过接管INT 9键盘中断实现类似Arduino的外部中断触发逻辑,完全不用在循环里轮询按键,避免拖慢循环速度。以下是具体实现方案:

核心思路

DOS的键盘硬件中断是INT 9,每当有按键按下/释放时,系统会自动触发这个中断。我们可以替换默认的INT 9中断处理函数,在自定义函数里检测按键并设置一个全局标志位,主循环只需要检查这个标志位即可决定是否终止,完全不影响循环执行效率。

实现步骤与代码示例

1. 定义全局标志与中断处理函数

用volatile修饰标志位,防止编译器因优化忽略中断对它的修改;中断函数需要用Turbo C++支持的interrupt关键字声明。

#include <dos.h>
#include <conio.h>

// 全局标志位:按键按下时置1
volatile int key_pressed = 0;
// 保存原INT9中断向量地址
void interrupt (*old_int9)(void);

// 自定义INT9中断处理函数
void interrupt new_int9(void) {
    unsigned char scancode;
    // 读取键盘扫描码(0x60是键盘数据端口)
    scancode = inportb(0x60);
    // 判断是否有按键按下(扫描码最高位为0表示按下,1表示释放)
    if (!(scancode & 0x80)) {
        key_pressed = 1;
    }
    // 调用原INT9中断处理函数,保证系统正常处理键盘事件
    old_int9();
    // 发送EOI(中断结束信号)给8259中断控制器,避免中断阻塞
    outportb(0x20, 0x20);
}

2. 主程序逻辑

进入循环前替换中断向量,循环执行任务并检查标志位,退出时必须恢复原中断(否则程序退出后键盘功能会失效):

int main() {
    // 保存原INT9中断向量
    old_int9 = getvect(9);
    // 设置自定义的INT9中断向量
    setvect(9, new_int9);

    // 你的任务循环
    while (!key_pressed) {
        // 这里写你要执行的任务代码
        // 比如模拟耗时操作:
        for (int i = 0; i < 10000; i++);
        printf("循环执行中...\n");
    }

    // 恢复原INT9中断向量,避免系统异常
    setvect(9, old_int9);
    printf("检测到按键,循环终止!\n");
    return 0;
}

注意事项

  • 必须恢复原中断:如果程序退出前不恢复原INT9向量,DOS系统的键盘功能会失效,只能重启电脑。
  • 指定按键触发:示例中任意按键按下都会终止循环,若要指定特定按键,可判断scancode的具体值(比如ESC键的扫描码是0x01)。
  • 编译设置:确保Turbo C++编译选项开启DOS中断支持,默认一般已开启,若报错可检查编译模式是否为DOS实模式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 08:30:49