欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STM32按键

程序员文章站 2022-07-12 10:18:56
...

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

相关标签: STM32