野火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添加.c和.h文件问题

防止自己忘记stm32相关问题的解决方法,在这里写下记录 在工程的group中添加.c和.h文件 具体添加方法,这里已经写的很清楚 https://blog.csdn.net/dang_dang_/article/d

STM32 printf重定向(串口输出)

一、前言 什么是重定向?重定向是指将fputc里面的输出指向目标设备。因printf函数调用了fputc,而fputc输出有默认指向的目标,且不同库中的fputc输出指向不同,所以需要重写fputc

stm32f103rct6串口接收字符控制LED闪烁

最近在学单片机的串口,首先从串口发送接收开始吧,串口发送比较简单,下面讲讲串口接收字符串的情况。 单片机型号用的是 stm32f103rct6,IDE版本是keil 5。本代码是操作寄存器