单片机按键检测,状态机编写


#include <stdio.h>
#include <cms.h>

#define KEY1		RB5;
#define key_state_0    0   
#define key_state_1    1
#define key_state_2    2
int Key_Number = 0;


unsigned char read_key(void)
{
    
    
  static char    key_state = 0; //按键的状态
  
  unsigned char   key_press; //按键是否被按下
  
  unsigned char   key_return = 0; //按键返回值
  
  key_press = KEY1;  //读取按键值
  
  switch (key_state)
  {
    
    
  //按键初始态
  case key_state_0: 
		if (key_press)
			key_state = key_state_1;// 按键被按下,状态转换到按键确认态1
				break;
  //按键确认态
  case key_state_1: 
	if (key_press)
		{
    
      
			key_return = 1;// 按键仍按下,按键确认输出为“1”
			key_state = key_state_2;// 状态转换到按键释放态
		}
	else
		key_state = key_state_0; // 按键已抬起,转换到按键初始态
			break;
			
  case key_state_2:
		if (!key_press)
			key_state = key_state_0;//按键已释放,转换到按键初始
				break;

  }
  return key_return;

}


//main调用
int main()
{
    
    
	while(1)
	{
    
    
	Key_Number=read_key();
	Delay_nms(10);
	if(Key_Number==1)
	{
    
    
		wonf = 1;//执行操作
	}  
	else
	{
    
    
		wonf = 0;//执行操作
	}

}


}

uchar key_flag = 0;                             //首先定义按键的标志位,并初始化为0
void key_scan()                                 //按键扫描函数
{
    
    
    if((KEY1 == 1) && (!key_flag))                //如果有键按下,则条件成立(有键按下,则s4为0;而 !key_flag为1)
    {
    
    
        Delay_nms(10);                            //延时消抖
        key_flag = 1;                           //把标志位置为1
        if(KEY1 == 1)                             //如果确定有键按下
        {
    
                          
            wonf=1;                        //进行事件处理
        }
    }
    else if(KEY1 == 0)                            //未按下按键
    {
    
    
        key_flag = 0;
    }
}

猜你喜欢

转载自blog.csdn.net/ABCisCOOL/article/details/109054305