STM32按键
程序员文章站
2022-07-12 10:18:56
...
STM32GPIO以及按键
- mini版的stm32f10x有四组通用IO口:PA(0-15)、PB(0-15)、PC(0-15)、PD(0-2)
- 输入分为:输入浮空、输入上拉、输入下拉、模拟输入
- 输出分为:开漏输出、开楼复用输出、推挽式输出、推挽式复用输出
- 翻转速率分为:2MHz、10MHz、50MHz
在写程序的时候要结合原理图和中文参考手册,读原理图的时候看清楚引脚的编号。
初始化函数
在使用每一个GPIO之前都必须要进行初始化,最好要写进新的文件中,留出接口便于主函数调用。
- 初始化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
- 初始化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)
- 主函数
#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之按键输入实验
下一篇: stm32学习笔记(二)按键实验