STM32笔记9---按键输入实验(库函数)

8.1、按键输入的硬件连接

8.2、GPIO输入操作说明

8.3、按键实验(思路及程序源码)

本章节参考资料;(手册第八章)

8.1、按键输入的原理图

上述有三个按键,分别是:K0、K1和WKup,三个按键中,K0和K1按下后,IO口会检测到低电平,WKup按下后,IO口会检测到高电平。

8.2、GPIO操作说明

根据之前所说,操作IO口的状态,有三种操作方法,分别是:调用库函数、操作寄存器、使用位带操作。如下所示:

 据前述,除了第二种操作寄存器的方法是直接操作寄存器外,无论是调用库函数还是位带操作,都需要调用库文件中的定义。

8.3、按键输入实验

        主要操作步骤:

     (1)使能按键对应的IO口时钟,通过调用函数RCC_APB2PeriphClockCmd();

     (2)初始化IO口的模式:调用函数GPIO_Init();

     (3)扫描IO口的电平(库函数/寄存器/位带操作)

PS:按键扫描思路:按键扫描共有两种模式,第一种是“支持连按”,当按下按键后,不松开按键,系统会一直做出反应。

 上图中,蓝线代表按键状态,在支持连按模式下:当系统检测到按键为高电平时,系统会判断按键未按下,当系统检测到案件为低电平时,系统就会判断按键已经按下。但是需要注意的是,系统扫描IO口电平并不是连续检测的,系统扫描有一定的时间间隔(亦即扫描频率)

而在不支持连按模式下:系统在检测到IO口为低电平时,必须还要检测到下一次按键已经松开,才能判断本次按键触发有效。也就是说,当系统检测到现在为低电平。而下一次扫描检测到位高电平,则上一次扫描到的低电平才是有效的。如果加测到上一次为低电平,下一次扫描依然为低电平,则上一次低电平判断为无效。(在不支持连按的模式下。系统需要检测到电平的变化)         

8.3、按键程序编写

PS:C语言关键字,static (adj.静止的,静态的)

static申明的局部变量,存储在静态存储区。

并且static在函数调用结束之后,不会被释放。它的值会一直保留下来

所以说static申明的局部变量,具有记忆功能

  对于static的记忆功能,如下图例子所示:

 第一个程序,每次调用flag都先会初始化为0,最后返回值为1,第二个程序,在调用完flag之后,flag的数值不被释放,而是被存储在静态存储区(右边的程序初始化语句只会执行一次)

8.3.1、支持连续按键的思路

u8 KEY_Scan(void)

  {

    if(KEY按下) 

      {

               delay_ms(10);    //延时10~20ms,防抖动,确认按键确实按下,而不是误触

               if(KEY确实按下)

            {

               return KEY_Value;

             }

          return 无效值

        }

 }

8.3.2、不支持连续按键的思路

u8 KEY_Scan(void)

 {

      static u8 key_up=1;

       if (key_up&& KEY按下)

        {

          delay_ms(10);      //延时,防抖动;

          key_up=0             //标记此次key已经被按下;

          if(KEY确实按下)

             {

             return KEY_VALUE;

             }

        }

         else if(KEY没有按下) key_up=1;

          return 没有按下

 }

实例的程序源码如下所示(不支持连续按模式)

 PS:上图程序中的  mode  其实是程序中定义的模式(入口参数),当mode=0,代表不支持连续按模式,当mode=1,代表支持连续按模式。

下图为两种模式合二为一的一般性思路:

8.3.3、程序编写

在key.h头文件中,可以看到调用库函数的代码和位带操作的代码(被注释),库函数版本中的操作方法是调用函数GPIO_ReadInputDataBit(GPIOX,GPIO_Pin_x)

下图为定义按键初始化函数:

 下图为主程序代码:

 通过Flymcu下载到单片机后,验证代码是否准确;

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值