/*
名称:STM32_GPIO之按键输入
说明:这个实验是GPIO的输入功能。基本的思路和51单片机差不多。也是
操作相应的IO口,不过不同的是对于独立按键输入实验来说,51单片机是
需要一开始把待检测的IO口设置成高电平,然后检测其何时被拉低。而对
于STM32来说,其GPIO端口就可以设置成上拉输入,即不需要再人为的把对
应的对应的IO口设置成高电平,硬件电路会自动把对应端口引脚拉成高电
平。
还有一点关于条件编译要说的:这个ifndef… #endif 一般用在头文件中。书上说为了防止重复编译。就我目前了解的来看,在实际应用中,如果在两个.c源文件中都include了一个头文件,那么好像加不加这个条件编译都没什么影响(如果没有定义什么特殊的东西的话)。 但是,最好不要在头文件中定义变量(如int i);因为这样的话,如果两个.c源文件的都include了这个头文件,那么就会在链接时(注意是链接不是编译时)发生重复定义的错误。(好像是因为声明可以多次,但定义只能一次。)所以通常的做法是在.c源文件中定义变量,然后在对应的头文件中利用外部声明(即类似于extern int i;) 进行使用。
*/
#include "key.h"
//KEY端口配置
void KEY_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin = ALLKEY;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(KEY_PORT, &GPIO_InitStructure);
}
//声明延时函数
void delay_ms(u16 time);
//检查独立按键
int CheakKey()
{
uint16_t key = 1;
int i = 0;
for(i = 1;i <= 8;++i)
{
//软件消抖
if(GPIO_ReadInputDataBit(KEY_PORT,key) == Bit_RESET)
{
delay_ms(10);
if(GPIO_ReadInputDataBit(KEY_PORT,key) == Bit_RESET)
return i;
}
key = key<<1; //左移一位
}
//if( i > 8)
return -1;
}
上一篇:STM32之SPI串行线与HC595使用
下一篇:STM32_GPIO之点亮LED实验
推荐阅读最新更新时间:2024-03-16 16:09