stm32按键控制灯闪烁

1、长按KEY_UP实现红绿LED交替闪烁5次,中间间隔时间500ms;
2、单击KEY0控制红色LED闪烁,双击KEY0控制绿色LED闪烁,单击KEY_UP停止闪烁。

u8  KeyUp_flag=0;  //0,没有按下,1,按下,加号键
u8  KeyUpLong_flag=0;  //0,没有按下,1,按下,加号键
u16  Up_status=0; //加号键按下状态
u16  Up_counter =0; //加号键,短时间累加
u8   Up_mcounter =0; //加号键,长时间累加

/*按键扫描*/
void  Key_UP_Scan(void)
{
    /******************KEY UP 按下*******************/
    if(Key_up ==0))//UP
    {
        if(Up_status==0)
        {
            Up_counter++;        
            if(Up_counter ==20)//短按
            {
                if(Key_up ==0)
                {Up_counter =0;KeyUp_flag =1;Up_status=1;}    
            }        
        }
        if(Up_status==1)
        {
            Up_mcounter++;    //长久按下则一直运行
            if(Up_mcounter ==150)
            {
                if(Key_up ==0)
                {Up_mcounter =100;KeyUpLong_flag =1;}
            }
        }
    }

    /******************KEY UP 抬起*******************/
    if(Key_up ==1)//UP
    {
        if(Up_status==1)
        {
            Up_counter++;
            if(Up_counter ==10)
            {
                if(Key_up !=0)
                {
                    Up_counter =0;
                    KeyUp_flag =0;
                    KeyUpLong_flag =0;
                    Up_status=0;
                }
            }    
        } 
    }

    /******************KEY UP 抬起*******************/
}

u8    Key0_Flag1 =0;
u8    Key0_Flag2 =0;
u8    Key0_num =0;
u16   Key0_num_Cnt =0;
u16  Key0_status=0; //加号键按下状态
u16  Key0_counter =0; //加号键,短时间累加
/*按键扫描*/
void  Key0_Scan(void)
{
    /******************KEY0按下*******************/
    if(Key_up ==0))//UP
    {
        if(Up_status==0)//短按
        {
            Up_counter++;        
            if(Up_counter ==10)//短按
            {
                if(Key_up ==0)
                {
                    Up_counter =0;
                    KeyUp_flag =1;
                    Up_status=1;
                    Key0_Flag1 =1;
                    Key0_num++;
                }    
            }        
        }
    }

    /******************KEY0 抬起*******************/
    if(Key_up ==1)//UP
    {
        if(Up_status==1)
        {
            Up_counter++;
            if(Up_counter ==10)
            {
                if(Key_up !=0)
                {
                    Up_counter =0;
                    KeyUp_flag =0;
                    Up_status=0;Up_mcounter =0;
                }
            }    
        } 
    }

    /******************KEY1.5秒按两次*******************/
    if(Key0_num ==1)Key0_num_Cnt;
    if(Key0_num ==2&&Key0_num_Cnt<150)
    {
        Key0_num =0;
        Key0_num_Cnt =0;
        Key0_Flag2 =1;
    }
    
}




u16  LED_Cnt;

//定时器定时10MS
void TIM3_IRQHandler(void)
{   
    if(TIM3->STS&0X0001)
    {
        Key_UP_Scan();
        Key0_Scan();
        LED_Blink();
    }
    TIM3->STS &= ~(1<<0);//清除中断标志
}

 u8 LED_Blink_FLAG =0;
void  LED_Blink(void)
{
    //长按KEY_UP实现红绿LED交替闪烁5if(KeyUpLong_flag ==1)
    {            
        //交替5次就是2500MS
        LED_Cnt++;if(LED_Cnt>=250)//2500MS
        {
            LED_Cnt =0;
            KeyUpLong_flag =0;
        }
        else
        {
            if((LED_Cnt%500)=0)//500MS标志位翻转
            {
                if(LED_Blink_FLAG==0) LED_Blink_FLAG =1;
                else  LED_Blink_FLAG =0;
            }
        }

        //500M交替一次
        if(LED_Blink_FLAG==0)
        {            
            LED_RED =0;
            LED_GREEN =1;
            
        }
        else
        {
            LED_RED =1;
            LED_GREEN =0;
        }            
    }

    //单击KEY_UP停止闪烁
    if(KeyUp_flag ==1)
    {
    KeyUpLong_flag =0;
        KeyUp_flag =0;
        Key0_Flag1 =0;
        Key0_Flag2 =0;
        LED_RED =0;
        LED_GREEN =0;
    }
    
    //单击KEY0控制红色LED闪烁
    if(Key0_Flag1 ==1)
    {
        LED_RED = !LED_RED;
    }
    //双击KEY0控制绿色LED闪烁
    if(Key0_Flag2 ==1)
    {
        LED_GREEN = !LED_GREEN;
    }
}