嵌入式系统学习——STM32之按键输入

发布者:红尘清梦最新更新时间:2019-06-24 来源: eefocus关键字:嵌入式系统  STM32  按键输入 手机看文章 扫描二维码
随时随地手机看文章

之前写了两篇关于STM32 GPIO的介绍和运用,跑马灯用到了GPIO的推挽输出,但是对于输入还是没有用到,这次就运用一下GPIO的上拉输入。实验还是和以前51做的实验一样,就是判断按键的输入,然后控制LED灯。这次没有直接配置寄存器,而是调用库函数和位操作结合。


注:每一块开发板对应电路都不相同,编写代码需要对应自己的板子,本人两个LED灯对应的GPIO为:GPIOD13和GPIOD14,并且是共阴极。两个按键对应的GPIO为:GPIOC13和GPIOE0,并且共阴极。

                    

首先,LED初始化和上一篇博客中的跑马灯初始化一样,只需拷贝就可以了。


LED初始化函数:



#include "sys.h"


#define LED1 PDout(13)// PB13

#define LED2 PDout(14)// PB14

void LED_Init(void)

{

GPIO_InitTypeDef GPIOINIT;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);

GPIOINIT.GPIO_Mode = GPIO_Mode_Out_PP;

GPIOINIT.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;

GPIOINIT.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOD, &GPIOINIT);

GPIO_ResetBits(GPIOD, GPIO_Pin_13 | GPIO_Pin_14);

}



按键输入最关键的是对按键的初始化和输入判断。这里按键的初始化与LED的初始化不同的是GPIO的模式不一样了,LED是推挽输出,按键则相反,是输入,这个时候要考虑是哪一种输入方式,这里我的板子上按键是共阴极的,所以当按键按下的时候IO口输入的低电平,所以我需要在IO口接上拉电阻,使用上拉输入模式。



按键初始化函数:



#include "stm32f10x.h"


#define KEY0 GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) //读取GPIOC13的输入

#define KEY1 GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_0) //读取GPIOE0的输入


#define KEY0_PRESS 1

#define KEY1_PRESS  2


void KEY_Init(void)

{

GPIO_InitTypeDef GPIOInit;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOE, ENABLE);

GPIOInit.GPIO_Mode = GPIO_Mode_IPU;

GPIOInit.GPIO_Pin = GPIO_Pin_13;

GPIOInit.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOC, &GPIOInit);

GPIOInit.GPIO_Mode = GPIO_Mode_IPU; //上拉输入

GPIOInit.GPIO_Pin = GPIO_Pin_0;

GPIOInit.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOE, &GPIOInit);

}



对于按键输入来说,怎么判断是连续按,还是不连续按,这是一个重点。以前是将两种情况分开考虑,写成了两个函数,然后判断,其实,这个可以写成一个函数,只需添加一个选择形参,然后对形参进行判断操作即可。




按键输入函数:



//按键处理函数

//返回按键值

//mode:0不支持连续按;1支持连续按

//0,没有按键按下

//1,key0按下

//2,key1按下


unsigned char KEY_Scan(unsigned char mode)

{

static unsigned char key_up = 1;    //按键松开标志

if(mode)

{

key_up = 1; //支持连续按

}

if(key_up && (KEY0 == 0 || KEY1 == 0))

{

delay_ms(10); //去抖

key_up = 0;

if(KEY0 == 0)

return KEY0_PRESS;

else if(KEY1 == 0)  

return KEY1_PRESS;

}

else if(KEY0 == 1 && KEY1 == 1)

{

key_up = 1;

}

return 0; //无按键按下

}


主函数:



#include "led.h"

#include "key.h"

#include "stm32f10x.h"

#include "delay.h"


int main(void)

{

u8 key;

LED_Init();

delay_init();

KEY_Init();

LED1=1;

while(1)

{

key = KEY_Scan(0);

if(key == 1)

{

LED1=!LED1;

}

else if(key == 2)

{

LED3=!LED3;

}

delay_ms(10);

}

}



关键字:嵌入式系统  STM32  按键输入 引用地址:嵌入式系统学习——STM32之按键输入

上一篇:嵌入式-stm32学习:使用固件库点亮LED
下一篇:STM32 简易按键KEY处理

推荐阅读最新更新时间:2024-11-10 14:15

如何使用CubeMx生成一个DFU工程
1 前言 DFU用来做IAP是很方便的,可以直接通过USB来对APP进行升级,因此,掌握DFU的制作还是挺有好处,特别是使用CubeMx工具可以快速制作,本文将基于STM3240G-EVL评估板来一步一步实现一个DFU的IAP工程。 2 制作CubeMx工程 新建一个STM32F407IGHx工程:Pinout: Peripherals: RCC- High Speed Clock(HSE):Crystal/Ceramic Resonator SYS- Debug:Serial Wire USB_OTG_FS- Mode:Device_Only MiddleWares USB_DEVICE- Class For FS IP:D
[单片机]
基于CH375的嵌入式USB文件加解密系统的设计
  随着信息与通信技术的飞速发展,信息安全与通信加解密在个人隐私特别在军事情报和国家机密等方面显得尤为突出。数据加密技术无疑是保护信息安全最有效的一种方法。传统的文件加密方式是基于PC平台的,不能满足移动场合的应用需求。基于PC机的加密技术使明文到密文必须经过PC机环节,在不能保证PC机软硬件绝对可靠的情况下,可能失密。基于嵌入式设计的本系统可以便携使用,并在完成加密或解密过程后可将芯片程序擦除或将芯片破坏,避免加解密硬件环节的失密。本设计提高了系统的安全性,提供了便携使用的可能,有一定的理论意义和较高的使用价值。    1 USB HOST控制器CH375   CH375 是一款USB总线的通用接口芯片,支持USB HOST主机
