历史上的今天
今天是:2025年06月24日(星期二)
2019年06月24日 | 嵌入式系统学习——STM32之按键输入
2019-06-24 来源:eefocus
之前写了两篇关于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);
}
}
史海拾趣
|
wince 下如何获得系统的LAN,Bluetooth,wifi连接状态,有哪些api可用? wince 下如何获得系统的LAN,Bluetooth,wifi连接状态,wifi的信号强度,有哪些api可用?… 查看全部问答> |
|
我直接从韩国下载的 MP2530F的BSP,编译能通过,在烧写完NK.NB0的时候进入不了系统,串口消息如下,请各位大侠帮我看一下怎么回事,谢谢 NK.nb0 will be downloaded 31457280 bytes at 0x400000 Now, Downloading [ADDRESS:400000h, TOTAL:0x01E0 ...… 查看全部问答> |
|
初识智能设备,要做一个pda点菜系统,我现在用的是vs2005,建的是pocket pc项目,问我应该怎么让pda与webservice连接? 1、在pda端是new一个成员webservice引用还是每进行一个操作new一个局部ws的引用(这样会不会影响效率)? 2、如果是nwe一个成 ...… 查看全部问答> |
|
大家好! 请问大家有人知道,如何获得存放在SIM卡上的语音信箱号码吗?因为有些SIM卡将语音信箱号码预先设置到了SIM卡的某个地方,我现在想把这个号码取出来.那如何做到呢? 在GSM11.11规范中有EF-SDN(6F49)着个文件, 但是 ...… 查看全部问答> |
|
今天遇到一个奇怪的问题:用QuartusII仿真的时候,波形图总是不会出现时钟,就只有电平而已,但是程序确定无误是设定了时钟类型的,仿真的时候也设定了,但就是仿真不了!到底是什么问题呢??… 查看全部问答> |
|
PIC单片机的应用设计技巧(转) document.write(overlap1); 美国微芯公司(Microch{p Technology Inc.)开发的CM0S工艺PIC系列8位单片机(RISC微控制器),特别是 ...… 查看全部问答> |




