#include "SN8P2704A.h"
#include "A01_Main.h"
#include "A02_LED.h"
#include "A03_KEY.h"
#define pKEY_Rece_Port    2
#define cKEY_Connect_NUM 0xf0
#define cKEY1_FUN_NUM 0x10
#define cKEY2_FUN_NUM 0x20
#define cKEY3_FUN_NUM 0x40
#define cKEY4_FUN_NUM 0x80
uchar dKey_Filter; //滤波
uchar dKey_NUM; //键值传递
uchar dKey_Process; //按键处理标志
/*********************************************************************************
****1.按键扫描
*********************************************************************************/
void MKey_Scan(void)
{
uchar gLocal_L;
gLocal_L = pKEY_Rece_Port;
if((gLocal_L&cKEY_Connect_NUM) != cKEY_Connect_NUM)
{ //有键按下
++dKey_Filter;
if(dKey_Filter > 3)
{ //滤波
dKey_Filter = 0;
dKey_NUM = gLocal_L&cKEY_Connect_NUM;
gLocal_L = dKey_NUM ^ dKey_Process;
dKey_Process &= gLocal_L;
}
}
else
{
dKey_Process = 0;
dKey_Filter = 0;
dKey_NUM = cKEY_Connect_NUM;
}
}
/*********************************************************************************
****2.按键1处理
*********************************************************************************/
void MKey1_Function(void)
{
if((dKey_NUM &cKEY1_FUN_NUM) == 0)
{
if((dKey_Process&cKEY1_FUN_NUM) == 0)
{
dKey_Process |= cKEY1_FUN_NUM;
LED1=!LED1;
}
}
}
/*********************************************************************************
****3.按键2处理
*********************************************************************************/
void MKey2_Function(void)
{
if((dKey_NUM &cKEY2_FUN_NUM) == 0)
{
if((dKey_Process&cKEY2_FUN_NUM) == 0)
{
dKey_Process |= cKEY2_FUN_NUM;
LED2=!LED2;
}
}
}
/*********************************************************************************
****4.按键3处理
*********************************************************************************/
void MKey3_Function(void)
{
if((dKey_NUM &cKEY3_FUN_NUM) == 0)
{
if((dKey_Process&cKEY3_FUN_NUM) == 0)
{
dKey_Process |= cKEY3_FUN_NUM;
LED3=!LED3;
}
}
}
/*********************************************************************************
****5.按键4处理
*********************************************************************************/
void MKey4_Function(void)
{
if((dKey_NUM &cKEY4_FUN_NUM) == 0)
{
if((dKey_Process&cKEY4_FUN_NUM) == 0)
{
dKey_Process |= cKEY4_FUN_NUM;
LED4=!LED4;
}
}
}
这个按键扫描程序是一个框架,四个按键接在P2口的高四位,用定时器10ms中断一次,到了置位标志位,在主函数中
判断标志位是否为1,如果为1则调用以上五个函数,这样就可以用P2口的高四位控制低四位的LED灯进行翻转,而且各个按键
之间互不干扰,按下几个键,再去按其他键还是有用,因为没有用到delay延时函数,所以程序不会卡死。
现在遇到一个问题,就是如果四个按键不是接在一组IO口上,而是接在三组IO口上,怎么来用这个框架对四个按键进行扫描呢?麻烦高手指点一下。
|