muyoumin 发表于 2013-8-20 09:21:51

51状态机实现单路控制输出

新手,第一次发贴。在写这段代码之前,本来给改同事写的代码,看到那代码就不想去读.所以重新写得.一个按键控制一路输出,固定频率固定占空比。
代码写得不好请大侠们,手下留情.
按键代码,按键释放后处理状态
if( f_Key_OnTimer )
        {
                Key_Tick++;
                if ( Key_Tick>MS(100) )
                {
                        Key_Tick = 0;
                        f_Key_OnTimer= false;
                        f_Key_Update = true;
                }
                return;
        }
        //
        if ( KEY==KEY_PRESS )
        {               
                f_Key_OnTimer = true;
        }
        else
        {
                Key_Tick = 0;
                f_Key_OnTimer = false;
        }
        //
        if ( f_Key_Update==true )
        {
                f_Key_Press = true;
        }
        if ( f_Key_Press==false )
        {
                return;       
        }       
        //
        if ( KEY==KEY_RELEASE )
        {
                f_Key_Update= false;
                f_Key_Press = false;
                f_Key_Release = true;       
        }
        if ( f_Key_Release==true )
        {               
                f_Key_Release = false;
                //
                f_State =! f_State;
                Timer.Tick= 0;
                Timer.Sec = 0;
                Timer.Min = SET_TIMER;
                VIBRA = 1;
        }
输出部分代码:表格内定义频率到周期时间
SIZE_BIT code Freq_to_hex=
{
        0,       
        FREQ(1),        FREQ(2),        FREQ(3),        FREQ(4),        FREQ(5),
        FREQ(6),        FREQ(7),        FREQ(8),        FREQ(9),        FREQ(10),
        FREQ(11)
};

void Init_Vibra(void)
{
        Vibra.Period = Freq_to_hex;
        Vibra.Witch = Vibra.Period>>1;
}

void Vibra_Event(void)       
{       
        if ( f_State==false )
        {
                return;
        }
        Vibra.Tick++;
        if ( Vibra.Tick>=Vibra.Period )
        {
               Vibra.Tick = 0;                                      
        }               
        else
        if ( Vibra.Tick>Vibra.Witch )
        {               
                VIBRA = 0;                                               
        }
        else
        {       
                VIBRA = 1;                                                       
        }               
}
主循环:定时器中断一次,处理一次主循环内的任务
void main(void)
{
        Init_Key();
        Init_Vibra();
        Init_HardWare();
        for(;;)
        {
                SLEEP();
                if ( f_Timer_Ovf )
                {
                        f_Timer_Ovf = false;
                        //
                        Timer_DoEvent();
                        Vibra_DoEvent();
                        Key_DoEvent();
                }
        }
}
页: [1]
查看完整版本: 51状态机实现单路控制输出