[单片机]
基于CH375的嵌入式USB文件加解密系统的设计
STM32开发笔记28: 中断请求的移植与处理
单片机型号:STM32L053R8T6 本文介绍如何移植STM32的IRQ(中断请求)到自己的系统中,我们以USART1接收中断为例。 先看启动文件(汇编语言),如下列程序所示,列出了其向量区,USART1的中断向量已用红色标识,当和USART1相关的中断发生时,程序指针(PC)在保护现场后,直接指向到该向量。 __Vectors DCD __initial_sp ; Top of Stack DCD Reset_Handler ; Reset Handler DCD NMI_Handler ; NMI Handler
[单片机]
如何将STM32单片机的JTAG口作为GPIO使用
使用STM32F系列,会遇到将JTAG口复用为SPI1或直接用做普通IO。 针对于F1系列,需要先禁止使能 JTAG,然后将其复用为其他口或者普通IO。 针对F4系列,STM32F4库函数中,已经取消了GPIO_*PinRemapConfig()函数,对于复用功能使用GPIO*_PinAFConfig()函数了! 但是在GPIO_PinAFConfig()函数已经没有禁止JTAG/SW等选项了,而是复用到AF0~AF15线上,其中AF0是系统功能(也是复位初始功能)。 其中调试接口就是系统功能,这样需要禁用JTAG功能只需把引脚复用到AF1~AF15中的一个就行了。 直接复用就可使用相应的复用功能,不用想着失能
[单片机]
STM32—位带操作
STM32中的位带操作: 名字为位带操作,实际上是对位的操作,位操作就是可以单独的对一个比特位读和写,这个在 51 单片机中非常常见。 51 单片机中通过关键字 sbit 来实现位定义, STM32 没有这样的关键字,而是通过访问位带别名区来实现。STM32 的全部寄存器都可以通过访问位带别名区的方式来达到访问原始寄存器比特位的效果,这比 51 单片机强大很多。因为 51 单片机里面并不是所有的寄存器都是可以比特位操作,有些寄存器还是得字节操作,比如 SBUF。 51单片机中的位操作: 51单片机中可以对寄存器实现单个位的操作,靠的就是关键字sbit,如 sbit led=P1^0; led=1;就可实现对P1.0位置1的效果
[单片机]
STM32——pwm控制LED
pwm.c #include pwm.h /******************************************************************************* * 函 数 名 : TIM3_CH1_PWM_Init * 函数功能 : TIM3通道1 PWM初始化函数 * 输 入 : per:重装载值 psc:分频系数 * 输 出 : 无 *******************************************************************************/ void TIM3_CH1_PWM_Init(u1
[单片机]
STM32的八种GPIO模式
STM32有八种IO口模式,分别是:模拟输入、浮空输入、上拉输入、下拉输入、开漏输出、推挽输出、复用开漏输出和复用推挽输出。 1、模拟输入 GPIO_Mode_AIN模拟输入,即关闭施密特触发器,将电压信号传送到片上外设模块(不接上下拉电阻)。 2、浮空输入 GPIO_Mode_IN_FLOATING浮空输入。浮空输入状态下,IO的电平状态是不确定的,完全由外部输入决定,如果在该引脚悬空的情况下,读取该端口的电平是不确定的。 3、上下拉输入 GPIO_Mode_IPD下拉输入,GPIO_Mode_IPU上拉输入。一般来讲,上拉电阻为1K-10K,电阻越小,驱动能力越强。 电阻的作用:防止输入端悬空,减少外部
[单片机]
电动汽车快速充电机监控终端的设计
  0 引言   随着国家对新能源技术的大力扶持,电动汽车逐渐成为国家在新能源汽车产业大力发展的对象,而电动汽车充电站、快速充电机是电动汽车大规模化后不可或缺的服务基础设施之一。大量分布于各住宅小区、停车场的电动汽车用非车载智能快速充电机,实现高效、安全、智能化的管理必定成为主流。针对目前快速充电机群实行无人值守的运行情况,这就要求快速充电机须具有较高的可靠性和自动化程度,功能更加完善,可远程维护等功能。   这样,使得分布式、模块化、智能化成为快速充电机的发展方向,而高性能、低成本的充电机监控终端是其中的关键技术。为管理区域多台充电机的资源优化利用与管理的智能化,监控终端与Internet网的交互成为一种必然。   1 监
[单片机]
电动汽车快速充电机监控终端的设计
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved