Prj10--8088单板机C语言8259测试(1)
1.原理图
2.Deepseek示例代码
#include <dos.h>
#include <conio.h>
#include <stdio.h>#define PIC1_CMD 0x400 // 命令端口 (A0=0)
#define PIC1_DATA 0x401 // 数据端口 (A0=1)volatile int int_count = 0; // 中断计数器
void interrupt (*old_isr)(void); // 原中断向量// 中断服务程序
void interrupt new_isr(void) {int_count++; // 增加中断计数// 显示中断信息printf("\nIRQ0 Triggered! Count: %d", int_count);// 发送EOI命令outportb(PIC1_CMD, 0x20);
}// 初始化8259
void init_8259(void) {// ICW1: 边沿触发 | 单片 | 需要ICW4outportb(PIC1_CMD, 0x13);// ICW2: 中断向量基址=20houtportb(PIC1_DATA, 0x20);// ICW4: 8086模式 | 正常EOIoutportb(PIC1_DATA, 0x01);// OCW1: 只允许IR0中断 (11111110b)outportb(PIC1_DATA, 0xFE);
}int main(void) {clrscr();printf("8259 Test Running. Press ESC to exit...\n");// 保存原中断向量 (INT 20h)old_isr = getvect(0x20);// 设置新中断向量setvect(0x20, new_isr);// 初始化8259init_8259();// 启用中断enable();// 主循环while(!kbhit() && int_count < 10) {// 等待中断或按键}// 检查是否按ESC退出if(kbhit() && getch() == 0x1B) {printf("\nESC pressed. ");}// 恢复设置disable();setvect(0x20, old_isr);// 屏蔽所有中断outportb(PIC1_DATA, 0xFF);printf("\nProgram terminated. Total interrupts: %d", int_count);return 0;
}