野火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

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

暂无评论

发表评论

相关推荐

LED原理及流水灯的实现

LED原理及流水灯的实现 原理 Library中 ACTIVE:可视化的,可以看清LED的活动 LED_BIBY的意思是:两种极性的LED颜色:B-blue,Y-yel

【蓝桥杯】IIC通信协议

1、IIC通信简介 I2C总线是PHLIPS(飞利浦)公司推出的一种串行(集成电路总线)总线,是具备多主机系统所需的包括总线裁决和高低速器件同步功能的高性能串行总线。 I2