📄 kb.c
字号:
//[KB.c]键盘扫描识别-------------------------------------------------------*
//本文件包含: *
// (1)KB_Init:键盘初始化 *
// (2)KB_Scan1:单次扫描读取键值 *
// (3)KB_Def:键值转为定义值 *
// (4)KB_ScanN:多次扫描键盘消除"抖动"问题 *
//-------------------------------------------------------------------------*
//头文件
#include "KB.h" //键盘扫描识别头文件
//KB_Init:键盘初始化函数---------------------------------------------------*
//功 能:初始化键盘中断的引脚,但未开放键盘中断 *
//参 数:无 *
//返 回:无 *
//-------------------------------------------------------------------------*
void KB_Init(void)
{
KB_P = 0x00; //复位KB_P
KB_D = 0x0F; //定义7-4为输入,3-0为输出
KB_PE = 0xF0; //定义KB_P.7-4允许上拉或下拉
KB_PS = 0x00; //定义KB_P.7-4上拉电阻,并且下降沿产生中断
KB_IE = 0x00; //定义KB_P.7-4输入引脚禁止中断
KB_IF = 0xFF; //清除键盘中断标志位(写1清)
}
//KB_Scan1:扫描读取键值函数------------------------------------------------*
//功 能:扫描一次4*4键盘上的按键,读取键值->*p;若无按键,*p为0xff *
//参 数:无 *
//返 回:扫描到的键值 *
//-------------------------------------------------------------------------*
INT8U KB_Scan1(void)
{
INT8U line,i,tmp;
line=0xFE; //使第一根行线为0(低电平)
for (i = 1; i <= 4; i++) //最多将扫描4根行线
{
//当前扫描的一行,输出低电平
tmp = KB_P;
tmp |= 0X0F;
KB_P = tmp & line;
asm("NOP");
asm("NOP");
//读取键盘口数据寄存器
tmp = KB_P;
//通过观察4根列线中是否出现低电平来判断当前行有无按键
tmp &= 0XF0; //仅保留列线的值
if (tmp != 0xF0) //当前行有键按下
{
tmp=KB_P; //读取扫描到的键值
break; //退出循环不再扫描
}
else //当前行无按键,准备扫描下一行
line = (line << 1) | 0x01;
}
if (i == 5) //无按键,以后将返回0xff
tmp = 0xFF;
return (tmp);
}
//KB_ScanN:多次扫描键盘函数------------------------------------------------*
//功 能:多次扫描键盘,消除"抖动" *
//参 数:KB_count=多次扫描键盘的的次数 *
//返 回:多次扫描键盘得到的键值: *
// 正常按键--KB_value_now; 非正常按键(包括无按键)--0xFF *
//内部调用函数:KB_Scan1 *
//-------------------------------------------------------------------------*
INT8U KB_ScanN(INT8U KB_count)
{
INT8U i,KB_value_last,KB_value_now;
if (0 == KB_count || 1 == KB_count)
return KB_Scan1();
//先扫描一次得到的键值,便于下面比较
KB_value_now = KB_value_last = KB_Scan1();
//以下多次扫描消除误差
for (i=0; i<KB_count-1; i++)
{
KB_value_now = KB_Scan1();
if (KB_value_now == KB_value_last)
return KB_value_now; //返回扫描的键值
else
KB_value_last = KB_value_now;
}
return 0xFF; //返回出错标志
}
//KB_Def:键值转为定义值函数------------------------------------------------*
//功 能:键值转为定义值 *
//参 数:KB_valve=键值 *
//返 回:KeyPress=键定义值 *
//-------------------------------------------------------------------------*
//键盘定义表
const INT8U KB_Table[]=
{
0xEE,'1',0xDE,'2',0xBE,'3',0x7E,'A',
0xED,'4',0xDD,'5',0xBD,'6',0x7D,'B',
0xEB,'7',0xDB,'8',0xBB,'9',0x7B,'C',
0xE7,'*',0xD7,'0',0xB7,'#',0x77,'D',
0x00
};
INT8U KB_Def(INT8U KB_valve)
{
INT8U KeyPress;
INT8U i;
INT8U j;
i = 0;
while (1)
{
j = KB_Table[i];
//与0(定义表结束标志)相比较
if (j == 0) //=0,即表中无次定义值
{
KeyPress = 0xFF; //返回0xFF
break;
}
else
{
//与键值相比较
if(j == KB_valve) //找到
{
KeyPress = KB_Table[i+1]; //取键定义值
break;
}
else
{
i += 2; //指向下一个键值,继续判断
}
}
}
return KeyPress; //返回键定义值
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -