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
相关产品推荐
相关产品推荐

