程序特色:
{
printf(“我按下了A”);
}
* 版别………: 3.5
* 作者………: 陈利栋
* 方针………: AVR
* 文件名…….: Keypad.h
* 编译器…….: IAR for AVR V5.5
* 创立时刻…..: 2010.09.12
* 最终修正…..: 2010.10.09
*****************************************/
#ifndef __KEYPAD_H__
#define __KEYPAD_H__
#include
#include “delay.h”
#define KEYPAD_PORT PORTC
#define KEYPAD_DDR DDRC
#define KEYPAD_PIN PINC
/* 以下3个值依据实际情况调整 */
#define KEY_READY_COUNT 2000// 检测按键安稳继续的次数
#define KEY_CONTINUE_START_COUNT 40000// 检测接连按键开端需求的次数
#define KEY_CONTINUE_RUNNING_COUNT 3000// 接连按键距离检测次数
#define KEY_NULL 0xff
inlinevoidNullFunction(void){}// 空函数
#define NULL_FUNC NullFunction// 空函数宏界说
#define NULL_FUNC2 ((void(*)(unsigned char))NULL_FUNC)
// 矩阵键盘函数指针声明(一个按键一个指针)
externvoid(*p_Key_1)(void);
externvoid(*p_Key_2)(void);
externvoid(*p_Key_3)(void);
externvoid(*p_Key_4)(void);
externvoid(*p_Key_5)(void);
externvoid(*p_Key_6)(void);
externvoid(*p_Key_7)(void);
externvoid(*p_Key_8)(void);
externvoid(*p_Key_9)(void);
externvoid(*p_Key_0)(void);
externvoid(*p_Key_A)(void);
externvoid(*p_Key_B)(void);
externvoid(*p_Key_C)(void);
externvoid(*p_Key_D)(void);
externvoid(*p_Key_Xing)(void);// 星号键
externvoid(*p_Key_Jin)(void);// 井号键
externvoid(*p_Key_A_B)(void);// A+B的组合键
// 恣意按键按下或弹起的函数指针声明(参数为按键值的ascii字符)
externvoid(*p_Key_Down)(unsignedcharc);
externvoid(*p_Key_Up)(unsignedcharc);
// 接连按键的符号
externvolatileunsignedcharkey_continue_flag;
// 在主循环中调用此函数
externvoidKeypadPoll(void);
#endif/* __KEYPAD_H__ */
* 版别………: 3.5
* 作者………: 陈利栋
* 方针………: AVR
* 文件名…….: Keypad.c
* 编译器…….: IAR for AVR V5.5
* 创立时刻…..: 2010.09.12
* 最终修正…..: 2010.10.09
*****************************************/
#include “Keypad.h”
volatileunsignedcharkey_continue_flag=0;
staticvolatileunsignedchar_key_last=KEY_NULL;
staticvolatileunsignedint_key_count=0;
staticvolatileunsignedint_key_continue_count=0;
// 矩阵键盘函数指针(一个按键一个指针)
void(*p_Key_1)(void)=NULL_FUNC;
void(*p_Key_2)(void)=NULL_FUNC;
void(*p_Key_3)(void)=NULL_FUNC;
void(*p_Key_4)(void)=NULL_FUNC;
void(*p_Key_5)(void)=NULL_FUNC;
void(*p_Key_6)(void)=NULL_FUNC;
void(*p_Key_7)(void)=NULL_FUNC;
void(*p_Key_8)(void)=NULL_FUNC;
void(*p_Key_9)(void)=NULL_FUNC;
void(*p_Key_0)(void)=NULL_FUNC;
void(*p_Key_A)(void)=NULL_FUNC;
void(*p_Key_B)(void)=NULL_FUNC;
void(*p_Key_C)(void)=NULL_FUNC;
void(*p_Key_D)(void)=NULL_FUNC;
void(*p_Key_Xing)(void)=NULL_FUNC;// 星号键
void(*p_Key_Jin)(void)=NULL_FUNC;// 井号键
void(*p_Key_A_B)(void)=NULL_FUNC;// A+B的组合键
// 恣意按键按下或弹起的函数指针(参数为按键值的ascii字符)
void(*p_Key_Down)(unsignedcharc)=NULL_FUNC2;
void(*p_Key_Up)(unsignedcharc)=NULL_FUNC2;
staticunsignedchar_hex_to_ascii(unsignedcharh)
{
switch(h)
{
case0xEB:return0;
case0x77:return1;
case0x7B:return2;
case0x7D:return3;
case0xB7:return4;
case0xBB:return5;
case0xBD:return6;
case0xD7:return7;
case0xDB:return8;
case0xDD:return9;
case0x7E:returnA;
case0xBE:returnB;
case0xDE:returnC;
case0xEE:returnD;
case0xE7:return*;
case0xED:return#;
default:return ;
}
}
// 内部函数
staticinlineunsignedchar_keypad_scan(void)
{
staticunsignedchartemp=0;
KEYPAD_DDR=0x0f;
KEYPAD_PORT=0xf0;
_delay_us(5);
temp=KEYPAD_PIN;
KEYPAD_DDR=0xf0;
KEYPAD_PORT=0x0f;
_delay_us(5);
temp|=KEYPAD_PIN;
if(temp!=_key_last)
{
_key_count++;
if(_key_count>=KEY_READY_COUNT)
{
if(temp==KEY_NULL)
{
p_Key_Up(_hex_to_ascii(_key_last));
}
_key_last=temp;
_key_count=0;
return_key_last;
}
key_continue_flag=0;
_key_continue_count=0;
}
else
{
_key_count=0;
if(_key_last!=KEY_NULL)
{
_key_continue_count++;
if(key_continue_flag==0)
{
if(_key_continue_count>=KEY_CONTINUE_START_COUNT)
{
key_continue_flag=1;
_key_continue_count=0;
return_key_last;
}
}
else
{
if(_key_continue_count>=KEY_CONTINUE_RUNNING_COUNT)
{
_key_continue_count=0;
return_key_last;
}
}
}
}
returnKEY_NULL;
}
// 在主循环中调用此函数
voidKeypadPoll(void)
{
staticunsignedchartemp=0;
temp=_keypad_scan();
if(temp==KEY_NULL)
{
return;
}
p_Key_Down(_hex_to_ascii(temp));
switch(temp)
{
caseKEY_NULL:break;
case0xEB:p_Key_0();break;
case0x77:p_Key_1();break;
case0x7B:p_Key_2();break;
case0x7D:p_Key_3();break;
case0xB7:p_Key_4();break;
case0xBB:p_Key_5();break;
case0xBD:p_Key_6();break;
case0xD7:p_Key_7();break;
case0xDB:p_Key_8();break;
case0xDD:p_Key_9();break;
case0x7E:p_Key_A();break;
case0xBE:p_Key_B();break;
case0xDE:p_Key_C();break;
case0xEE:p_Key_D();break;
case0xE7:p_Key_Xing();break;// *
case0xED:p_Key_Jin();break;// #
case0x3E:p_Key_A_B();break;// A + B 组合键
// 此处增加其它组合键
default:break;
}
}