简介
1.硬件
STM32F103C8T6 独立按键
2.软件
keil软件
硬件部分
1.按键分类与输入原理
按键按照结构原理科分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关灯;另一类是无触点式开关按键,如电气式按键,磁感应按键等。前者造价低,后者寿命长。目前,微机系统中最常见的是触点式开关按键。
在单片机应用系统中,除了复位按键有专门的复位电路及专一的复位功能外,其他按键都是以开关状态来设置控制功能或输入数据的。当所设置的功能键或数字键按下时,计算机应用系统应完成该按键所设定的功能,键信息输入时与软件结构密切相关的过程。
对于一组键或一个键盘,总有一个接口电路与CPU相连。CPU可以采用查询或中断方式了解有无将按键输入,并检查是哪一个按键按下,将该键号送人累加器,然后通过跳转指令转入执行该键的功能程序,执行完成后再返回主程序。
2.按键结构与特点
微机键盘通常使用机械触点式按键开关,其主要功能式把机械上的通断转换为电气上的逻辑关系。也就是说,它能提供标准的TTL逻辑电平,以便于通用数字系统的逻辑电平相容。机械式按键再按下或释放时,由于机械弹性作用的影响,通常伴随有一定的时间触点机械抖动,然后其触点才稳定下来。其抖动过程如下图1所示,抖动时间的长短与开关的机械特性有关,一般为5-10ms。在触点抖动期间检测按键的通与断,可能导致判断出错,即按键一次按下或释放错误的被认为是多次操作,这种情况是不允许出现的。为了克服你、按键触点机械抖动所致的检测误判,必须采取消抖措施。按键较少时,可采用硬件消抖;按键较多式,采用软件消抖。
按键编码
一组按键或键盘都要通过I/O口线查询按键的开关状态。根据键盘结构的不同,采用不同的编码。无论有无编码,以及采用什么编码,最后都要转换成为与累加器中数值相对应的键值,以实现按键功能程序的跳转。
(2)键盘程序
一个完整的键盘控制程序应具备以下功能:
a.检测有无按键按下,并采取硬件或软件措施消抖。
b.有可靠的逻辑处理办法。每次只处理一个按键,期间对任何按键的操作对系统不产生影响,且无论一次按键 时间有多长,系统仅执行一次按键功能程序。
c.准确输出按键值(或键号),以满足跳转指令要求。
3.独立按键
(1)独立按键
单片机控制系统中,如果只需要几个功能键,此时,可采用独立式按键结构。
独立按键式直接用I/O口线构成的单个按键电路,其特点式每个按键单独占用一根I/O口线,每个按键的工作不会影响其他I/O口线的状态。独立按键的典型应用如图所示。独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一个I/O口线,因此,在按键较多时,I/O口线浪费较大,不宜采用。
独立按键的软件常采用查询式结构。先逐位查询没跟I/O口线的输入状态,如某一根I/O口线输入为低电平,则可确认该I/O口线所对应的按键已按下,然后,再转向该键的功能处理程序。
软件部分
key.c
- #include"key.h"
- void KEY_GPIO_Config(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure; //定义结构体指针变量
- RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK|KEY2_GPIO_CLK,ENABLE);
- //开启按键端口的时钟
- /*按键输入控制GPIO端口的步骤*/
- /*
- {
- 1.选择按键的引脚
- 2.设置按键的引脚为浮空输入
- 3.使用结构体初始化按键
- }
- */
- //key1
- GPIO_InitStructure.GPIO_Pin = KEY1_GPIO_PIN;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStructure);
- //key2
- GPIO_InitStructure.GPIO_Pin = KEY2_GPIO_PIN;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStructure);
-
- }
- /*
- * 函数名: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;
- }
复制代码 key.h
- #ifndef __KEY_H
- #define __KEY_H
- #include "stm32f10x.h"
- /*
- 注意:该引脚定义是根据野火STM32F103霸道开发板的原理图定义的,如果需要自行的设计需要重新更改宏定义选择不同的GPIO端口
- STM32F103ZET6芯片共有144个引脚
- 其中:GPIOA,GPIOB,GPIOC,GPIOD,GPIOE
- */
- // 引脚定义
- #define KEY1_GPIO_CLK RCC_APB2Periph_GPIOA
- #define KEY1_GPIO_PORT GPIOA
- #define KEY1_GPIO_PIN GPIO_Pin_0
- #define KEY2_GPIO_CLK RCC_APB2Periph_GPIOC
- #define KEY2_GPIO_PORT GPIOC
- #define KEY2_GPIO_PIN GPIO_Pin_13
- /** 按键按下标置宏
- * 按键按下为高电平,设置 KEY_ON=1, KEY_OFF=0
- * 若按键按下为低电平,把宏设置成KEY_ON=0 ,KEY_OFF=1 即可
- */
- #define KEY_ON 1
- #define KEY_OFF 0
- void KEY_GPIO_Config(void);
- uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin);
- #endif
复制代码 main.c- #include "stm32f10x.h"
- #include "key.h"
- int main(void)
- {
-
- LED_GPIO_Config();
- KEY_GPIO_Config();
- while(1)
- {
- if( Key_Scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN) == KEY_ON )
- {
- GPIO_ResetBits(LED1_GPIO_PORT , LED1_GPIO_PIN);//开
- GPIO_SetBits(LED2_GPIO_PORT , LED2_GPIO_PIN);//关
- GPIO_SetBits(LED3_GPIO_PORT , LED3_GPIO_PIN);//关
- }
- if( Key_Scan(KEY2_GPIO_PORT,KEY2_GPIO_PIN) == KEY_ON )
- {
- GPIO_SetBits(LED1_GPIO_PORT , LED1_GPIO_PIN);//关
- GPIO_SetBits(LED2_GPIO_PORT , LED2_GPIO_PIN);//关
- GPIO_SetBits(LED3_GPIO_PORT , LED3_GPIO_PIN);//关
-
- }
- }
- }
复制代码
【必读】版权免责声明
1、本主题所有言论和内容纯属会员个人意见,与本论坛立场无关。2、本站对所发内容真实性、客观性、可用性不做任何保证也不负任何责任,网友之间仅出于学习目的进行交流。3、对提供的数字内容不拥有任何权利,其版权归原著者拥有。请勿将该数字内容进行商业交易、转载等行为,该内容只为学习所提供,使用后发生的一切问题与本站无关。 4、本网站不保证本站提供的下载资源的准确性、安全性和完整性;同时本网站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。 5、本网站所有软件和资料均为网友推荐收集整理而来,仅供学习用途使用,请务必下载后两小时内删除,禁止商用。6、如有侵犯你版权的,请及时联系我们(电子邮箱1370723259@qq.com)指出,本站将立即改正。
|