用8255,在数码管上显示键值 0~F,矩阵键盘编程,消抖动,数码管段码显示编程。数码管显示和消抖动部分采用子程序调用实现。
时间: 2024-04-02 15:36:26 浏览: 185
利用8255和51单片机实现数码管显示按键值的实验_.doc
以下是使用8255芯片驱动数码管和矩阵键盘的C语言程序,实现显示键值0~F、矩阵键盘编程、消抖动和数码管段码显示编程。
```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 Display(unsigned char dat)
{
DataPort = SegCode[dat];
}
// 消抖动函数
unsigned char KeyDown()
{
unsigned char key;
key = KeyPort;
if (key != 0xf0) { // 检测到按键按下
DelayMs(10); // 延时10ms
key = KeyPort;
if (key != 0xf0) { // 按键仍处于按下状态
while (key != 0xf0) { // 等待按键松开
key = KeyPort;
}
return 1; // 返回按键键值
}
}
return 0; // 没有按键按下
}
// 主函数
void main()
{
unsigned char key, i;
CtrlPort = 0x80; // 设置8255为I/O模式
CtrlPort = 0x90; // 设置8255端口A为输出
CtrlPort = 0xa0; // 设置8255端口B为输入
CtrlPort = 0xc0; // 设置8255端口C为输出
while (1) {
for (i = 0; i < 16; i++) { // 显示键值0~F
Display(i);
DelayMs(500); // 延时500ms
}
key = 0;
while (!key) { // 等待按键按下
key = KeyDown(); // 检测按键
}
Display(key-1); // 显示按键值
}
}
```
该程序使用P0口驱动数码管,P1口读取矩阵键盘输入,P2口控制8255芯片。
程序中包含了数码管显示函数`Display()`和消抖动函数`KeyDown()`。
在`main()`函数中,先使用循环显示键值0~F,然后等待按键按下。按键按下后,使用`KeyDown()`函数检测按键,并将按键值显示在数码管上。
需要注意的是,在使用8255芯片时,需要先进行初始化。
```c
CtrlPort = 0x80; // 设置8255为I/O模式
CtrlPort = 0x90; // 设置8255端口A为输出
CtrlPort = 0xa0; // 设置8255端口B为输入
CtrlPort = 0xc0; // 设置8255端口C为输出
```
在主函数中调用该函数即可完成8255芯片的初始化。
消抖动函数`KeyDown()`中使用了延时函数`DelayMs()`,该函数的实现如下:
```c
void DelayMs(unsigned int n)
{
unsigned int i, j;
for (i = 0; i < n; i++) {
for (j = 0; j < 125; j++);
}
}
```
该函数使用延时循环实现,每个循环延时1ms,因此调用`DelayMs(10)`时,会延时10ms。
以上是使用8255芯片,在数码管上显示键值0~F,实现矩阵键盘编程、消抖动和数码管段码显示编程的C语言程序。
阅读全文