STM32按键

STM32GPIO以及按键

  1. mini版的stm32f10x有四组通用IO口:PA(0-15)、PB(0-15)、PC(0-15)、PD(0-2)
  2. 输入分为:输入浮空、输入上拉、输入下拉、模拟输入
  3. 输出分为:开漏输出、开楼复用输出、推挽式输出、推挽式复用输出
  4. 翻转速率分为:2MHz、10MHz、50MHz

在写程序的时候要结合原理图和中文参考手册,读原理图的时候看清楚引脚的编号。

初始化函数

在使用每一个GPIO之前都必须要进行初始化,最好要写进新的文件中,留出接口便于主函数调用。

  1. 初始化LED
#include "led2.h"//led.c文件
#include "stm32f10x.h"
void Init_LED(void)
{
	GPIO_InitTypeDef str;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);//使能GPIOD
	
    str.GPIO_Mode = GPIO_Mode_Out_PP;//设置输出模式
  	str.GPIO_Pin = GPIO_Pin_2;//设置引脚编号
  	str.GPIO_Speed = GPIO_Speed_50MHz;//设置翻转速度
	GPIO_Init(GPIOD,&str);//初始化PD2引脚
	GPIO_SetBits(GPIOD,GPIO_Pin_2);//将PD2引脚设置为高电平
	
	str.GPIO_Mode = GPIO_Mode_Out_PP;
  	str.GPIO_Pin = GPIO_Pin_8;
  	str.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&str);
    GPIO_SetBits(GPIOA,GPIO_Pin_8);
}

#ifndef __LED_H//led.h文件
#define __LED_H
#include "sys.h"
#define LED0 PAout(8)	// PA8,设置PA8引脚的电平状态0和1
#define LED1 PDout(2)	// PD2
void Init_LED(void);
#endif

  1. 初始化KEY
#include "key.h"//key.c文件
#include "stm32f10x.h"
#include "delay.h"
void Init_Key(void){
	GPIO_InitTypeDef str;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
	str.GPIO_Pin = GPIO_Pin_5;
	str.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_Init(GPIOC,&str);
	
	str.GPIO_Pin = GPIO_Pin_15;
	str.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_Init(GPIOA,&str);
	
	str.GPIO_Pin = GPIO_Pin_0;
	str.GPIO_Mode = GPIO_Mode_IPD;
	GPIO_Init(GPIOA,&str);
}

u8 Key_Scan(u8 mode)
{
	static u8 flag = 1;//1代表没有按键按下,0代表有按键按下
	if(flag == 1&&(KEY0 == 0 || KEY1 == 0 || WK_UP == 1)){//检测是否有按键按下
		delay_ms(10);
		flag = 0;
		if(KEY0 == 0)return KEY0_PRES;
		else if(KEY1 == 0)return KEY1_PRES;
		else if(WK_UP == 1)return WKUP_PRES;
	}
	else if(KEY0 == 1 && KEY1 == 1 && WK_UP == 0)flag = 1;
	return 0;
}

#ifndef __KEY_H//key.h文件
#define __KEY_H	 
#include "sys.h"
//#define KEY0 PCin(5)   	
//#define KEY1 PAin(15)	 
//#define WK_UP  PAin(0)
#define KEY0    PCin(5)//使用位带操作读取PC5引脚的电平状态
#define KEY1    PAin(15)
#define WK_UP   PAin(0)
 

#define KEY0_PRES	1		//KEY0  
#define KEY1_PRES	2		//KEY1 
#define WKUP_PRES	3		//WK_UP  

void Init_Key(void);
u8 Key_Scan(u8 mode);			    
#endif

上述代码读取PC5的状态的的时候使用的时位带操作,也可以使用库函数读取:GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)

  1. 主函数
#include "stm32f10x.h"//main.c文件
#include "led2.h"
#include "key.h"
#include "delay.h"
int main()
{
	u8 t=0;
	delay_init();//注意千万不要忘记初始化
	Init_LED();
	Init_Key();
	LED0 = 0;//在还没开始按下键的时候设置两个LED为低电平,两个LED会亮
	LED1 = 0;
	while(1)
	{
			t = Key_Scan(0);
		    switch(t)
			{
				case KEY0_PRES:LED0 = !LED0;break;
				case KEY1_PRES:LED1 = !LED1;break;
				case WKUP_PRES:LED0 = !LED0,LED1 = !LED1;break;
				default:delay_ms(10);
			}
	}
}

发布了34 篇原创文章 · 获赞 7 · 访问量 1871

猜你喜欢

转载自blog.csdn.net/qq_43628761/article/details/103929279