野火stm32oled屏幕显示rtc时间标准库程序
时间: 2023-08-01 07:13:09 浏览: 127
下面是一个野火STM32开发板的OLED屏幕显示RTC时间标准库程序,代码注释比较详细,可以参考一下:
```
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_i2c.h"
// OLED屏幕I2C地址
#define OLED_ADDRESS 0x78
// OLED屏幕宽度和高度
#define OLED_WIDTH 128
#define OLED_HEIGHT 64
// OLED屏幕缓冲区
uint8_t oled_buffer[1024];
// RTC时间结构体
RTC_TimeTypeDef RTC_TimeStructure;
// I2C初始化函数
void I2C_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
I2C_InitTypeDef I2C_InitStructure;
// 使能I2C和GPIO时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
// 配置I2C引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// 配置I2C
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0x00;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 400000;
I2C_Init(I2C1, &I2C_InitStructure);
// 使能I2C
I2C_Cmd(I2C1, ENABLE);
}
// OLED屏幕初始化函数
void OLED_Init(void)
{
// 发送初始化命令
uint8_t oled_init_cmds[] = {
0xAE, // 关闭显示
0xD5, 0x80, // 设置时钟分频因子,震荡频率
0xA8, 0x3F, // 设置驱动路数
0xD3, 0x00, // 设置显示偏移
0x40, // 设置首行地址
0x8D, 0x14, // 启用电荷泵
0x20, 0x00, // 水平寻址模式
0xA0, 0xC0, // 设置段重定义
0xA1, // 段输出方向
0xC8, // 常规输出
0xDA, 0x12, // 设置COM硬件引脚配置
0x81, 0xCF, // 设置对比度
0xD9, 0xF1, // 设置预充电周期
0xDB, 0x40, // 设置VCOMH
0xA4, // 全局显示开启
0xA6, // 设置非反显
0xAF // 开启显示
};
for (uint8_t i = 0; i < sizeof(oled_init_cmds); i++) {
uint8_t cmd = oled_init_cmds[i];
I2C_SendData(I2C1, OLED_ADDRESS, &cmd, 1);
}
// 清空缓冲区
for (uint16_t i = 0; i < sizeof(oled_buffer); i++) {
oled_buffer[i] = 0;
}
// 刷屏
OLED_Update();
}
// OLED屏幕更新函数
void OLED_Update(void)
{
// 发送数据到OLED屏幕
uint16_t data_length = OLED_WIDTH * OLED_HEIGHT / 8;
I2C_SendData(I2C1, OLED_ADDRESS, oled_buffer, data_length);
}
// RTC时间读取函数
void RTC_ReadTime(void)
{
// 获取RTC时间配置结构体
RTC_GetTime(RTC_Format_BIN, &RTC_TimeStructure);
}
// RTC时间显示函数
void OLED_ShowTime(void)
{
// 转换时间为字符串
char time_string[9];
sprintf(time_string, "%02d:%02d:%02d", RTC_TimeStructure.RTC_Hours, RTC_TimeStructure.RTC_Minutes, RTC_TimeStructure.RTC_Seconds);
// 在OLED屏幕上显示时间
OLED_Clear();
OLED_PutString(0, 0, time_string);
OLED_Update();
}
// 主函数
int main(void)
{
// 初始化系统时钟
RCC_Configuration();
// 初始化I2C
I2C_Configuration();
// 初始化OLED屏幕
OLED_Init();
// 循环读取并显示RTC时间
while (1) {
// 读取RTC时间
RTC_ReadTime();
// 显示RTC时间
OLED_ShowTime();
}
}
```
阅读全文