在上一篇学习如何配置固件库后,我想试着写出一个让led灯闪烁的效果,最后成功啦,其实也只不过是学会了调用库函数,程序如下:
int main(void)
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOH, ENABLE);
LED_GPIO_Config();
while(1)
{
GPIO_ResetBits(GPIOH,LED_R_GPIO_PIN);
GPIO_SetBits(GPIOH,LED_E_GPIO_PIN);
GPIO_SetBits(GPIOH,LED_G_GPIO_PIN);
delay(0xffffff);
GPIO_ResetBits(GPIOH,LED_E_GPIO_PIN);
GPIO_SetBits(GPIOH,LED_R_GPIO_PIN);
GPIO_SetBits(GPIOH,LED_G_GPIO_PIN);
delay(0xffffff);
GPIO_ResetBits(GPIOH,LED_G_GPIO_PIN);
GPIO_SetBits(GPIOH,LED_E_GPIO_PIN);
GPIO_SetBits(GPIOH,LED_R_GPIO_PIN);
delay(0xffffff);
}
}
void LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = LED_R_GPIO_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStruct.GPIO_Speed = GPIO_Fast_Speed;
GPIO_Init(GPIOH, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = LED_E_GPIO_PIN;
GPIO_Init(GPIOH, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = LED_G_GPIO_PIN;
GPIO_Init(GPIOH, &GPIO_InitStruct);
}
void delay(int i)
{
for(;i>0;i--);
}
那么下一步,来实现按键检测吧!
按键机械触点断开、闭合时,由于触点的弹性作用,按键开关不会马上稳定接通或一下子断开,使用按键时会有前后抖动的情况,产生不稳定的信号,需要软件消抖处理滤波,不方便输入检测,也有带硬件消抖功能,它利用电容放电的延时,消除了波纹,从而简化软件的处理,软件只需要直接检测引脚的高低电平即可。
?
从按键的原理图可知,这些按键在没有被按下的时候,GPIO 引脚的输入状态为低电平 (按键所在的电路不通,引脚接地),当按键按下时,GPIO 引脚的输入状态为高电平(按键所 在的电路导通,引脚接到电源)。只要我们检测引脚的输入电平,即可判断按键是否被按下。
我们编写程序分为以下两个部分:
-
初始化GPIO——配置为输入(浮空输入) -
编写按键检测函数——软件查询方式
我想实现的是,它有两个按键,那么其中一个控制红灯的亮灭,另外一个实现绿灯的亮灭,具体函数如下:
#include "stm32f4xx.h"
#include "led.h"
#include "key.h"
#define KEY_ON 1
#define KEY_OFF 0
#define KEY1_GPIO GPIO_Pin_0
#define KEY1_GPIO_PORT GPIOA
#define KEY1_GPIO_CLK RCC_AHB1Periph_GPIOA
#define KEY2_GPIO GPIO_Pin_13
#define KEY2_GPIO_PORT GPIOC
#define KEY2_GPIO_CLK RCC_AHB1Periph_GPIOC
int main(void)
{
LED_GPIO_Config();
KEY_GPIO_Config();
GPIO_SetBits(GPIOH,LED_E_GPIO_PIN);
GPIO_SetBits(GPIOH,LED_R_GPIO_PIN);
while(1)
{
if(Key_scan(KEY1_GPIO_PORT, KEY1_GPIO) == KEY_ON)
{
LED_R_TOGGLE;
}
else if(Key_scan(KEY2_GPIO_PORT, KEY2_GPIO) == KEY_ON )
{
LED_E_TOGGLE;
}
}
}
//翻转函数
#define LED_R_TOGGLE {LED_R_GPIO_PORT->ODR ^= LED_R_GPIO_PIN;}
#define LED_E_TOGGLE {LED_E_GPIO_PORT->ODR ^= LED_E_GPIO_PIN;}
#define LED_G_TOGGLE {LED_G_GPIO_PORT->ODR ^= LED_G_GPIO_PIN;}
//按键初始化
void KEY_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHB1PeriphClockCmd(KEY1_GPIO_CLK, ENABLE);
GPIO_InitStruct.GPIO_Pin = KEY1_GPIO;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
//如果硬件上没有下拉电阻,则设置为下拉,如果有,则设置为浮空就可以了
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStruct);
RCC_AHB1PeriphClockCmd(KEY2_GPIO_CLK, ENABLE);
GPIO_InitStruct.GPIO_Pin = KEY2_GPIO;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
//如果硬件上没有下拉电阻,则设置为下拉,如果有,则设置为浮空就可以了
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStruct);
}
//按键检测
uint8_t Key_scan(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin)
{
if(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin)==KEY_ON)
{
while(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin)==KEY_ON);
return KEY_ON;
}
else
return KEY_OFF;
}
?那么,今天的学习就到这吧,复习教资了T T....
|