3、蓝牙打印机按键 - GPIO输入控制
1、硬件
1.1、看原理图
初始高电平,按键按下导通处于低电平状态。
PB8号引脚。
1.2、看手册
a、看系统架构
GPIOB号端口有APB2总线控制
b、RCC使能
RCC->APB2ENR的第3位控制GPIOB使能。
c、GPIOB寄存器配置
浮空输入模式下,I/O的电平状态是不确定的,完全由外部输入决定;
2、软件
2.1、创建key.c和key.h
key.h
#ifndef _KEY_H
#define _KEY_H
#include "stm32f10x.h"
#include "io_bit.h"
#define KEY1 PBin(8)
void init_key(void);
u8 key_scan(void);
#endif
key.c
#include "key.h"
#include "delay.h"
/********************************************************************
* 函数名: void init_key(void);
* 功能描述: 按键初始化
* 输入参数:无
* 返回: 无
* 其他:
* 硬件连接: PB8 高电平没有按下,低电平按下
*********************************************************************/
void init_key(void)
{
// 使能3号引脚
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
// 初始化引脚
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;
// 输入浮空
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB,&GPIO_InitStruct);
}
/********************************************************************
* 函数名: u8 key_scan(void);
* 功能描述: 按键扫描
* 输入参数:无
* 返回: 无
* 其他:
* 硬件连接: 按下返回1, 否则返回0
*********************************************************************/
u8 key_scan(void)
{
static u8 key_sta = 1; // 按键状态
if(key_sta && KEY1 == 0)
{
// 按键按下
key_sta = 0;
// 延时消抖
delay_ms(10);
if(KEY1 == 0)
{
return 1;
}
}
else if(KEY1 == 1)
{
// 按键抬起
key_sta = 1;
}
return 0;
}
2.2、添加key.c到项目中
2.3、按键测试
main.c
功能:通过按键控制LED的亮和灭。
#include "led.h"
#include "delay.h"
#include "key.h"
int main()
{
u8 key;
init_delay(72); // 全速72M
init_led();
init_key();
while(1)
{
key = key_scan();
if(key)
{
LED1 = !LED1;
}
}
}