登录/注册

stm32f103显示和按键

更多

在STM32F103上实现显示和按键功能,通常需要以下步骤(以OLED显示和独立按键为例):

一、硬件连接

  1. OLED显示模块(I²C接口)

    • SCL → PB6(I²C1时钟)
    • SDA → PB7(I²C1数据)
    • VCC → 3.3V
    • GND → GND
  2. 独立按键

    • KEY1 → PA0(配置为上拉输入,按键接地)
    • KEY2 → PA1
    • 按键另一端接GND

二、软件实现

1. OLED显示驱动

// I²C初始化(CubeMX配置)
void MX_I2C1_Init(void) {
  hi2c1.Instance = I2C1;
  hi2c1.Init.ClockSpeed = 400000;
  hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
  // ...其他配置
}

// OLED初始化函数
void OLED_Init(void) {
  // 发送初始化指令序列
  OLED_WriteCmd(0xAE); // 关闭显示
  // ...更多初始化命令
  OLED_WriteCmd(0xAF); // 开启显示
}

// 显示字符串示例
void OLED_ShowString(uint8_t x, uint8_t y, char *str) {
  while(*str) {
    OLED_ShowChar(x, y, *str);
    x += 8;
    str++;
  }
}

2. 按键检测

// 按键初始化(GPIO配置)
void Key_Init(void) {
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  // 使能PA时钟
  __HAL_RCC_GPIOA_CLK_ENABLE();
  // PA0 PA1配置
  GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

// 按键扫描函数(带消抖)
uint8_t Key_Scan(void) {
  static uint8_t key_up = 1;
  if(key_up && (KEY1==0 || KEY2==0)) {
    HAL_Delay(10); // 消抖延时
    key_up = 0;
    if(KEY1 == 0) return 1;
    else if(KEY2 == 0) return 2;
  } else if(KEY1==1 && KEY2==1) {
    key_up = 1;
  }
  return 0;
}

3. 主程序逻辑

int main(void) {
  HAL_Init();
  MX_GPIO_Init();
  MX_I2C1_Init();
  OLED_Init();
  Key_Init();

  OLED_ShowString(0, 0, "Press Key:");

  while(1) {
    uint8_t key = Key_Scan();
    if(key == 1) {
      OLED_ShowString(0, 2, "KEY1 Pressed ");
    } else if(key == 2) {
      OLED_ShowString(0, 2, "KEY2 Pressed ");
    }
    HAL_Delay(50);
  }
}

三、关键点说明

  1. 显示驱动

    • 需要根据具体显示屏型号修改初始化命令
    • 可使用现成的OLED驱动库(如中景园驱动)
    • 支持ASCII字符和汉字显示(需字库)
  2. 按键处理

    • 建议采用状态机实现长按/短按识别
    • 可使用外部中断提高响应速度
    • 按键消抖推荐使用定时器中断扫描
  3. 资源优化

    • 对于频繁刷新显示,建议使用DMA传输
    • 使用双缓冲机制避免屏幕闪烁

四、扩展建议

  1. 使用FreeRTOS管理任务(显示刷新和按键扫描分离)
  2. 添加菜单系统(使用结构体实现多级菜单)
  3. 结合RTC模块实现时间显示
  4. 增加EEPROM存储用户设置

实际开发中建议:

  1. 使用STM32CubeMX生成初始化代码
  2. 分模块测试(先确保显示正常,再测试按键)
  3. 使用逻辑分析仪检查I²C时序
  4. 注意电源稳定性(显示屏供电不足会导致花屏)

STM32F103VET6

1970-01-01 08:00:00 至 1970-01-01 08:00:00

ARM系列STM32F103芯片的解密方法

本文介绍ARM系列STM32F103芯片的解密方法,其内核是Cortex-M3,内存从16K-512K都有。

2024-02-28 11:20:34

stm32f103 flash模拟eeprom

STM32F103是意法半导体(STMicroelectronics)推出的一款32位单片机系列,该系列芯片具有高性能和丰富的外设接口,广泛应用于工业控制、消费电子、汽车电子等领域。其中

2024-01-09 11:21:36

基于STM32F103的SVPWM算法实现

基于STM32F103的SVPWM算法实现

资料下载 jinyi7016 2022-03-22 12:12:17

基于STM32f103的输入捕获测频率和占空比

基于STM32f103的输入捕获测频率和占空比

资料下载 shyshyshy 2021-08-02 10:10:24

基于STM32f103的FFT频率测试程序下载

基于STM32f103的FFT频率测试程序下载

资料下载 shyshyshy 2021-08-02 10:07:20

基于STM32f103使用的DAC正弦波

基于STM32f103使用的DAC正弦波

资料下载 shyshyshy 2021-08-02 10:05:00

STM32F103按键控制数码管加减仿真

STM32F103的按键控制数码管加减仿真

资料下载 Gd12 2021-06-21 09:12:50

学习STM32F103的ADC功能

三勺最近在学习STM32F103的ADC功能,居然连最简单的独立模式的单通道的电压采集都不能实现,这就不能忍了,这是对智商的侮辱。

2023-10-24 16:06:03

学习STM32F103的DAC功能

三勺最近在学习STM32F103的DAC功能,本文主要解释在配置DAC寄存器实现相应功能时遇到的一些问题。

2023-10-24 16:00:10

ARM系列STM32F103芯片的解密方法

破解STM32F103芯片的方法

2023-09-19 09:03:40

ch32v103stm32f103的区别

ch32v103与stm32f103的区别  Ch32v103与STM32f103

2023-08-22 15:49:00

STM32F103 GPIO内部电路图讲解

STM32F103 GPIO内部电路图讲解

2023-02-01 16:32:14

基于STM32F103单片机的矩阵按键设计

本实验使用STM32F103单片机,主题代码通用的。

2022-12-09 17:18:46

stm32f030和stm32f103功能差异

stm32f030和stm32f103功能差异主要表现在哪?

2021-07-22 09:35:47

7天热门专题 换一换
相关标签