野火13:GPIO输入——按键检测

 #include "stm32f10x.h"
#include "bsp_led.h"  
#include "bsp_key.h" 
int main(void)
{    
    /* LED端口初始化,跟上一节的LED一模一样,直接拿过来用 */
    LED_GPIO_Config();
    LED1_ON;

    /* 按键端口初始化 ,在上一节的基础上改了一点点东西而已*/
    Key_GPIO_Config();
    
    /* 轮询按键状态,若按键按下则反转LED 。强行做了一个按键检测和LED灯亮灭的关系函数。让检测到按下一次,灯状态反转一次。
    用的是 #define digitalToggle(p,i) {p->ODR ^=i;} //输出反转状态 这个函数,这个函数还没搞明白??让LED1端口(GPIOB)的ODR值(0001)与LED1的pin脚值(GPIO_Pin_5)取异或,结果再给ODR。

#define  LED1_TOGGLE         digitalToggle(LED1_GPIO_PORT,LED1_GPIO_PIN)                 异或运算:位相同则为0,位不同则为1;*/
    while(1)                            
    {       
        if( Key_Scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN) == KEY_ON  )
        {
            /*LED1反转*/
            LED1_TOGGLE;
        } 

        if( Key_Scan(KEY2_GPIO_PORT,KEY2_GPIO_PIN) == KEY_ON  )
        {
            /*LED2反转*/
            LED2_TOGGLE;
        }        
    }
}
/*********************************************END OF FILE**********************/

bsp_key.c

 /* *函数名:Key_Scan
 * 描述  :检测是否有按键按下
 * 输入  :GPIOx:x 可以是 A,B,C,D或者 E
 *             GPIO_Pin:待读取的端口位     
 * 输出  :KEY_OFF(没按下按键)、KEY_ON(按下按键) */

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;

版权声明:本文为CSDN博主「刘小强857」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44386138/article/details/122467541

 #include "stm32f10x.h"
#include "bsp_led.h"  
#include "bsp_key.h" 
int main(void)
{    
    /* LED端口初始化,跟上一节的LED一模一样,直接拿过来用 */
    LED_GPIO_Config();
    LED1_ON;

    /* 按键端口初始化 ,在上一节的基础上改了一点点东西而已*/
    Key_GPIO_Config();
    
    /* 轮询按键状态,若按键按下则反转LED 。强行做了一个按键检测和LED灯亮灭的关系函数。让检测到按下一次,灯状态反转一次。
    用的是 #define digitalToggle(p,i) {p->ODR ^=i;} //输出反转状态 这个函数,这个函数还没搞明白??让LED1端口(GPIOB)的ODR值(0001)与LED1的pin脚值(GPIO_Pin_5)取异或,结果再给ODR。

#define  LED1_TOGGLE         digitalToggle(LED1_GPIO_PORT,LED1_GPIO_PIN)                 异或运算:位相同则为0,位不同则为1;*/
    while(1)                            
    {       
        if( Key_Scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN) == KEY_ON  )
        {
            /*LED1反转*/
            LED1_TOGGLE;
        } 

        if( Key_Scan(KEY2_GPIO_PORT,KEY2_GPIO_PIN) == KEY_ON  )
        {
            /*LED2反转*/
            LED2_TOGGLE;
        }        
    }
}
/*********************************************END OF FILE**********************/

bsp_key.c

 /* *函数名:Key_Scan
 * 描述  :检测是否有按键按下
 * 输入  :GPIOx:x 可以是 A,B,C,D或者 E
 *             GPIO_Pin:待读取的端口位     
 * 输出  :KEY_OFF(没按下按键)、KEY_ON(按下按键) */

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;

版权声明:本文为CSDN博主「刘小强857」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44386138/article/details/122467541

生成海报
点赞 0

刘小强857

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

正点原子 例程学习记录 实验四 串口实验

断断续续地看了一阵子 ,一度被工程下无数的文件劝退,今又看了开发指南,发现其实没有编译的工程包含的文件并不多,绝大部分文件都是编译后才出现的。其中还有很多是系统文件,不需要自

STM32通用定时器的个人总结

STM32104ZET6系列的芯片中,定时器一共有一下三种分类: 高级定时器,通用定时器,基本定时器。 这里主要讲一下通用定时器,首先,计数器模式一共有三种&

【物联网项目】OLED改造

如何把7ping的SPI通信的OLED改造为IIC通信? 之前买OLED的时候发现有两款OLED。 一款是直接IIC通信的OLED只有4Pin管脚。 分别是GND VCC SCL SDA 另一款是支持SPI通信和IIC通信的