|
发表于 2010-4-23 21:45:38
|
显示全部楼层
其实楼主是在创建一个 OnKeydown 和 OnKeyup 事件,和傻孩子所给出的代码完全不是一个概念....
从思路上讲,LZ是采用了上位机面向对象编程的理念。
不可否认,这种方式占用极少的代码量,在某种意义上来讲,傻孩子的代码是达不到这种效果的。
但LZ在处理OnKeydown事件时,代码还不够精减,既然用了查表的方式,就直接由按键锁定到函数吧,为什么还要再用循环去查找呢,有点画蛇添足了,我觉得改为以下处理方式比较妥当:也顺便顶一下楼主;
typedef struct
{
unsigned char Name;
void (*Func_CLOSE)(void);
void (*Func_OPEN)(void);
} BUTTON;
#define BUTTONmax 8 //最多响应按键个数;
#define dfStructLEN sizeof(BUTTON) //按键结构长度;新增加的,便于直接定位到OnKeydown函数;
const BUTTON FunTab[BUTTONmax]={ //键值及 事件入口
~0x01,PA0_CLOSE,PA0_OPEN,
~0x02,PA1_CLOSE,PA1_OPEN,
~0x04,PA2_CLOSE,PA2_OPEN,
~0x08,PA3_CLOSE,PA3_OPEN,
~0x10,PA4_CLOSE,PA4_OPEN,
~0x20,PA5_CLOSE,PA5_OPEN,
~0x40,PA6_CLOSE,PA6_OPEN,
~0x80,PA7_CLOSE,PA7_OPEN
//可扩展组合键.
};
#define AllButtonOPEN 0xFF //无按键时的键值
unsigned char InputTimes,InputData=AllButtonOPEN,InputNew;
const BUTTON *pButton=FunTab; //先将函数默认到第一个按键-----其实符值完全多余;
void ScanInput(void)
{
if (InputData == PINA)
{
if (InputNew)
{
InputTimes++;
if (InputTimes == 8) //判键的防抖动
{//确认一次按键.(包括按下和松开)
InputTimes = 0;
InputNew = 0;
if (InputData == AllButtonOPEN) //处理OnKeyup事件
{
pButton->Func_OPEN(); //键盘松开事件;
}
else //处理 OnKeydown事件;
{ //键盘事件;
pButton=FunTab+(dfStructLEN*InputData);
pButton->Func_CLOSE();
}
}
}
}
else
{
InputTimes = 0;
InputData = PINA;
InputNew = 1;
}
} |
|