您的位置 首页 传感器

凌阳61单片机之按键无延时消抖(选用状态机编程思维

无延时消抖在另一篇博文已经有详细的说明,这里不再赘述。在学习FPGA时,觉得状态机这种编程思想非常好,可以很充分地利用CPU的资源。大的

无延时消抖在另一篇博文已经有具体的阐明,这儿不再赘述。

在学习FPGA时,觉得状况机这种编程思维非常好,能够很充分地使用CPU的资源。
大的单片机工程,或许实时性较强的工程,选用状况机编程思维能够很好处理一些问题,例如:
键盘扫描,蜂鸣器报警,LED灯闪耀等等。
下面是小弟昨夜用状况机编程思维写的根据凌阳61单片机之下,按键无延时消抖程序。
程序的按键仍是有点小颤动,首要是因为主程序履行的使命少,跳入键盘扫描时间短。
现在才发现C里边的枚举类型能够用来干嘛、、、
放于状况机这块刚刚好。
#include “SPCE061A.H”
enum State {Init, Press, Free};
enum State Key_State; //按键状况
unsigned char Key_Press; //按键值
void Keyscan(void)
{
switch (Key_State)
{
case Init : // 按键初始态
if((*P_IOA_Data & 0x0007) != 0)
{
Key_State = Press; // 键被按下,但需求承认是否是搅扰
}
break;
case Press : // 按键承认态
if((*P_IOA_Data & 0x0007) != 0) //如有键按下则不是搅扰,判别键值
{
//判别是哪一个按键被按下
if( (*P_IOA_Data & 0x0001) != 0 ); //第一个键被按下
{
*P_IOB_Data = ~*P_IOB_Data;
}
if( (*P_IOA_Data & 0x0003) != 0 ); //第二个键被按下
{
*P_IOB_Data = ~*P_IOB_Data;
}
if( (*P_IOA_Data & 0x0007) != 0 ); //第三个键被按下
{
*P_IOB_Data = ~*P_IOB_Data;
}
Key_State = Free; // 状况转换到键开释态
}
else
{
Key_State = Init; // 按键已抬起,归于搅扰,转换到按键初始态
}
break;
case Free :
if((*P_IOA_Data & 0x0007) == 0) //判别按键是否开释
{
Key_State = Init; //假如按键开释,转换到按键初始态
}
break;
}
}
void Board_Init(void)
{
//设置A口为带下拉电阻的输入 IO初始化开端
*P_IOB_Dir=0xFFFF; //output
*P_IOB_Attrib=0xFFFF;
*P_IOB_Data=0xFFFF;
Key_Press = 1;
Key_State = 0;
}
int main()
{
Board_Init();
while(1)
{
Keyscan();
*P_Watchdog_Clear = C_WDTCLR;
}
return 0;
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/chuanganqi/261068.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部