stm32f103c8t6驱动oled屏幕
时间: 2023-09-01 20:13:05 浏览: 128
要驱动OLED屏幕,您需要连接OLED屏幕到STM32F103C8T6,并使用STM32F103C8T6的GPIO口和SPI口来控制OLED屏幕。
以下是一些基本的步骤:
1. 首先,您需要查看OLED屏幕的数据手册,以确定其电路连接和通信协议。大多数OLED屏幕使用SPI通信协议。
2. 接下来,根据OLED屏幕的电路连接,将其连接到STM32F103C8T6的GPIO口和SPI口上。
3. 在代码中,您需要初始化SPI接口和GPIO口。使用STM32F103C8T6的SPI接口和GPIO口,您可以发送命令和数据到OLED屏幕,并控制其显示。
4. 编写代码来初始化OLED屏幕和设置其参数,例如显示区域,字体,颜色等。
5. 最后,将要显示的数据发送到OLED屏幕,以显示它们。
下面是参考代码:
```c
#include "stm32f10x.h"
#define OLED_DC_PIN GPIO_Pin_1 // OLED DC信号引脚
#define OLED_DC_PORT GPIOA // OLED DC信号引脚所在的GPIO端口
#define OLED_RST_PIN GPIO_Pin_2 // OLED RST信号引脚
#define OLED_RST_PORT GPIOA // OLED RST信号引脚所在的GPIO端口
#define OLED_CS_PIN GPIO_Pin_4 // OLED CS信号引脚
#define OLED_CS_PORT GPIOA // OLED CS信号引脚所在的GPIO端口
#define OLED_CMD 0 // OLED命令
#define OLED_DATA 1 // OLED数据
// 定义SPI口初始化函数
void SPI_Configuration(void)
{
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
// 打开SPI口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
// 配置SPI口引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 配置SPI口参数
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);
// 打开SPI口
SPI_Cmd(SPI1, ENABLE);
}
// 定义GPIO口初始化函数
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// 打开GPIO口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 配置OLED DC信号引脚
GPIO_InitStructure.GPIO_Pin = OLED_DC_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(OLED_DC_PORT, &GPIO_InitStructure);
// 配置OLED RST信号引脚
GPIO_InitStructure.GPIO_Pin = OLED_RST_PIN;
GPIO_Init(OLED_RST_PORT, &GPIO_InitStructure);
// 配置OLED CS信号引脚
GPIO_InitStructure.GPIO_Pin = OLED_CS_PIN;
GPIO_Init(OLED_CS_PORT, &GPIO_InitStructure);
// 初始化OLED RST引脚
GPIO_SetBits(OLED_RST_PORT, OLED_RST_PIN);
}
// 定义OLED写入命令函数
void OLED_WriteCmd(uint8_t cmd)
{
GPIO_ResetBits(OLED_DC_PORT, OLED_DC_PIN); // 设置为写入命令
GPIO_ResetBits(OLED_CS_PORT, OLED_CS_PIN); // 选中OLED屏幕
SPI_I2S_SendData(SPI1, cmd); // 发送命令
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET) {} // 等待传输完成
GPIO_SetBits(OLED_CS_PORT, OLED_CS_PIN); // 取消选中OLED屏幕
}
// 定义OLED写入数据函数
void OLED_WriteData(uint8_t dat)
{
GPIO_SetBits(OLED_DC_PORT, OLED_DC_PIN); // 设置为写入数据
GPIO_ResetBits(OLED_CS_PORT, OLED_CS_PIN); // 选中OLED屏幕
SPI_I2S_SendData(SPI1, dat); // 发送数据
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET) {} // 等待传输完成
GPIO_SetBits(OLED_CS_PORT, OLED_CS_PIN); // 取消选中OLED屏幕
}
// 定义OLED初始化函数
void OLED_Init(void)
{
// 初始化GPIO口和SPI口
GPIO_Configuration();
SPI_Configuration();
// 设置OLED屏幕参数
OLED_WriteCmd(0xAE); // 关闭OLED屏幕
OLED_WriteCmd(0xD5); // 设置时钟分频率、振荡器频率
OLED_WriteCmd(0x80); // 分频率:1,振荡器频率:0x80
OLED_WriteCmd(0xA8); // 设置驱动电路的DUTY(1/64)
OLED_WriteCmd(0x3F); // 设置DUTY为1/64
OLED_WriteCmd(0xD3); // 设置显示偏移
OLED_WriteCmd(0x00);
OLED_WriteCmd(0x40); // 设置显示起始行
OLED_WriteCmd(0x8D); // 设置充电泵电压
OLED_WriteCmd(0x14); // 9V电压
OLED_WriteCmd(0x20); // 设置内存地址模式
OLED_WriteCmd(0x00);
OLED_WriteCmd(0xA1); // 设置段重定向
OLED_WriteCmd(0xC0); // 设置COM扫描方向
OLED_WriteCmd(0xDA); // 设置COM硬件引脚配置
OLED_WriteCmd(0x12);
OLED_WriteCmd(0x81); // 设置亮度
OLED_WriteCmd(0xCF); // 设置亮度值
OLED_WriteCmd(0xD9); // 设置预充电周期
OLED_WriteCmd(0xF1);
OLED_WriteCmd(0xDB); // 设置VCOMH电压倍率
OLED_WriteCmd(0x40);
OLED_WriteCmd(0xA4); // 关闭全局显示
OLED_WriteCmd(0xA6); // 设置显示方式
OLED_WriteCmd(0xAF); // 打开OLED屏幕
}
// 定义OLED清屏函数
void OLED_Clear(void)
{
uint8_t i, j;
for (i = 0; i < 8; i++) // 清除每一行
{
OLED_WriteCmd(0xB0 + i); // 设置行地址
for (j = 0; j < 128; j++) // 清除每一列
{
OLED_WriteData(0x00); // 填充0x00
}
}
}
// 定义OLED显示字符函数
void OLED_ShowChar(uint8_t x, uint8_t y, uint8_t chr)
{
uint8_t i;
OLED_WriteCmd(0xB0 + y); // 设置行地址
OLED_WriteCmd(((x & 0xF0) >> 4) | 0x10); // 设置列地址高4位
OLED_WriteCmd((x & 0x0F) | 0x00); // 设置列地址低4位
for (i = 0; i < 8; i++) // 显示每一行数据
{
OLED_WriteData(Font8x8[(uint16_t)chr][i]); // 显示字符数据
}
}
// 定义OLED显示字符串函数
void OLED_ShowString(uint8_t x, uint8_t y, uint8_t *str)
{
while (*str) // 逐个显示每个字符
{
OLED_ShowChar(x, y, *str);
x += 8; // 下一个字符的横坐标增加8个像素
str++;
}
}
int main(void)
{
OLED_Init(); // 初始化OLED屏幕
OLED_Clear(); // 清屏
OLED_ShowString(0, 0, "Hello World!"); // 显示字符串
while (1)
{
// 此处可添加其他操作
}
}
```
此代码仅供参考,您需要根据实际情况进行修改和调整。
阅读全文