首页 > 代码库 > 外设实战之KEY(查询方式)

外设实战之KEY(查询方式)

2014-6-5

外设实战之KEY(查询方式)


之前已经能驱动LED,这只是用到GPIO的输出功能,接下来要用到GPIO的输入功能。把输入IO连到KEY上。

两个按键,KEY1和KEY2,定义按下KEY1让LED1亮,弹起让LED1灭。按下KEY2让LED2亮,弹起让LED2灭。

虽然查询方式会降低系统的效率,但很多场合还是少不了查询方式,初期先用查询验证代码逻辑,后面会改成中断方式来完善。


接下来是实战步骤:


一、查看电路原理图:

       两个按键,KEY1对应的是PF6,按下时为低电平。KEY2对应的是PF7,按下时为低电平。


二、开始编写代码,需要复用之前LED部分代码。

 注意在KEY文件中添加包含头文件:

#include "stm32f0xx.h"

下面一些宏和库函数都在stm32f0xx.h文件中有声明

1.初始化KEYS对应的IO外设时钟:

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOF, ENABLE);

2.初始化KEYS对应的IO管脚:

    GPIO_InitTypeDef GPIO_InitStruct;


    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOF, ENABLE);
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_6 ;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_Level_2;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOF, &GPIO_InitStruct);
    

    GPIO_SetBits(GPIOF, GPIO_Pin_7| GPIO_Pin_6 );

3.查询方式读取KEYS的电平

    GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_6);

    GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_7);

4.测试效果:

在main函数中:

int main(void)
{
    LEDS_Init();
    KEYS_Init();
    
    LED1_ON();
    LED2_ON();
    Delay(1000);        

    LED1_OFF();
    LED2_OFF();

    while(1){
        if(0 == GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_6)){
            LED1_ON();
        }else{
            LED1_OFF();
        }
        
        if(0 == GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_7)){
            LED2_ON();
        }else{
            LED2_OFF();
        }        
    }
}

编译并下载运行,可以看到两个灯先亮了大约1S,用来表示程序已经正常工作。灯灭了后,进入死循环,读取KEY1和KEY2的电平,为低电平说明在按下状态,为高电平说明在弹起状态。虽然效果演示还不错,但没有做去抖动,在实际产品中是不能用的,在后面加上串口的打印信息就会很清楚的看到这一点,去抖动,软件上用到的是延时方法,可以是软件延时,也可以用定时器做延时。以后加了定时器再完善,这里只是验证最基本的逻辑是不是通的。