基于STM32任意键薄膜键盘代码
对于大多数人来说都写过51的按键扫描,但是对于32来说端口配置比较麻烦,对于按键扫描 *要配置相应的IO口模式,每种模式的特性是不一样的,可以通过按键的读写操作,对于各种模式有个深入的了解。
对薄膜键盘来说通过八个IO口进行扫描确认是哪个按键按下,然而一般的方式是采用行和列高低电平的反差来扫描判断的,那么我们对32 的IO口要进行写和读操作,学过32的人都知道,IO口的每一种模式都可读可写,但是对于外电路来说,不是每种模式都可以用来按键扫描。
GPIO_Mode_AIN = 0x0,
模拟输入,应用ADC 模拟输入
GPIO_Mode_IN_FLOATING = 0x04,
浮空输入,在悬空状态电平未知,一般在高低电平判决临界处,
GPIO_Mode_IPD = 0x28,
IO口内部下拉电阻输入
GPIO_Mode_IPU = 0x48,
IO口内部下拉电阻输入
GPIO_Mode_Out_OD = 0x14,
开漏输出,IO输出0接地,输出1悬空
GPIO_Mode_Out_PP = 0x10,
推挽输出 IO输出0接地,输出1接vcc
GPIO_Mode_AF_OD = 0x1C,
复用开漏输出,对于这个实在一些内部外设使用时要使用的,作为小白的我使用还是不太了解具体使用情况,只是知道大概在使用一些外设时需要使用。
GPIO_Mode_AF_PP = 0x18
复用推挽
其实对于上面的这么多模式,对于我们的中心按键扫描,可以配置很懂种模式实现,关键看是否稳定。我选用的扫描方式是以 行/列 输出为推挽输出,而 列/行 以
下拉输入为输入。
一、行/列 四个引脚 输出为推挽输出,输出比较稳定,高低电平分明,不易受外电路的干扰,
二、列/行 以下拉输入为输入,IO口电平状态默认是下拉的 ,及低电平,当外界给IO为高电平时,IO口就会被拉高,读取IO状态为高电平,很好的起到了读取外部IO的作用
之所以使用这种类型的IO配置,是因为它比较稳定,我也是小白,不太会写文字,第一次试着写的,下面粘贴代码吧
主函数
// An highlighted block
#include "stm32f10x.h"
#include "STK_H_Usart.h"
#include "bsp_led.h"
#include "stdio.h"
#include "STK_H_BMkey.h"
#include "bsp_SysTick.h"
int main(void)
{
uint8_t mmp=0;
//串口初始化
usart_config();
//LED 初始化
LED_GPIO_Config();
//按键扫描初始化
key_GPIO_Config(1);
//系统定时器初始化
SysTick_Init();
printf("今天是个好天气");
while(1)
{
mmp=key_seek();
SysTick_Delay_Ms(500);
printf("my world is %d\n",mmp);
}
}
扫描函数 .H文件
重定义了一些IO口名,便于更改引脚
这个文件就只是完成了这个时期,有点呆滞,
#ifndef __STK_H_BMKEY_H__
#define __STK_H_BMKEY_H__
#include "stm32f10x.h"
//第一组 行
//PC 6
#define KEY1_1_GPIO_PORT GPIOA
#define KEY1_1_GPIO_CLK RCC_APB2Periph_GPIOA
#define KEY1_1_GPIO_PIN GPIO_Pin_4
#define X1_0 GPIO_ResetBits(KEY1_1_GPIO_PORT, KEY1_1_GPIO_PIN);
#define X1_1 GPIO_SetBits(KEY1_1_GPIO_PORT, KEY1_1_GPIO_PIN);
//PC 8
#define KEY1_2_GPIO_PORT GPIOA
#define KEY1_2_GPIO_CLK RCC_APB2Periph_GPIOA
#define KEY1_2_GPIO_PIN GPIO_Pin_5
#define X2_0 GPIO_ResetBits(KEY1_2_GPIO_PORT, KEY1_2_GPIO_PIN);
#define X2_1 GPIO_SetBits(KEY1_2_GPIO_PORT, KEY1_2_GPIO_PIN);
//PA 8
#define KEY1_3_GPIO_PORT GPIOA
#define KEY1_3_GPIO_CLK RCC_APB2Periph_GPIOA
#define KEY1_3_GPIO_PIN GPIO_Pin_6
#define