8255数码管c语言,8255驱动矩阵键盘和数码管程序
时间: 2023-08-10 08:03:51 浏览: 81
以下是一份使用8255芯片控制数码管和矩阵键盘的C语言程序:
```
#include <reg52.h>
#define DATA_PORT P0
#define CTRL_PORT P1
#define KEYPAD_PORT P2
sbit SEL_DIGIT1 = P1^0; // 数码管第一位
sbit SEL_DIGIT2 = P1^1; // 数码管第二位
sbit SEL_DIGIT3 = P1^2; // 数码管第三位
sbit SEL_DIGIT4 = P1^3; // 数码管第四位
unsigned char code DIGIT_TABLE[16] = { // 数码管显示数字表
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
unsigned char code SCAN_TABLE[4][4] = { // 矩阵键盘扫描表
{0x01, 0x02, 0x03, 0x0A},
{0x04, 0x05, 0x06, 0x0B},
{0x07, 0x08, 0x09, 0x0C},
{0x0E, 0x00, 0x0F, 0x0D}
};
void delay(unsigned int ms) { // 延时函数
unsigned int i, j;
for(i = ms; i > 0; i--)
for(j = 114; j > 0; j--);
}
void init_8255() { // 初始化8255芯片
DATA_PORT = 0xFF; // 数据口输出高电平
CTRL_PORT = 0x80; // 控制口设置为模式0
}
void display(unsigned char digit, unsigned char num) { // 数码管显示函数
DATA_PORT = DIGIT_TABLE[num];
switch(digit) {
case 1: SEL_DIGIT1 = 0; SEL_DIGIT2 = 1; SEL_DIGIT3 = 1; SEL_DIGIT4 = 1; break;
case 2: SEL_DIGIT1 = 1; SEL_DIGIT2 = 0; SEL_DIGIT3 = 1; SEL_DIGIT4 = 1; break;
case 3: SEL_DIGIT1 = 1; SEL_DIGIT2 = 1; SEL_DIGIT3 = 0; SEL_DIGIT4 = 1; break;
case 4: SEL_DIGIT1 = 1; SEL_DIGIT2 = 1; SEL_DIGIT3 = 1; SEL_DIGIT4 = 0; break;
default: break;
}
}
unsigned char scan_keypad() { // 矩阵键盘扫描函数
unsigned char row, col, key = 0xFF;
for(row = 0; row < 4; row++) {
KEYPAD_PORT = ~(1 << row);
for(col = 0; col < 4; col++) {
if((KEYPAD_PORT & (1 << (col + 4))) == 0) {
delay(10);
if((KEYPAD_PORT & (1 << (col + 4))) == 0)
key = SCAN_TABLE[row][col];
}
}
}
return key;
}
void main() {
unsigned char i, key, digits[4] = {0, 0, 0, 0};
init_8255();
while(1) {
for(i = 1; i <= 4; i++) {
display(i, digits[i-1]);
delay(5);
}
key = scan_keypad();
if(key != 0xFF) {
digits[3] = digits[2];
digits[2] = digits[1];
digits[1] = digits[0];
digits[0] = key;
}
}
}
```
上述程序中,使用了4个数码管和一个4x4矩阵键盘。函数`init_8255()`用于初始化8255芯片,将数据口设置为输出高电平,控制口设置为模式0。函数`display()`用于在指定的数码管上显示指定的数字。函数`scan_keypad()`用于扫描矩阵键盘,返回按下的键值。函数`main()`中不断循环显示数码管,同时扫描矩阵键盘,如果有按键按下则在最后一个数码管上显示按键值。