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

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


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

                    


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

LED初始化函数:blog

#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口接上拉电阻,使用上拉输入模式。


按键初始化函数:ip

#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);
}


对于按键输入来讲,怎么判断是连续按,仍是不连续按,这是一个重点。之前是将两种状况分开考虑,写成了两个函数,而后判断,其实,这个能够写成一个函数,只需添加一个选择形参,而后对形参进行判断操做便可。开发


按键输入函数:get

//按键处理函数
//返回按键值
//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);	
	}
}



按键输入keil工程分享it

参考:开源电子网
io