按键输入实验--GPIO做输入-学习笔记

这篇具有很好参考价值的文章主要介绍了按键输入实验--GPIO做输入-学习笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

按键输入实验

1.首先,按键实验是GPIO口的另一应用,上一次的跑马灯实验是将GPIO口作为输出,此次按键实验是将GPIO口作为输入。
2.GPIO作为输入时和输入的不同:

(1)首先,上拉电阻是为了保证在没有信号输入的时候,IO口保持高电平,若按键为低电平有效,则没有信号的时候,IO应呈现高电平,所以,此处应设置为上拉输入。

同理,下拉电阻是为了保证在没有信号输入的时候,IO口保持低电平,若按键为高电平有效,则没有信号的时候,IO应呈现低电平。

然后再配置一下IO口引脚,初始化PA0即可。作为输入时,不需要配置速度。

(2)GPIO口各项功能配置完毕之后就是编写按键函数。库函数操作为:GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);若是很简单要实现按键控制LED灯的功能,只需如下的代码:

gpio_readinputdatabit,单片机,学习,stm32

 文章来源地址https://www.toymoban.com/news/detail-702440.html

这里led灯的转换是通过位带操作的,具体操作是在LED.h里写如下代码:#define LED0 PAout(0)即可

考虑道按键防抖,写了如下的按键扫描函数:

gpio_readinputdatabit,单片机,学习,stm32

 

一.STM32 IO 口简介

STM32 的 IO 口 做输入使用的时候,是通过调用函数 GPIO_ReadInputDataBit()来读取 IO 口的状态的。 这一节,我们将通过 MiniSTM32 开发板上载有的 3 个按钮(KEY0/KEY1/WK_UP),来控 制板上的 2 个 LED,其中 KEY0 控制 DS0,按一次亮,再按一次,就灭。KEY1 控制 DS1,效 果同 KEY0。WK_UP 按键则同时控制 DS0 和 DS1,按一次,他们的状态就翻转一次。

二.硬件设计

本实验用到的硬件资源有: 1) 指示灯 DS0、DS1 2) 3 个按键:KEY0、KEY1 和 KEY_UP。 DS0、DS1 和 STM32 的连接在上一节跑马灯已经介绍了,在 MiniSTM32 开发板上的按键 KEY0连接在 PC5 上、KEY1 连接在 PA15 上、WK_UP 连接在 PA0 上。如下图所示:

gpio_readinputdatabit,单片机,学习,stm32

 

三.软件设计

        打开我们的按键实验工程可以看到,我们引入了key.c文件以及头文件key.h。下面我们首先打开key.c文件,代码如下:

    #include "key.h"
    #include "delay.h"
    //按键初始化函数  
    //PA15和 PC5 设置成输入
    void KEY_Init(void)
    {  
        GPIO_InitTypeDefGPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE);//使能 PORTA,PORTC时钟
        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //关闭 jtag,使能 SWD,可以用 SWD模式调试
        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_15;//PA15  
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入  
        GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化 GPIOA15    
        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_5;//PC5  
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入   
        GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化
        GPIOC5    
        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;//PA0  
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0设置成输入,默认下拉     
        GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化 GPIOA.0  
    }
    //按键处理函数
    //返回按键值
    //mode:0,不支持连续按;1,支持连续按;
    //返回值:
    //0,没有任何按键按下
    //KEY0_PRES,KEY0按下
    //KEY1_PRES,KEY1按下
    //WKUP_PRES,WK_UP按下  
    //注意此函数有响应优先级,KEY0>KEY1>WK_UP!!
    u8 KEY_Scan(u8 mode)
    {    static u8 key_up=1;//按键按松开标志  
         if(mode)key_up=1;  //支持连按      
         if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))
         {   
           delay_ms(10);//去抖动    
           key_up=0;   
           if(KEY0==0)return KEY0_PRES;   
           else if(KEY1==0)return KEY1_PRES;   
           else if(WK_UP==1)return WKUP_PRES;   
         }else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1;         
         return 0;// 无按键按下
    }
     
                    

这段代码包含2个函数,void KEY_Init(void)和u8 KEY_Scan(u8 mode),KEY_Init是用来初始化按键输入的IO口的。实现PA0、PA15和PC5的输入设置。接下来我们看看头文件key.h里面的代码。

 

    #ifndef __KEY_H
    #define __KEY_H   
    #include "sys.h"
    #define KEY0  GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)//读取按键 0
    #define KEY1  GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15)//读取按键 1
    #define WK_UP  GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//读取按键 2    
    #define KEY0_PRES 1  //KEY0   
    #define KEY1_PRES 2  //KEY1  
    #define WKUP_PRES 3  //WK_UP

#endif这段代码里面最关键就是3个宏定义:  

    #define KEY0    GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)//读取按键 0
    #define KEY1    GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15)//读取按键 1
    #define WK_UP   GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//读取按键 2

 

main.c里面编写的主函数代码如下:

    #include "led.h"
    #include "delay.h"
    #include "sys.h"
    #include "key.h"
    //按键输入实验      
    int main(void)  
    {   u8 t;     
        delay_init();       //延时函数初始化     
        LED_Init();      //初始化与 LED连接的硬件接口
        KEY_Init();           //初始化与按键连接的硬件接口
        LED0=0;     //点亮 LED  
        while(1)  
        {   
          t=KEY_Scan(0);  //得到键值   
          switch(t)   
          {         
            case KEY0_PRES:     
            LED0=!LED0;     
            break;    
            case KEY1_PRES:     
            LED1=!LED1;     
            break;    
            case WKUP_PRES:        
            LED0=!LED0;    
            LED1=!LED1;     
            break;    
            default:     
            delay_ms(10);    
            }   
        }    
    }

