STM32F103RCT6按键实现数字加减并把数字显示在OLED屏幕
时间: 2023-11-27 15:51:40 浏览: 343
基于STM32F103RCT6和OLED的时间显示
实现这个功能,需要以下步骤:
1. 硬件连接:将按键接到STM32F103RCT6的GPIO引脚上,将OLED屏幕接到STM32F103RCT6的SPI引脚上。
2. 初始化GPIO和SPI:使用HAL库初始化按键所连接的GPIO引脚和OLED屏幕所连接的SPI引脚。
3. 编写按键扫描函数:根据按键的连接方式,编写一个函数对按键进行扫描,判断按键是否按下,并返回按键状态。
4. 编写数字加减函数:根据按键状态,编写函数实现数字的加减操作。
5. 编写OLED显示函数:根据数字加减函数返回的结果,编写函数将数字显示在OLED屏幕上。
6. 主函数:在主函数中循环调用按键扫描函数、数字加减函数和OLED显示函数。
下面是一个简单的示例程序:
```c
#include "stm32f1xx_hal.h"
#include "ssd1306.h"
#define KEY_UP GPIO_PIN_0
#define KEY_DOWN GPIO_PIN_1
void SystemClock_Config(void);
void Error_Handler(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
ssd1306_Init();
ssd1306_Fill(Black);
ssd1306_UpdateScreen();
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = KEY_UP | KEY_DOWN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
int num = 0;
while (1)
{
if (HAL_GPIO_ReadPin(GPIOA, KEY_UP) == GPIO_PIN_RESET)
{
num++;
HAL_Delay(100);
}
if (HAL_GPIO_ReadPin(GPIOA, KEY_DOWN) == GPIO_PIN_RESET)
{
num--;
HAL_Delay(100);
}
char str[20];
sprintf(str, "num: %d", num);
ssd1306_SetCursor(0, 0);
ssd1306_WriteString(str, Font_7x10, White);
ssd1306_UpdateScreen();
}
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL6;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
| RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
{
Error_Handler();
}
}
void Error_Handler(void)
{
while (1)
{
}
}
```
在这个示例程序中,使用了ssd1306库来控制OLED屏幕,按键连接到了PA0和PA1引脚上。在while循环中,首先通过HAL_GPIO_ReadPin函数读取按键状态,然后根据按键状态进行数字加减操作,最后将数字显示在OLED屏幕上。注意,为了防止按键抖动,需要在数字加减操作之后加上一个短暂的延时。
阅读全文