此帖出自51单片机论坛
最新回复
说了那么多自己写个按键驱动不就得了.
这个是我的支持消抖和长按键给你参考:
/********************************************************key.h***********************************/
extern uint8 Press_Key_ID; //按键值
extern int8 Press_Key_Time;//持续按键时间
#define KEY_PORTX P3 //按键io口
//键盘扫描码,此数值等于此按键按抬起时port口上的数值(抬起高电平,按下拉低)
#define KEY_1 C_Bit7
#define KEY_2 C_Bit6
#define KEY_3 C_Bit5
#define KEY_4 C_Bit4
#define KEY_5 C_Bit3
#define KEY_6 C_Bit2
#define KEY_CODE (KEY_1+KEY_2+KEY_3+KEY_4+KEY_5+KEY_6)
//说明:以下定义的所指时间均以Key_Scan调用的时间间隔为单位
//按键去抖时间和长按键计时单位 此数值不能大于128
#define KEY_DEJITTER_TIME 100
//长按连发时间功能使用
#define PRESS_KEY_LONGTIME_MESSAGE //如果不用注释掉本行即可
//长按键时,按下按键每超过一次(下值*按建消抖时间)时就返回一个带长按标记的Key_ID值
//长按键计时以消抖以后开始计算
#define PRESS_KEY_LONGTIME_VALUE 16 //必须为2的n次整数
#define PRESS_KEY_LONGTIME_FLAG ~KEY_CODE //所有其它未使用的按键位均为标记
extern void Key_Scan(void);
extern uint8 Key_Get(void);
/***********************************************key.c********************************/
#include "51.h"
#include "key.h"
#ifdef PRESS_KEY_LONGTIME_MESSAGE
uint8 KeyTimeBase;
#endif
//unsigned char code Key_Table[6]={'U','D','-','+','S','T'};
uint8 Press_Key_ID=0; //按键扫描码
int8 Press_Key_Time=-KEY_DEJITTER_TIME;
//键盘扫描
void Key_Scan(void)
{
uint8 tmp=0;
#ifdef PRESS_KEY_LONGTIME_MESSAGE
KeyTimeBase++;
#endif
//非消抖时间键盘扫描,置建值
if (Press_Key_Time==-KEY_DEJITTER_TIME || Press_Key_Time>=0)
{
tmp = ~KEY_PORTX & KEY_CODE;
if (tmp==0)
{//无键按下
Press_Key_ID=0;
Press_Key_Time=-KEY_DEJITTER_TIME;
}
else
//有键按下
if (Press_Key_ID != tmp) //按键状态有改变
{
Press_Key_ID = tmp;
Press_Key_Time=-KEY_DEJITTER_TIME+1; //进入消抖期
}
//常有状态保持不变Press_Key_Time=0待取
}
// 消抖期键码不变 keytime++
else
Press_Key_Time++;
}
//获取键值,如果有返回键码或长按返回-1
uint8 Key_Get(void)
{
uint8 ret=0;
if (Press_Key_ID && Press_Key_Time>=0)
if (Press_Key_Time==0) //有待取按键
{
ret=Press_Key_ID;
Press_Key_Time++;
#ifdef PRESS_KEY_LONGTIME_MESSAGE
KeyTimeBase=0;
}
else //>0 有长按键
{
//每个消抖时间Press_Key_Time+1
if (KeyTimeBase >= KEY_DEJITTER_TIME)
{
KeyTimeBase=0;
Press_Key_Time++;
//长按
if ((Press_Key_Time & (PRESS_KEY_LONGTIME_VALUE-1)) ==0)
ret=Press_Key_ID|PRESS_KEY_LONGTIME_FLAG;
}
#endif
}
return ret;
}
详情
回复
发表于 2011-10-24 13:08
| ||
|
||
此帖出自51单片机论坛
| ||
|
||
回复 楼主 zhiwan 的帖子
此帖出自51单片机论坛
| ||
|
||
| |
|
|
EEWorld Datasheet 技术支持