📄 get_key.c
字号:
/*******************************************************
文件:key.c
描述:键盘
开发环境:unSP IDE184
修改信息:2005-07-25 nevsaynev Initial Version
********************************************************/
#include "Get_Key.H"
/**************************************************
函数:void Get_Key()
描述:对4*5的并行键盘进行扫描,取得键码
硬接口:IOA0-IOA4为5列状态输入,IOA5-IOA8为4行电平输出
*P_IOA_Dir = 0x01e0;
*P_IOA_Attrib = 0x01e0;
软接口:主函数中请定义char型指针 *pchKeyValue,
调用本函数后可直接访问此指针得到键码
输入:指向键码的指针 *pchKeyValue
输出:取得的键码,置于指针 *pchKeyValue指向处
返回值:按键状态(是否有键按下),有则返回1,无则返回0
***************************************************/
uchar Get_Key(char *pchKeyValue)
{
int keyvalue,keyvalue_buf;
uchar flag=0,count_out=0,count=0,ii=0,row;
/*使所有行输出0,快速检测是否有键按下*/
*IOA_Data &= 0xfe1f;
if((*IOA_Data & 0x1f) == 0x1f)
return(0);
/*有键按下,则依次使各行输出零,取得键码*/
*IOA_Data |= 0x01e0;//首先使各输出全为高
while( ii < 4 )
{
CLRPORTA(ii + 5);
keyvalue = *IOA_Data & 0x1f;
if( keyvalue != 0x1f)
{
flag = 1;
row = ii;
keyvalue_buf=keyvalue;
break;
}
SETPORTA(ii + 5);
ii += 1;
*Wd_Clr=1;
}
if( !flag)
return(0);
/*进行去抖*/
flag=0;
while(count_out<10)//设置超时计数器
{
keyvalue = *IOA_Data & 0x1f;
if( keyvalue_buf != keyvalue)
{
flag = 0;
break;
}
count += 1;
count_out += 1;
keyvalue_buf = keyvalue;
if( count == 3)
{//去抖完成
flag=1;
break;
}
*Wd_Clr=1;
}
if(!flag)
return(0);
/*计算键值,并赋值给输出指针*/
*pchKeyValue = 0;
while(row) //取得各行首码
{
*pchKeyValue += 5;
row--;
*Wd_Clr=1;
}
switch(keyvalue)//计算偏置
{
case 0x1e:
*pchKeyValue += 1;
break;
case 0x1d:
*pchKeyValue += 2;
break;
case 0x1b:
*pchKeyValue += 3;
break;
case 0x17:
*pchKeyValue += 4;
break;
case 0x0f:
*pchKeyValue += 5;
break;
}
*Wd_Clr=1;
return(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -