使用SPI接口的OLED数据显示

这篇博客介绍了如何使用STM32F103通过SPI接口驱动OLED显示屏,展示学号姓名、AHT20传感器的温度和湿度数据,并实现字符的滑动显示。首先,理解OLED屏显和汉字点阵编码原理,使用PCtoLCD2002生成字模。接着,详细说明了如何连接OLED和AHT20到STM32芯片,以及显示和滚动显示的具体代码实现。

任务:
理解OLED屏显和汉字点阵编码原理,使用STM32F103的SPI接口实现以下功能:

  1. 显示自己的学号和姓名;
  2. 显示AHT20的温度和湿度;
  3. 上下或左右的滑动显示长字符
器件准备:一块STM32d103最小芯片,一块AHT20温湿度传感器,一块TTL转串口芯片,一块0.96寸OLED显示屏模块

资料:https://detail.tmall.com/item.htm?spm=a1z0d.6639537.1997196601.80.201d74841fbMPw&id=556732249552
在这里插入图片描述
OLDE与STM32芯片连接

OLED模块 STM32芯片
VCC DC 5V/3.3V
GND GND
D1 PB15
CS PB11
RES PB12
DC PB10
D0 PB13

AHT20与STM32芯片连接

AHT20 STM32芯片
VCC 3.3V
SDA B7
GND GND
SCL B6

理解OLED屏显和汉字点阵编码原理

1、打开上面资料下载的文件解压
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

我选择点阵大小为16 X 16,更改设置。

在这里插入图片描述
在这里插入图片描述
将生成的字模复制,粘贴到oledfront.h文件中。

用16×16点阵来表示一个汉字,则该汉字图形由16行16列共256个点构成,这256个点需用256个二进制的位来描述,需要32个字节来存储用于存放图形信息,这样的二进制代码串称为汉字的“字模”。

汉字的显示原理

  1. 从键盘输入的汉字经过键盘管理模块,变换成机内码。

  2. 然后经字模检索程序,查到机内码对应的点阵信息在字模库的地址。

  3. 从字库中检索出该汉字点阵信息。

  4. 利用显示驱动程序将这些信息送到显示卡的显示缓冲存储器中。

  5. 显示器的控制器把点阵信息整屏顺次读出,并使每一个二进制位与屏幕的一个点位相对应,就可以将汉字字形在屏幕上显示出来。

任务一

OLED屏显示学号姓名。
1、使用PCtoLCD2002(上图工具),输入学号姓名。

在这里插入图片描述

2、将生成字模,复制到工程文件oledfront.h中。
在这里插入图片描述3、改写main.c函数中TEST_MainPage()函数。左键单击函数所在位置,然后跳转。
在这里插入图片描述
在这里插入图片描述
4、显示效果
在这里插入图片描述

任务二

显示AHT20的温度和湿度;
代码

#include "temhum.h"
#include "gui.h"

//读取AHT20的状态寄存器
u8 AHT20_Read_Status(void)
{
   
   
	u8 Byte_first,flag;	
	IIC_Start();
  AHT20_WR_Byte(0x71);
	flag=Receive_ACK();
	Byte_first = AHT20_RD_Byte(flag);
	IIC_NAck();
	IIC_Stop();

	return Byte_first;
}

//向AHT20发送AC命令
void AHT20_SendAC(void) 
{
   
   
	IIC_Start();
	AHT20_WR_Byte(0x70);    //启动传输后发送的01110000 (最后1bit表示读/写 0--写,1--读)
	Receive_ACK();
	AHT20_WR_Byte(0xac);//0xAC采集命令 命令参数有两个字节,第一个字节为 0x33,第二个字节为0x00。
	Receive_ACK();
	AHT20_WR_Byte(0x33);
	Receive_ACK();
	AHT20_WR_Byte(0x00);
	Receive_ACK();
	IIC_Stop();

}

