📄 8x8矩阵键盘识别技术.c
字号:
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// 8x8矩阵键盘
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <intrins.h>
#include "Reg54.h"
#define KEY_ROW_IO P1 // 行线使用的I/O口
#define KEY_COL_IO P2 // 列线使用的I/O口
typedef unsigned char uchar; // 取值范围: 0-255(0xFF)
typedef unsigned int uint; // 取值范围: 0-65535(0xFFFF)
typedef unsigned long ulong; // 取值范围: 0-4294967295(0xFFFFFFFF)
#ifndef True
#define True 1 // 逻辑"真"
#endif
#ifndef False
#define False 0 // 逻辑"假"
#endif
//==================================================================================================
// 功能: 扫描8x8矩阵键盘识别用户按下的按键.
// 返回: 用户按下的按键代号.
// 参数: None.
//==================================================================================================
uchar ScanKeyBoard8x8(void)
{
uchar data vKeyID=0,vKeyCode;
uchar data i,j,k;
for(i=0; i<8; i++)
{
KEY_ROW_IO = 0xFF; // 将所有行线拉高
KEY_COL_IO = ~(0x01<<i); // 将相应列线拉低(第[i]列)
vKeyCode = KEY_ROW_IO; // 读取行线IO状态(Bit[0:7])
if(vKeyCode!=0xFF) // 判断有无行线被拉低(有表示有按键按下)
{
//==============================================================//
// 检测到有按键按下时,需要执行按键除颤抖(只须延时100ms即可实现)
//==============================================================//
for(j=50; j>0; j--)
{
for(k=200; k>0; k--);
}
vKeyCode = KEY_ROW_IO; // 读取行线IO状态(Bit[0:7])
if(vKeyCode!=0xFF) // 判断有无行线被拉低(有表示有按键按下)
{
vKeyCode = KEY_ROW_IO; // 读取行线IO状态(Bit[0:7])
//============================================================//
// 找出被按下的按键(被拉低的行线与第[i]列线)
//============================================================//
switch(vKeyCode) // 检测与第[i]列相连的8个按键中哪个被按下
{
case 0xFE: // Bit0被拉低
vKeyID = 1;
break;
case 0xFD: // Bit1被拉低
vKeyID = 2;
break;
case 0xFB: // Bit2被拉低
vKeyID = 3;
break;
case 0xF7: // Bit3被拉低
vKeyID = 4;
break;
case 0xEF: // Bit4被拉低
vKeyID = 5;
break;
case 0xDF: // Bit5被拉低
vKeyID = 6;
break;
case 0xBF: // Bit6被拉低
vKeyID = 7;
break;
case 0x7F: // Bit7被拉低
vKeyID = 8;
break;
default: // 按下超过1个按键
vKeyID = 0; // 不支持多个按键同时按下
break;
}
vKeyCode = KEY_ROW_IO; // 读取行线IO状态(Bit[0:7])
while(vKeyCode!=0xFF) vKeyCode = KEY_ROW_IO; // 等待用户松开按键
if(vKeyID!=0)
{
vKeyID += (i<<3);
break;
}
}
}
}
return(vKeyID);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -