|
发表于 2008-6-5 23:19:48
|
显示全部楼层
1、该段程序是4*4键盘扫描程序, 功能比较全, 根据实际情况可在次基础上进行修改;
2、已调试通过,但没有优化;
/*********************************************************************
文件:scankey.c
用途:通用4*4按键接口驱动程序
注意:
创建:2008.5.15
修改:2008.5.15
设计:raosibin
版本:ver1.3
功能说明:每隔10MS调用一次 ,实现了组合按键功能;连_发功能
**********************************************************************/
#include "..\config.h"
/*********************************************************************
COL0 COL1 COL2 COL3
* ROW4 0 1 2 3
* ROW5 4 5 6 7
* ROW6 8 9 A B
* ROW7 C D E F
*
* 普通按键:
* 2~E:数字按键
*
* 连_发按键:
* 0:
* 1:
*
* 组合按键
* F : 引导键
* F+0:
* F+1:
* 状态机思路
* F为组合引导键
* 每10MS扫描一次键盘
* 状态0:检测是否有键按下;
* 状态1:消抖处理
* 状态2:确认按键,同状态1比较,除F引导键外相同则返回键值,
* F引导键未按下转状态3;F引导键按下转状态5;
* 状态3:计数1,(按3S,连_发判断);
* 状态4:计数2,连_发功能
* 状态5:500MS内检测是否有F引导键+其他键按下;有转状态6,没有转状态8
* 状态6:消抖处理
* 状态7:同状态6比较,确认组合按键,返回组合键值,转状态3
* 状态8:消抖处理
* 状态9:先导键为单按键,返键值,转状态3.
**********************************************************************/
//按键初始化
void key_board_int1( void )
{
KEY_DDR_ROW |= KEY_ROW_ALL; //行输出,
KEY_PORT_ROW &= ~ KEY_ROW_ALL;
KEY_DDR_COL &= ~ KEY_COL_ALL; //列输入,并使能内部上拉
KEY_PORT_COL |= KEY_COL_ALL;
}
void key_board_int2( void ) //翻转初始化
{
KEY_DDR_ROW &= ~ KEY_ROW_ALL; //行输入,并使能内部上拉
KEY_PORT_ROW |= KEY_ROW_ALL;
KEY_DDR_COL |= KEY_COL_ALL; //列输出;
KEY_PORT_COL &= ~ KEY_COL_ALL;
}
unsigned char key_board_scan( void )
{
unsigned key_value_buf;
key_board_int1();
KEY_PORT_ROW &= ~ KEY_ROW_ALL; // 必须送2次!!!
key_value_buf = ( ~KEY_ROW_ALL ) & KEY_PIN_COL; // 读列电平
key_board_int2(); // 翻转扫描
KEY_PORT_COL &= ~ KEY_COL_ALL;
key_value_buf |= ( ~KEY_COL_ALL ) & KEY_PIN_ROW; // 读行电平,并同翻转前的结果或
return key_value_buf;
}
uchar read_keypad( void )
{//10ms 读一次
static uchar preKey = 0, curKey, keytimes = 0;
uchar keyCode = noKey;
curKey = key_board_scan();
if ( curKey != noKey )
{ //可能有键按下
if ( preKey == curKey )
{ //同一按键消抖
keytimes++;
if ( ( keytimes % 5 ) == 0 )
{ //50ms 短按或加速键 时间自已把握
// keyCode = shortpush|preKey;
}
/* if ( keytimes > 100 )
{
keytimes = ( 101 ); //锁定 长按
// keyCode = longpush|preKey;
//keyCode =
}*/
return keycode;
}
else if ( preKey != curKey )
{ //不同按键按下
{
keytimes = 0;
preKey = curKey;
}
}
}
else
{ //键已释放,或无键按下
keytimes = 0;
return keyCode;
}
}
/*
实现短按键 长按键或加速键
能不能实现长按与加速功能呢
*/ |
|