//初始化AHT20
void AHT20_Init(void)   
{
   
   	
	IIC_Init();
	IIC_Start();
	AHT20_WR_Byte(0x70);
	Receive_ACK();
	AHT20_WR_Byte(0xa8);//0xA8进入NOR工作模式
	Receive_ACK();
	AHT20_WR_Byte(0x00);
	Receive_ACK();
	AHT20_WR_Byte(0x00);
	Receive_ACK();
	IIC_Stop();

	delay_ms(10);//延时10ms左右

	IIC_Start();
	AH
在单片机上通过SPI接口连接和控制OLED显示屏,是一种常见的嵌入式系统应用。实现该功能需要从硬件连接、软件配置和驱动逻辑三个方面入手。以下为实现方法的详细说明: ### 一、硬件连接与接口定义 OLED显示屏通常使用SSD1306等驱动芯片,其SPI接口包括以下几个关键引脚: - **SCLK**:SPI时钟信号,由单片机提供。 - **MOSI**:主出从入数据线,用于单片机向OLED发送数据。 - **CS**:片选信号,低电平有效,用于选择OLED设备。 - **DC**:数据/命令选择引脚,高电平表示发送数据,低电平表示发送命令。 - **RST**:复位引脚,用于初始化OLED。 在STM32等单片机上,需将上述引脚连接至相应的GPIO口,并配置为SPI主模式或模拟SPI模式。若使用硬件SPI模块,可提升通信效率和稳定性[^1]。 ### 二、SPI通信配置 在STM32中配置SPI接口时,需要设置以下参数: - **SPI模式**:根据OLED模块的要求选择SPI模式(如模式0或模式3)。 - **数据长度**:通常为8位。 - **波特率预分频值**:控制SPI通信速率,需在OLED支持范围内设置。 - **MSB/LSB先发**:OLED通常采用MSB先发。 以下为SPI初始化的示例代码片段: ```c void SPI_Init(void) { SPI_HandleTypeDef hspi; hspi.Instance = SPI1; hspi.Init.Mode = SPI_MODE_MASTER; hspi.Init.Direction = SPI_DIRECTION_1LINE; hspi.Init.DataSize = SPI_DATASIZE_8BIT; hspi.Init.CLKPolarity = SPI_POLARITY_LOW; hspi.Init.CLKPhase = SPI_PHASE_1EDGE; hspi.Init.NSS = SPI_NSS_SOFT; hspi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16; hspi.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi.Init.TIMode = SPI_TIMODE_DISABLE; hspi.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; HAL_SPI_Init(&hspi); } ``` ### 三、OLED驱动逻辑 OLED显示屏的驱动逻辑主要包括初始化流程、命令发送和数据发送。 #### 1. 初始化流程 OLED初始化通常包括发送一系列命令以配置显示参数,如设置显示开启、亮度、地址模式等。例如: ```c void OLED_Init(void) { OLED_Write_Cmd(0xAE); // 关闭显示 OLED_Write_Cmd(0xD5); // 设置时钟分频 OLED_Write_Cmd(0x80); OLED_Write_Cmd(0xA8); // 设置多路复用比 OLED_Write_Cmd(0x3F); OLED_Write_Cmd(0xD3); // 设置显示偏移 OLED_Write_Cmd(0x00); OLED_Write_Cmd(0x40); // 设置显示开始行 OLED_Write_Cmd(0x8D); // 电荷泵设置 OLED_Write_Cmd(0x14); OLED_Write_Cmd(0x20); // 设置地址模式 OLED_Write_Cmd(0x00); OLED_Write_Cmd(0xA1); // 设置段重映射 OLED_Write_Cmd(0xC8); // 设置公共输出扫描方向 OLED_Write_Cmd(0xDA); // 设置COM引脚配置 OLED_Write_Cmd(0x12); OLED_Write_Cmd(0xDB); // 设置VCOMH电压 OLED_Write_Cmd(0x20); OLED_Write_Cmd(0xAF); // 开启显示 } ``` #### 2. 命令与数据发送 命令和数据的发送依赖于DC引脚的状态。命令发送时将DC置低,数据发送时将DC置高。例如: ```c void OLED_Write_Cmd(uint8_t cmd) { HAL_GPIO_WritePin(OLED_DC_GPIO_Port, OLED_DC_Pin, GPIO_PIN_RESET); // DC=0,命令 HAL_SPI_Transmit(&hspi, &cmd, 1, HAL_MAX_DELAY); } void OLED_Write_Data(uint8_t data) { HAL_GPIO_WritePin(OLED_DC_GPIO_Port, OLED_DC_Pin, GPIO_PIN_SET); // DC=1,数据 HAL_SPI_Transmit(&hspi, &data, 1, HAL_MAX_DELAY); } ``` ### 四、显示内容控制 OLED显示内容通过写入帧缓冲区实现。通常将显示区域划分为页(Page)和列(Column),通过设置起始地址,逐行写入像素数据。例如,清屏操作可通过以下方式实现: ```c void OLED_Clear(void) { for (uint8_t page = 0; page < 8; page++) { OLED_Write_Cmd(0xB0 + page); // 设置页地址 OLED_Write_Cmd(0x00); // 设置列低地址 OLED_Write_Cmd(0x10); // 设置列高地址 for (uint8_t col = 0; col < 128; col++) { OLED_Write_Data(0x00); // 清空数据 } } } ``` 对于显示字符或图片,需使用字模软件提取字库数据,并将其写入指定位置。例如,显示ASCII字符可通过查找字库数组实现: ```c void OLED_ShowChar(uint8_t x, uint8_t y, char ch) { uint8_t *font = (uint8_t *)&font8x16[(ch - 32) * 16]; // 16x8字体 for (uint8_t i = 0; i < 16; i++) { OLED_Write_Cmd(0xB0 + y + i / 16); OLED_Write_Cmd(0x00 + (x % 16)); OLED_Write_Cmd(0x10 + (x / 16)); OLED_Write_Data(*font++); } } ``` ### 五、实际应用与扩展 在实际应用中,可以扩展以下功能: - **滚动显示长字符串**:利用OLED的硬件滚动功能或软件模拟滚动。 - **动态刷新**:仅刷新发生变化的区域,提高效率。 - **图形绘制**:绘制线条、矩形、圆形等基本图形。 - **传感器数据显示**:结合AHT20等传感器,实时显示温湿度等信息。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值