cpp
复制代码
#include <stdio.h>
#include <conio.h>
#include <dos.h>
// 定义8255端口地址 (根据原理图译码确定)
#define PORT_8255_A 0x8000 // PA端口地址
#define PORT_8255_B 0x8001 // PB端口地址
#define PORT_8255_C 0x8002 // PC端口地址
#define PORT_8255_CTRL 0x8003 // 控制寄存器地址
// 数码管段码表 (共阴极)
unsigned char seg_codes[] = {
0x3F, // 0
0x06, // 1
0x5B, // 2
0x4F, // 3
0x66, // 4
0x6D, // 5
0x7D, // 6
0x07, // 7
0x7F, // 8
0x6F // 9
};
// 延时函数
void delay(unsigned int ms) {
for (unsigned int i = 0; i < ms; i++) {
for (unsigned int j = 0; j < 1000; j++) {
// 空循环延时
}
}
}
// 初始化8255
void init_8255() {
// 控制字: 10000001 (0x81)
// A口输出, B口输出, C口输出
outportb(PORT_8255_CTRL, 0x81);
}
// 显示8位数字
void display_numbers() {
unsigned char digits[] = {1, 2, 3, 4, 5, 6, 7, 8}; // 要显示的数字
while (!kbhit()) { // 按任意键退出
for (int i = 0; i < 8; i++) {
// 设置位选 (选中当前位)
outportb(PORT_8255_B, ~(1 << i));
// 设置段码
outportb(PORT_8255_A, seg_codes[digits[i]]);
// 延时保持显示
delay(1);
// 关闭当前位显示 (消除鬼影)
outportb(PORT_8255_A, 0x00);
}
}
}
int main() {
init_8255(); // 初始化8255
display_numbers(); // 显示数字
// 程序结束前关闭所有显示
outportb(PORT_8255_A, 0x00); // 关闭段选
outportb(PORT_8255_B, 0xFF); // 关闭位选
return 0;
}