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下载到单片机后,验证代码是否准确;