单片机基础学-按键篇

这篇博客介绍了作者在学习单片机过程中对按键检测的总结,使用状态转移思想和定时器实现独立按键的单击、连击、长击检测。通过定义数据结构KeyData和状态机,实现了按键的各种功能,并提供了程序代码示例。
摘要由CSDN通过智能技术生成

其实我现在也是一个菜鸟,但是这是我学习的过程中的总结,我想写出来,可能对初学者有用,在此献丑了。

按键总结篇

                                                 作者: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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值