微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 凌阳61单片机之按键无延时消抖(采用状态机编程思想

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

时间:11-23 来源:互联网 点击:
无延时消抖在另一篇博文已经有详细的说明,这里不再赘述。

在学习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;

}


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top