8255数码管c语言,8255驱动矩阵键盘和数码管程序
时间: 2023-08-10 11:04:18 浏览: 185
以下是使用8255芯片驱动数码管和矩阵键盘的C语言程序。
```c
#include <reg51.h>
#define DataPort P0
#define KeyPort P1
#define CtrlPort P2
unsigned char code SegCode[] = { // 数码管编码表
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
};
unsigned char code KeyMap[] = { // 矩阵键盘映射表
0xee, 0xde, 0xbe, 0x7e,
0xed, 0xdd, 0xbd, 0x7d,
0xeb, 0xdb, 0xbb, 0x7b,
0xe7, 0xd7, 0xb7, 0x77
};
void WriteData(unsigned char dat) // 写数据到数码管
{
DataPort = SegCode[dat];
}
void WriteKey(unsigned char key) // 写按键到数码管
{
WriteData(key);
}
void ScanKey() // 扫描矩阵键盘
{
unsigned char i, j;
unsigned char key;
KeyPort = 0xf0;
key = KeyPort;
if (key != 0xf0) { // 检测到按键按下
for (i = 0; i < 4; i++) {
KeyPort = 0x0f;
KeyPort |= (0x10 << i);
key = KeyPort;
if (key != 0x0f) { // 检测到按键按下
for (j = 0; j < 4; j++) {
if (key == KeyMap[i*4+j]) {
WriteKey(i*4+j+1); // 显示按键数字
return;
}
}
}
}
}
}
main()
{
while (1) {
ScanKey(); // 扫描矩阵键盘
}
}
```
该程序使用P0口驱动数码管,P1口读取矩阵键盘输入,P2口控制8255芯片。
需要注意的是,在使用8255芯片时,需要先进行初始化。以下是初始化程序:
```c
void Init8255()
{
CtrlPort = 0x80; // 设置8255为I/O模式
CtrlPort = 0x90; // 设置8255端口A为输出
CtrlPort = 0xa0; // 设置8255端口B为输入
CtrlPort = 0xc0; // 设置8255端口C为输出
}
```
在主函数中调用该函数即可完成8255芯片的初始化。
以下是使用8255芯片驱动数码管的程序:
```c
void WriteData(unsigned char dat)
{
DataPort = SegCode[dat];
}
```
该函数将数码管编码表中对应数字的值写入P0口,从而驱动数码管显示数字。
在使用8255芯片驱动矩阵键盘时,需要先定义矩阵键盘的映射表。该映射表记录了矩阵键盘每个按键对应的键码。
```c
unsigned char code KeyMap[] = {
0xee, 0xde, 0xbe, 0x7e,
0xed, 0xdd, 0xbd, 0x7d,
0xeb, 0xdb, 0xbb, 0x7b,
0xe7, 0xd7, 0xb7, 0x77
};
```
该映射表按照行列顺序存储,每个元素代表一个按键对应的键码。
扫描矩阵键盘时,需要先将P1口设置为0xf0,然后读取P1口的值,检测是否有按键按下。
```c
KeyPort = 0xf0;
key = KeyPort;
if (key != 0xf0) {
// 检测到按键按下
}
```
如有按键按下,则需要扫描矩阵键盘,找到对应的按键,并将按键对应的数字显示在数码管上。
```c
for (i = 0; i < 4; i++) {
KeyPort = 0x0f;
KeyPort |= (0x10 << i);
key = KeyPort;
if (key != 0x0f) {
// 检测到按键按下
for (j = 0; j < 4; j++) {
if (key == KeyMap[i*4+j]) {
WriteKey(i*4+j+1); // 显示按键数字
return;
}
}
}
}
```
该程序将P1口的值设置为0x0f加上一个掩码,以便扫描矩阵键盘。然后遍历矩阵键盘映射表,找到对应的键码,将按键对应的数字显示在数码管上。
阅读全文