做着玩玩(做这个的时候感觉有点像参加蓝桥杯之前做的那些测试,当时看的B站上一个叫小蜜蜂的老师),为智能门锁小项目做个准备。
一、原理图
按键key0对应PA0引脚,key1、2、3分别是PE2、3、4引脚。
二、相关主要代码
1、key.c文件
#include "key.h"
#include "stm32f4xx.h" // Device header
#include "oled.h"
#include "delay.h"
void key_init(void)
{
// GPIO信息配置结构体
GPIO_InitTypeDef GPIO_InitStructure;
// 1、GPIO硬件使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
// 2、GPIO信息配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 引脚:第1根引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // 模式:输入模式
GPIO_Init(GPIOA, &GPIO_InitStructure); // 通过此函数,将配置的信息写入到相应的寄存器中
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4; // 引脚:第1根引脚
GPIO_Init(GPIOE, &GPIO_InitStructure); // 通过此函数,将配置的信息写入到相应的寄存器中
}
unsigned char check_key(void)
{
if(key0==0)
{delay_ms(20);while(key0==0);return 1;}
if(key1==0)
{delay_ms(20);while(key1==0);return 2;}
if(key2==0)
{delay_ms(20);while(key2==0);return 3;}
if(key3==0)
{delay_ms(20);while(key3==0);return 4;}
return 0;
}
unsigned char keynum;
void show_keynum(void)
{
unsigned char s;
s=check_key();
if(s!=0)
{keynum=s;}
OLED_ShowCHinese(0,0,keynum);
}
这里这样子弄想起了当时蓝桥杯自己做的笔记:(偏新手了23333)
2、key.h文件
#ifndef __key_h__
#define __key_h__
extern void key_init(void);
#define key0 GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)
#define key1 GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_2)
#define key2 GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_3)
#define key3 GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4)
unsigned char check_key(void);
void show_keynum(void);
#endif
3、main.c文件
#include "work.h"
#include "oled.h"
#include "key.h"
int main(void)
{
system_init();
while(1)
{
show_keynum();
}
}
注意:函数system_init()作为初始化用,里面包含相关的初始化函数信息——(函数system_init()存放在work.h文件里)
void system_init(void)
{
SysTick_Init(168);
OLED_Init(); // oled模块引脚初始化
OLED_Clear(); // oled模块清屏(清全屏)
led_init();
key_init();
}
4、oled的汉字库(只展示相关部分,因为其它用不上)
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00},/*"1",1*/
/* (8 X 16 , 宋体 )*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x08,0x08,0x08,0x08,0xF0,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00},/*"2",2*/
/* (8 X 16 , 宋体 )*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x08,0x08,0x08,0x88,0x70,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x20,0x21,0x21,0x22,0x1C,0x00},/*"3",3*/
/* (8 X 16 , 宋体 )*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x30,0xF8,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x05,0x24,0x24,0x3F,0x24,0x24},/*"4",4*/
/* (8 X 16 , 宋体 )*/
三、运行效果
可以看到显示初始为0,按下按键后0.96寸oled显示屏一直显示所设置的按键值