2014-6-5
之前已经能驱动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的电平,为低电平说明在按下状态,为高电平说明在弹起状态。虽然效果演示还不错,但没有做去抖动,在实际产品中是不能用的,在后面加上串口的打印信息就会很清楚的看到这一点,去抖动,软件上用到的是延时方法,可以是软件延时,也可以用定时器做延时。以后加了定时器再完善,这里只是验证最基本的逻辑是不是通的。
外设实战之KEY(查询方式)