8255数码管c语言,8255驱动矩阵键盘和数码管程序
时间: 2023-08-10 22:04:16 浏览: 164
以下是一个使用8255驱动数码管和矩阵键盘的C语言程序:
```
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <dos.h>
#define PORT_A 0x0280 // 8255的端口A地址
#define PORT_B 0x0281 // 8255的端口B地址
#define PORT_C 0x0282 // 8255的端口C地址
void delay(int milliseconds) // 延时函数
{
long wait;
clock_t now, start;
wait = milliseconds * (CLK_TCK / 1000);
start = clock();
do {
now = clock();
} while ((now - start) < wait);
}
void writeData(unsigned char data) // 向8255的端口C写入数据
{
outp(PORT_C, data);
}
void writeControl(unsigned char control) // 向8255的端口B写入控制字
{
outp(PORT_B, control);
}
void setDisplay(unsigned char data) // 显示一个数字
{
writeData(data); // 先写入数据
writeControl(0x01); // 写入控制字,选择数码管
delay(1); // 延时一段时间
writeControl(0x00); // 关闭数码管
}
int main()
{
unsigned char keymap[4][4] = { // 键盘映射表
{ '1', '2', '3', 'A' },
{ '4', '5', '6', 'B' },
{ '7', '8', '9', 'C' },
{ '*', '0', '#', 'D' }
};
unsigned char displaymap[10] = { // 数码管映射表
0x3F, // 0
0x06, // 1
0x5B, // 2
0x4F, // 3
0x66, // 4
0x6D, // 5
0x7D, // 6
0x07, // 7
0x7F, // 8
0x6F // 9
};
unsigned char key, data;
int i, j;
writeControl(0x80); // 写入控制字,初始化8255
writeData(0x00); // 初始化端口C
writeControl(0x82); // 选择端口B,设为输入模式
delay(1); // 延时一段时间
while (1) {
for (i = 0; i < 4; i++) { // 扫描键盘
writeControl(0x82); // 选择端口B,设为输入模式
data = inp(PORT_B) & 0x0F;
if (data != 0x0F) {
delay(10); // 延时一段时间,消抖
data = inp(PORT_B) & 0x0F;
if (data != 0x0F) {
key = keymap[i][data];
setDisplay(displaymap[data]); // 显示按下的数字
while (inp(PORT_B) != 0x0F); // 等待键盘释放
printf("%c", key); // 输出按下的键
}
}
writeControl(0x81); // 选择端口A,设为输出模式
writeData(0xFF); // 关闭数码管
for (j = 0; j < 4; j++) { // 显示数码管
writeData(displaymap[j]);
writeControl(0x01);
delay(1);
writeControl(0x00);
}
}
}
return 0;
}
```
这个程序使用8255芯片来控制数码管和矩阵键盘。首先定义了8255的三个端口地址,以及延时函数。然后定义了向端口C和B写入数据的函数,以及显示一个数字的函数。接着定义了键盘映射表和数码管映射表。在主函数中,先初始化8255,然后进入一个死循环,不断扫描键盘和显示数码管。扫描键盘时,循环扫描4行4列的矩阵键盘,如果有键被按下,则根据映射表得到按下的键。然后显示按下的数字,并输出按下的键。显示数码管时,循环显示四个数字。最后,程序无限循环,等待下一次按键。
阅读全文