最后编程运行程序出现下图表示没有错误:

gpio_readinputdatabit,单片机,学习,stm32

 

到了这里,关于按键输入实验--GPIO做输入-学习笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【stm32】hal库学习笔记-GPIO按键控制LED和蜂鸣器(超详细!)

    注:本学习笔记基于stm32f4系列 使用的开发板为正点原子stmf407ZGT6探索者开发板 GPIO引脚使用时,可输入或输出数字信号 例如: 检测按键输入信号(Read_Pin)输出信号(Write_Pin) 输出信号点亮或熄灭LED GPIO引脚内部结构图 GPIO状态 输入浮空状态 :上拉下拉电阻均不使用(复位时

    2024年01月20日
    浏览(54)
  • STM32CubeMX教程3 GPIO输入 - 按键响应

    开发板(STM32F407G-DISC1) STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) ST-LINK/V2驱动 使用STM32CubeMX软件配置STM32F407开发板的按键作为输入,利用按键输入使LED灯产生响应 对于所有的GPIO来说都是既可以作为输出引脚也可以作为输入引脚使用,本开发板上有一个用户按键,

    2024年02月03日
    浏览(61)
  • linuxARM裸机学习笔记(4)----GPIO中断以及定时器中断实验

    这个表里面存放的都是中断向量,中断服务程序的入口地址或存放中断服务程序的首地址成为中断向量。中断向量表是一系列中断服务程序入口地址组成的表,当某个中断触发的时候会自动跳转到中断向量表对应的中断服务程序的入口。 2.NVIC(内嵌向量中断控制器) 在IMU6U的中

    2024年02月14日
    浏览(45)
  • STM32 F103C8T6学习笔记2:GPIO的认识—GPIO的基本输入输出—点亮一个LED

    今日继续学习使用  STM32 F103C8T6开发板 点亮一个LED灯,文章提供源码,测试工程,实验效果图,希望我的归纳总结会对大家有帮助~ 目录 GPIO的认识与分类 : 引脚安排整理: 定时器的引脚例举: 串口的引脚例举:  CAN串口通信: SPI通信: IIC通信:  其余引脚: 烧录引脚:

    2024年02月11日
    浏览(52)
  • 【stm32】02,今晚,整个32的闪烁为你所控制(GPIO输入,按键检测)

    往期内容: 【stm32】00亲爱的勇者,在踏上这个波澜壮阔的大陆之前,厉兵秣马,我们即刻出发 【stm32】01,今晚,整个32将为你闪烁(GPIO输出,点亮led灯) 亲爱的勇者们,许久不见甚是想念!我是weib,在我不在的日子里也祝愿你们早安、午安和晚安!欢迎各位勇者来到了新的

    2024年02月11日
    浏览(40)
  • 【STM32】按键控制LED亮灭实验——GPIO、LED、KEY、SYS

    无锁存时:当按下独立按钮时LED亮,松开LED灭。 锁存时:当按下独立按钮时LED亮,松开LED仍亮,再按下独立按钮时LED熄灭。 硬件部分 软件部分 1、引入头文件 2、主函数 首先时钟、led、按键初始化 锁存时:当按下独立按钮时LED亮,松开LED仍亮,再按下独立按钮时LED熄灭。常

    2024年02月08日
    浏览(100)
  • 物联网|按键实验---学习I/O的输入及中断的编程|读取I/O的输入信号|中断的编程方法|轮询实现按键捕获实验-学习笔记(13)

    1按键功能及用途,常见按键举例 2按键的工作原理 3按键的电路表示 课后小作业: 请大家课后百度现在流行的触摸式按键的相关信息,并考虑如何使用我们开发板的CPU如何操作触摸按键。 了解STM32F407中IO输入信号读取的原理. 了解STM32F407中外部中断的原理 .学习利用CMSIS实现I

    2024年02月14日
    浏览(40)
  • STM32 GPIO设置(GPIO初始化)学习笔记

    GPIO 都知道是 通用输入输出接口 的意思就不详细解释 那么我们就直接进入怎么设置GPIO接口: 这里我的编译软件是keil5,相信大家都应该知道stm32有各种的工作模式上拉、下拉、推挽、开漏等等。如果想要了解具体的工作模式原理这里我推荐大家看:推挽 开漏 高阻 这都是谁

    2024年03月28日
    浏览(59)
  • 【学习笔记:GPIO驱动开发】

    快门驱动芯片ms8837 输入信号是两个GPIO,最开始是在camera 驱动中调用 gpio_request() 申请GPIO,当 open/close camera 的时候就可以调用 gpio_direction_output() 来控制快门的开、关。 在dts 中加入引脚配置: 在camera 驱动中调用gpio_request() 去控制GPIO: 这样在open/close camera 的时间是可以正常调

    2024年02月03日
    浏览(42)
  • stm32 学习笔记:GPIO输出

           引脚电平 0-3.3V,部分可容忍5V,对输出而言最大只能输出3.3V,        只要可以用高低电平来控制的地方,都可以用GPIO来完成,如果控制的功率比较大的设备,只需加入驱动电路即可         GPIO 通用输入输出口,可配置为 8种 输入输出模式。 输出模式下可控制端口

    2024年02月09日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包