STM32F0 按键程序

发布者:Yuexiang888最新更新时间:2019-08-19 来源: eefocus关键字:STM32F0  按键程序  IO口配置 手机看文章 扫描二维码
随时随地手机看文章

#define     HAVEKEY_PIN    0x0003            //

#define     KEYPOP                0x0000


#define        KEY_START_PRESSED            1            //


typedef struct 

{

    INT8U     bLastValue;                          //

    INT8U     bDebunceTime;                        //

    INT8U     bPressed;                                //

    INT8U     bValue;                                    //

    INT8U     bState;                                    //    

} tKEY;

 


1. 按键IO口配置


void KEY_Init(void)

{

    

        GPIO_InitTypeDef GPIO_InitStruct;

        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_KEY_PORT, ENABLE);

        GPIO_InitStruct.GPIO_Pin = PAUSE_KEY_PIN | CLEAR_KEY_PIN ;//| ENTER_KEY_PIN | SET_KEY_PIN ;

        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;  //GPIO_Mode_AF,GPIO_Mode_OUT

        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_Level_2;

        GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;

        GPIO_Init(GPIO_KEY_PORT, &GPIO_InitStruct);

    

        memset(    &KeyCtrl,0,sizeof(tKEY));

}


2. 按键debunce时间,在timer里调用


void    KeyCtrlbDebunceTimeDec(void)

{

        if(KeyCtrl.bDebunceTime)

        {

                KeyCtrl.bDebunceTime--;

        }

        else

        {

                KeyCtrl.bDebunceTime = 20;

        }

}


3. 扫描按键


INT8U    KeyScan(u8  *bKeyValue)

{

        int TempKeyIn;

        TempKeyIn = GPIO_ReadInputData(GPIO_KEY_PORT);

    

        TempKeyIn = GPIO_ReadInputData(GPIO_KEY_PORT) & HAVEKEY_PIN;    //get high 8 bit

        TempKeyIn = (TempKeyIn ^ 0xffff) & HAVEKEY_PIN;

        if(TempKeyIn == 0x0000)                                                                     //no key pressed

        {

                memset(    &KeyCtrl,0,sizeof(tKEY));        

                return NOKEY_PRESSED;        

        }

        else

        {

                if(KeyCtrl.bState != KEY_START_PRESSED)        //start key pressed

                {

                    KeyCtrl.bState = KEY_START_PRESSED;

                    KeyCtrl.bDebunceTime = 20;                            //10ms

                    return     NOKEY_PRESSED;

                }

                else

                {

                    if(TempKeyIn == KeyCtrl.bLastValue)        //lastkey

                    {

                        return     NOKEY_PRESSED;

                    }

                    else

                    {

                        if(KeyCtrl.bDebunceTime !=0)                //debunce time? 10ms

                        {

                            return     NOKEY_PRESSED;

                        }

                        else

                        {

                                KeyCtrl.bLastValue = TempKeyIn;

                                KeyCtrl.bValue = TempKeyIn;

                                *bKeyValue = TempKeyIn;

                                return  KEY_PRESSED;

                        }

                    }

                }

        }

}

4. 按键处理


void    KeyPro(void)

{

    u8    KeyValue;

    if(KeyScan(&KeyValue) == KEY_PRESSED)

    {

            if(KeyValue == CLEAR_KEY)

            {

                ExtiCnt = 0;

            }

            else if(KeyValue == PAUSE_KEY)

            {

                    PauseFlag = ~PauseFlag;

            }

    }

}


关键字:STM32F0  按键程序  IO口配置 引用地址:STM32F0 按键程序

上一篇:STM32串口通信——16进制数形式
下一篇:STM32矩阵键盘4*4扫描程序(无延时消抖,测试稳定)

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved