• 按键检测GPIO输入


    1. 项目

      通过按键控制开关LED灯,按下按键灯亮,再按一下灯灭。

    2. 代码

      mian.c

      

    #include "stm32f10x.h"			//相当于51单片机中的 	#include <reg51.h>
    #include "bsp_key.h"
    #include "bsp_led.h"
    
    void Delay(uint32_t count)
    {
    	for(; count!=0; count--);
    }
    
    int main(void)
    {
    	//来到这里是,系统的时钟已经被配置到72MHz了
    	LED_GPIO_Config();
    	KEY_GPIO_Config();	//初始化KEY函数
    	while(1)
    	{		
    			if(Key_Scan(KEY2_GPIO_PORT, KEY2_GPIO_PIN) == KEY_ON)
    			{
    				LED_R_TOGGLE;
    			}
    	}
    
    }
    

      bsp_key.c

      

    #include "bsp_key.h"
    void KEY_GPIO_Config(void)
    {
    	GPIO_InitTypeDef GPIO_InitStruct;
    
    	RCC_APB2PeriphClockCmd(KEY2_GPIO_CLK, ENABLE);
    	GPIO_InitStruct.GPIO_Pin = KEY2_GPIO_PIN;
    	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    
    	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;
    }
    

      bsp_key.h

      

    #ifndef __bsp_key_h
    #define __bsp_key_h
    
    #include "stm32f10x.h"
    
    #define KEY_ON				1
    #define KEY_OFF				0
    
    #define KEY2_GPIO_PIN						GPIO_Pin_13
    #define KEY2_GPIO_PORT					GPIOC
    #define KEY2_GPIO_CLK						RCC_APB2Periph_GPIOC
    
    void KEY_GPIO_Config(void);
    uint8_t Key_Scan(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
    #endif/*__bsp_key_h*/
    

      bsp_led.c

      

    #include "bsp_led.h"
    
    void LED_GPIO_Config(void)
    {
    	GPIO_InitTypeDef GPIO_InitStruct;
    	
    	
    	RCC_APB2PeriphClockCmd(LED_R_GPIO_CLK, ENABLE);
    	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_InitStruct.GPIO_Pin = LED_R_GPIO_PIN; 	
    	GPIO_Init(LED_R_GPIO_PORT, &GPIO_InitStruct);
    }
    

      bsp_led.h

      

    //头文件
    #ifndef __bsp_led_h
    #define __bsp_led_h
    
    #include "stm32f10x.h"
    #define LED_R_GPIO_PIN						GPIO_Pin_5
    #define LED_R_GPIO_PORT						GPIOB
    #define LED_R_GPIO_CLK						RCC_APB2Periph_GPIOB
    
    
    #define ON		1
    #define OFF		0
    
    //	C语言续行符,后面不能有任何东西
    										
    #define LED_R(a);		if (a)	
    														GPIO_SetBits(LED_R_GPIO_PORT,LED_R_GPIO_PIN);
    										else 		GPIO_ResetBits(LED_R_GPIO_PORT,LED_R_GPIO_PIN);
    										
    //C语言中的二进制运算符
    //与1异或改变,与0异或不变
    #define LED_R_TOGGLE				{LED_R_GPIO_PORT->ODR ^= LED_R_GPIO_PIN;}
    void LED_GPIO_Config(void);
    #endif /*__bsp_led._h*/
    

    3. 参考资料

    •   原理图
    • 编程要点

        a. 使能 GPIO 端口时钟;

        b. 初始化 GPIO 目标引脚为输入模式 (浮空输入)
        c. 编写简单测试程序,检测按键的状态,实现按键控制 LED 灯。

    • 函数执行流程
      • (1) 使用 GPIO_InitTypeDef 定义 GPIO 初始化结构体变量,以便下面用于存储 GPIO 配置。
      • (2) 调用库函数 RCC_APB2PeriphClockCmd 来使能按键的 GPIO 端口时钟,调用时我们使用“|操作同时配置两个按键的时钟。
      • (3) GPIO 初始化结构体赋值,把引脚初始化成浮空输入模式,其中的 GPIO_Pin 使用宏KEYx_GPIO_PIN”来赋值,使函数的实现方便移植。由于引脚的默认电平受按键电路影响,所以设置成浮空输入。
      • (4) 使用以上初始化结构体的配置,调用 GPIO_Init 函数向寄存器写入参数,完成 GPIO 的初始化,这里的 GPIO 端口使用“KEYx_GPIO_PORT”宏来赋值,也是为了程序移植方便。
      • (5) 使用同样的初始化结构体,只修改控制的引脚和端口,初始化其它按键检测时使用的 GPIO引脚。
  • 相关阅读:
    scala java 混合编译配置
    hadoop自带RPC的使用 代码demo
    《Java多线程设计模式》学习
    b+tree(mongoDB索引,mysql 索引) LSM树(hbase ) Elasticsearch索引
    java jvm虚拟机类加载器
    java jvm虚拟机类加载过程
    凉拌麻辣鸡丝
    C#与C++区别-------转载自博客园-Wei_java
    2019.1.17-我不选ABCD,我选E
    2019.1.1-考研总结and如果二战怎么办
  • 原文地址:https://www.cnblogs.com/kevin-hou1991/p/15426875.html
Copyright © 2020-2023  润新知