×
单片机 > 单片机程序设计 > 详情

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

发布时间:2020-05-30 发布时间:
|

之前写了两篇关于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);

}

}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
8051单片机的函数发生器的设计