您的位置:首页 > 其它

按键检测

2017-11-14 13:11 85 查看
1

按键检测有以下几个步骤

1、检测有无按键按下

2、逐行扫描(逐行扫描功耗比较小,也可以采用行列反转的方式,

但是功耗比较大,多用于交流电中)



这里是四行三列的按键。

U8 Keypad_scan(void)
{
static unsigned char result = 0;
switch (Keypad_ScanPara.step)
{
case 0://确认
keypad_init();
if(SSW4_PV == E_KEY_ST_PUSH)//检测第一列
{
Keypad_ScanPara.row =1;
Keypad_ScanPara.KeypadFLAG =1;
Keypad_ScanPara.KeypadTime++;/*用delay()计时会导致
KeypadTime的值得方式,来实现delay(),来实现软件滤波。*/
}
else if(SSW5_PV == E_KEY_ST_PUSH)
{
Keypad_ScanPara.row =2;
Keypad_ScanPara.KeypadFLAG =1 ;
Keypad_ScanPara.KeypadTime++;
}
else if(SSW6_PV == E_KEY_ST_PUSH)
{
Keypad_ScanPara.row =3;
Keypad_ScanPara.KeypadFLAG =1;
Keypad_ScanPara.KeypadTime++;
}
else//未扫描到按键
{
Keypad_ScanPara.KeypadFLAG = 0;
Keypad_ScanPara.KeypadTime = 0;
}
if(Keypad_ScanPara.KeypadTime >  KEY_SHORTCNT)//按键时间大于防抖时间
{
Keypad_ScanPara.step = 1; //确立按键按下
Keypad_ScanPara.line = 0;
}
break;
case 1://扫描
SSW0_OUTPUT;    SSW0_L;
SSW1_OUTPUT;    SSW1_H;
SSW2_OUTPUT;    SSW2_H;
SSW3_OUTPUT;    SSW3_H;
__NOP();        __NOP();
if((SSW4_PV == E_KEY_ST_PUSH) || (SSW5_PV == E_KEY_ST_PUSH) || (SSW6_PV == E_KEY_ST_PUSH))
{
Keypad_ScanPara.line = 1;
}
else
{
SSW0_OUTPUT;    SSW0_H;
SSW1_OUTPUT;    SSW1_L;
SSW2_OUTPUT;    SSW2_H;
SSW3_OUTPUT;    SSW3_H;
__NOP();        __NOP();
if((SSW4_PV == E_KEY_ST_PUSH) || (SSW5_PV == E_KEY_ST_PUSH) || (SSW6_PV == E_KEY_ST_PUSH))
{
Keypad_ScanPara.line = 2;
}
else
{
SSW0_OUTPUT;    SSW0_H;
SSW1_OUTPUT;    SSW1_H;
SSW2_OUTPUT;    SSW2_L;
SSW3_OUTPUT;    SSW3_H;
__NOP();    __NOP();
if((SSW4_PV == E_KEY_ST_PUSH) || (SSW5_PV == E_KEY_ST_PUSH) || (SSW6_PV == E_KEY_ST_PUSH))
{
Keypad_ScanPara.line = 3;
}
else
{
SSW0_OUTPUT;    SSW0_H;
SSW1_OUTPUT;    SSW1_H;
SSW2_OUTPUT;    SSW2_H;
SSW3_OUTPUT;    SSW3_L;
__NOP();        __NOP();
__NOP();        __NOP();
__NOP();        __NOP();
__NOP();        __NOP();
if((SSW4_PV == E_KEY_ST_PUSH) || (SSW5_PV == E_KEY_ST_PUSH) || (SSW6_PV == E_KEY_ST_PUSH))
{
Keypad_ScanPara.line = 4;
}
else
{
Keypad_ScanPara.row = 0;
Keypad_ScanPara.line = 0;
Keypad_ScanPara.KeypadFLAG = 0;
Keypad_ScanPara.KeypadTime = 0;
}
}
}
}
if(Keypad_ScanPara.line>0 && Keypad_ScanPara.line <5)
{
result = 1;
}
else
{
Keypad_ScanPara.step = 0 ;
}
break;
case 2://弹起
keypad_init();
if((SSW4_PV == E_KEY_ST_RELEASE) &&(SSW5_PV == E_KEY_ST_RELEASE) && (SSW6_PV == E_KEY_ST_RELEASE))
{
Keypad_ScanPara.step = 0 ;
}
result = 0;
break;
}
return result;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  key