目的:利用扫描IO口的方式直接操作按键
配置文件:#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
寄存器、结构体定义以及库函数参看流水灯一节
程序代码分析:(代码出自FIRE)
Led.c文件再次不在叙述,参看流水灯一节
重点分析key.c文件,其基本结构如下:
1、按键io口初始化,这里有两个按键key1和key2,初始化过程完全相同
void Key1_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO初始化结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开GPIO时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //选中IO口标号
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; //配置IO口速度
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure);//利用初始化库函数初始化GPIO
}
2、扫描按键
uint8_t Key_Scan(GPIO_TypeDef* GPIOx,u16 GPIO_Pin)//该函数将返回一个unsigned char型变量,输入参数为GPIO寄存器结构体(字母),和GPIO端口号(数字)
{
if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON ); //利用单个位读取函数读取按键的值
{
Key_Delay(10000); //延时,消抖
if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON ) //再次确认按键按下
{
while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON);//等待按键释放
return KEY_ON;
}
else
return KEY_OFF;
}
else
return KEY_OFF;
}
其中有两个宏定义
#define KEY_ON 0
#define KEY_OFF 1
3、按键按下后的执行函数:按键按下后需要执行相应的操作,所以要列写此函数
void Key_Test(void)
{
LED_GPIO_Config();
LED1_ON;
LED2_ON;
/*config key*/
Key1_GPIO_Config();//调用按键GPIO初始化函数
Key2_GPIO_Config();
while(1)
{
if( Key_Scan(GPIOA,GPIO_Pin_0) == KEY_ON ) // KEY1
{
LED1_TOGGLE;
}
if( Key_Scan(GPIOC,GPIO_Pin_13) == KEY_ON ) // KEY2
{
LED2_TOGGLE;
}
}
}
其中操作LED灯的几个函数参看流水灯一节
小总结:1、在写key.c文件时,除了包含自己的key.h文件,还要包含led.h文件才能调用 流水灯函数。
2、主函数还要包含上述两个头文件
3、延时函数
static void Key_Delay(__IO u32 nCount)
{
for(; nCount != 0; nCount--);
}
注意函数中static 和__IO的宏定义为volatile,传入参数为无符号32位int型变量