蓝桥杯物联网竞赛_STM32L071_4_按键控制
1.实验板GPIO引脚无论是上拉还是下拉都可以检测出外界输入的高电平还是低电平,这和模拟电路不一样模拟电路是。这里oled.c没有引用Function.h文件所以有个函数没有定义,报了红线。来判断,当模拟电路引脚默认电平为低即0,那么外界输入为1或者0它都不能判断,
原理图:


当按键S1按下PC14接GND,为低电平
CubMX配置:

Keil配置:
main函数:
while (1)
{
/* USER CODE END WHILE */
OLED_ShowString(24, 0, "<KeyCheck>", 16);
if(Function_KEY_S1Check() == 1){
OLED_ShowString(32, 2, "key:", 16);
OLED_ShowString(64, 2, "PR", 16);
}
else{
OLED_ShowString(32, 2, "key:", 16);
OLED_ShowString(64, 2, "RL", 16);
}
/* USER CODE BEGIN 3 */
}
Function.c和.h函数:
#include "Function.h"
#include "i2c.h"
#include "oled.h"
void OLED_Write(unsigned char type, unsigned char data){
unsigned char Write_Data[2];
Write_Data[0] = type;
Write_Data[1] = data;
HAL_I2C_Master_Transmit(&hi2c3, 0x78, Write_Data, 2, 0xff);
}
void Function_OledEnable(unsigned char ms){
HAL_GPIO_WritePin(OLED_Power_GPIO_Port, OLED_Power_Pin, GPIO_PIN_RESET);
HAL_Delay(ms);
OLED_Init();
}
uint8_t Function_KEY_S1Check(void){
if(HAL_GPIO_ReadPin(KEY_S1_GPIO_Port, KEY_S1_Pin) == GPIO_PIN_RESET) return (uint8_t) 1;
else return (uint8_t) 0;
}
#ifndef __FUNCTION__
#define __FUNCTION__
#include <stdint.h>
void OLED_Write(unsigned char type, unsigned char data);
void Function_OledEnable(unsigned char ms);
uint8_t Function_KEY_S1Check(void);
#endif
效果:
按键松开:
按下:

OLED显示:
对于6*8的字符,纵向最多输出四行,横向最多输出16个
对于8*16的字符,每个字符战占两行,纵向最多输出两行,横向最多输出16个
对于本Oled屏幕其横向占128位,纵向估计为32位
至于为什么6*8字符打印横向最多也是16个,这是因为OLED_ShowString是按照每8字节打印一个字符,理论上如果用ShowChar函数横向最多能打印21个
还有一点就是打印超出部分会换行继续打印

拓展:
1.实验板GPIO引脚无论是上拉还是下拉都可以检测出外界输入的高电平还是低电平,这和模拟电路不一样模拟电路是1&0或1&1来判断,当模拟电路引脚默认电平为低即0,那么外界输入为1或者0它都不能判断,而实验板是通过输入电平是否能改变本引脚的电平大小来判断,外界输入电平导致本引脚电平变高,所以外界为高电平,外界输入导致本引脚变低外界为低电平
2.代码引用的头文件比较有意思,理论上通过头文件能将零散代码连在一起,个别报错还是能运行例如:
这里oled.c没有引用Function.h文件所以有个函数没有定义,报了红线
但是在main函数中这些代码通过头文件组合在一起了,能运行:
3.oled使能函数一定要放在i2c初始化函数后面,因为先将i2c初始化了才能传递信息,才能被oled接收,才能被显示:

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)