其实我现在也是一个菜鸟,但是这是我学习的过程中的总结,我想写出来,可能对初学者有用,在此献丑了。
按键总结篇
作者:HouZuping
在所有智能产品中,按键是最为常用的,所以按键程序的好坏很重要。以前我们在学校里学的按键检测方法都是不适用,很浪费时间,减少了CPU的效率。在大家的不断努力下,基本上编程都是用状态转移思想。用状态机思想编的按键检测程序也很多,像一些高手就写过很好的按键检测程序,下面我总结了用一个定时器的独立按键检测,能检测单击,连击,长击等。这个按键检测程序中包含了状态转移思想,时间片段思想,对象编程。
关于按键流程图我就不说了,这个大家都清楚。首先对按键进行一个数据结构定义。
struct KeyData
{
unsigned char KeyValue; //按键返回值
unsigned char LongClickFlag; //长击标志
unsigned char RunClickFlag; //连击标志
unsigned char JudgeRunFlag; //软定时器的连击标志
unsigned int RunCount; //连击间隔时间计数
};
//按键常量的定义 ,根据具体的时钟来跟改
#define KeyLongTime_2s 100 // 1/Fcy*timerValue*1000
#define KeyRunClick_500Ms 40 //连击间隔时间大约是500ms左右
这个数据结构是把按键当成一个对象,这样每次按键按下后都会有一个返回值,其他标志都是按键需要其他功能功能。不管有几个独立按键,每个按键返回值都不同。需要几个按键时,就定义几个按键关键字。
//------------接口区
#define KeyOne P1_0
#define KeyTwo P1_1
//----------初始状态
#define IdleState 1
这里我只用了两个按键,其实本按键最为不好的地方就是按键检测和读取按键的值,每次移植时都需要修改,这里还需要修改,在读取按键值时,我可以采用关键字固定,是来确定按键返回值固定这种方式,但是我觉得没有必要,移植时就改吧,有的单片机直接支持位操作,有的不支持。
//****************************************************************
//键盘扫描接口部分,移植时需要修改
//****************************************************************
unsigned char KeySwap()
{
if((KeyOne!=IdleState)||(KeyTwo!=IdleState))//按键数目判断状态,这里是位变量
return 1;
else
return 0;
}
//***************************************************************
//读取接口值函数,移植时需要修改
//********************************************************************
unsigned char RdKeyValue()
{
if(KeyOne!=IdleState)
return 0x02;
if(KeyTwo!=IdleState)