编写stm32f103c8t6驱动OLED显示一段字符的代码的
时间: 2023-11-19 22:07:11 浏览: 56
以下是使用STM32F103C8T6驱动OLED显示一段字符的示例代码。假设我们的OLED屏幕为128x64像素的SSD1306 OLED屏幕。
首先,需要在STM32CubeMX中配置相应的GPIO和SPI外设的引脚。假设我们使用PA5作为OLED屏幕的时钟引脚,PA7作为数据引脚。
1. 初始化SPI外设
```c
SPI_HandleTypeDef hspi1;
void MX_SPI1_Init(void)
{
/* SPI1 parameter configuration*/
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 10;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
Error_Handler();
}
}
```
2. 初始化OLED屏幕
```c
void OLED_Init(void)
{
OLED_Write_Cmd(0xAE); //关闭OLED
OLED_Write_Cmd(0x20); //设置内存地址模式
OLED_Write_Cmd(0x10); //00,水平地址模式;01,垂直地址模式;10,页地址模式;默认为0x02
OLED_Write_Cmd(0xB0); //设置页地址
OLED_Write_Cmd(0xC8); //设置COM方向;bit3: 0,普通模式;1,反向模式
OLED_Write_Cmd(0x00); //设置低列地址
OLED_Write_Cmd(0x10); //设置高列地址
OLED_Write_Cmd(0x40); //设置显示开始行[0~63]
OLED_Write_Cmd(0x81); //设置对比度
OLED_Write_Cmd(0xFF); //对比度调节 0x00~0xFF
OLED_Write_Cmd(0xA1); //设置段重定向
OLED_Write_Cmd(0xA6); //设置正常/反向显示
OLED_Write_Cmd(0xA8); //设置多路复用率
OLED_Write_Cmd(0x3F); //默认0x3F(1/64) 0x1F(1/32)
OLED_Write_Cmd(0xA4); //0xa4,输出按字节显示;0xa5,输出按bit显示
OLED_Write_Cmd(0xD3); //设置显示偏移
OLED_Write_Cmd(0x00); //不偏移
OLED_Write_Cmd(0xD5); //设置OSC分频比,低四位是分频比,高四位是时钟占空比
OLED_Write_Cmd(0xF0); //默认为0x80
OLED_Write_Cmd(0xD9); //设置预充电周期
OLED_Write_Cmd(0x22); //bit[1:0],Phase 1 (0x0~0xF)
OLED_Write_Cmd(0xDA); //设置COM硬件引脚配置
OLED_Write_Cmd(0x12);
OLED_Write_Cmd(0xDB); //设置VCOMH 电压倍率
OLED_Write_Cmd(0x20); //0x20,0.77xVcc
OLED_Write_Cmd(0x8D); //设置DC-DC开关模式
OLED_Write_Cmd(0x14); //0x10,DC-DC ON;0x14,DC-DC OFF
OLED_Write_Cmd(0xAF); //开启OLED
}
```
3. 写入指令和数据
```c
void OLED_Write_Cmd(uint8_t cmd)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); //拉低片选
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); //拉低CLK
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET); //拉低DAT
HAL_SPI_Transmit(&hspi1, &cmd, 1, 1000); //发送数据
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); //拉高片选
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); //拉高CLK
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET); //拉高DAT
}
void OLED_Write_Data(uint8_t data)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); //拉低片选
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); //拉低CLK
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET); //拉高DAT
HAL_SPI_Transmit(&hspi1, &data, 1, 1000); //发送数据
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); //拉高片选
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); //拉高CLK
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET); //拉高DAT
}
```
4. 在屏幕上显示字符
```c
void OLED_Show_Char(uint8_t x, uint8_t y, uint8_t chr)
{
uint8_t c = 0;
uint8_t i = 0;
c = chr - ' '; //得到偏移后的值
if (x > 120)
{
x = 0;
y++;
}
OLED_Set_Pos(x, y); //设置显示位置
for (i = 0; i < 6; i++)
OLED_Write_Data(F6x8[c][i]);
}
void OLED_Show_String(uint8_t x, uint8_t y, char *str)
{
uint8_t j = 0;
uint8_t k = 0;
while (str[k] != '\0')
{
OLED_Show_Char(x + j * 6, y, str[k]);
j++;
if (j > 20)
break;
k++;
}
}
```
其中,F6x8是一个包含ASCII码字符的数组,用来表示字符的点阵信息。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)