stm32学习笔记——按键(扫描法)

stm32学习笔记——按键(扫描法)

目的:利用扫描IO口的方式直接操作按键

 

配置文件:#include "stm32f10x_gpio.h" 

  #include "stm32f10x_rcc.h" 

 

寄存器、结构体定义以及库函数参看流水灯一节

 

程序代码分析:(代码出自FIRE

Led.c文件再次不在叙述,参看流水灯一节

重点分析key.c文件,其基本结构如下:

 

1、按键io口初始化,这里有两个按键key1key2,初始化过程完全相同

 

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,传入参数为无符号32int型变量

你可能感兴趣的:(STM32学习笔记)