这个简单,一般用延时消抖因为简单,如果一定要用定时器消抖的话,你就配一个10ms左右的定时器,然后把Key_Scan()放在这个定时器中断服务函数里面即可,还需要再最前面定义一个状态表,在这里我只贴出关键代码吧,再具体的楼主看着手册一点一点配寄存器即可
/* 按键返回状态 */
#define NO_KEY (0x00)
#define KEY_SINGLE (0x01)
/* 按键返回值*/
static uint8_t gRetValue;
/* 状态机表 */
typedef enum
{
kKEY_Idle, /*空闲态 */
kKEY_Debounce, /*确认与消抖态 */
kKEY_Confirm, /*确认按键状态*/
}KEY_Status;
/* 按键扫描*/
static void KEY_Scan(void)
{
static KEY_Status status = kKEY_Idle;
switch(status)
{
case kKEY_Idle:
gRetValue = NO_KEY;
if(KEY1 == 0)
{
status = kKEY_Debounce;
}
break;
case kKEY_Debounce:
if(KEY1 == 0)
{
status = kKEY_Confirm;
}
else
{
status = kKEY_Idle;
gRetValue = NO_KEY;
}
break;
case kKEY_Confirm:
if(KEY1 == 1)
{
gRetValue = KEY_SINGLE;
status = kKEY_Idle;
}
break;
default:
break;
}
}