本次将基于STM32实现在OLED屏幕上显示自己的学号及姓名,同时将AHQ的温度湿度采集结果也显示在屏幕上。
Part1. 理论介绍–SPI
1.SPI的定义
SPI(Serial Peripheral Interface)就是串行外围设备接口。
SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用 四根线,节约了芯片的管脚。SPI 是一个环形总线结构,由 ss(cs)、sck、sdi、 sdo 构成,时序主要是在 sck 的控制下,两个双向移位寄存器进行数据交换。
上升沿发送、下降沿接收、高位先发送。
上升沿到来的时候,sdo 上的电平将被发送到从设备的寄存器中。
下降沿到来的时候,sdi 上的电平将被接收到主设备的寄存器中。
2.SPI的连接方式
SS( Slave Select):从设备选择信号线,常称为片选信号线。
SCK (Serial Clock):时钟信号线,用于通讯数据同步。
MOSI (Master Output, Slave Input):主设备输出/从设备输入引脚。
MISO(Master Input,,Slave Output):主设备输入/从设备输出引脚。
3.SPI的通讯方式
MOSI 与 MISO 的信号只在 NSS 为低电平的时候才有效,在 SCK 的每个时钟周期 MOSI 和 MISO 传输一位数据。
Part2. 简单实现
首先,我们需要下载到0.96寸SPI_OLED模块配套资料包。链接附上
链接: http://www.lcdwiki.com/zh/0.96inch_SPI_OLED_Module
点击下载。下载好之后可以看到很多厂家为我们配置好的运行Demo。找到适合我们芯片的Demo运行,这里作者使用的是STM32F103C8T6。
打开我们需要的Demo编译运行烧录,看OLED屏幕上是否能显示字幕。实物对应连线如下:
模块引脚 STM32引脚
GND ------ GND
VCC ------ 3.3V/5V
D0 ------ PB13
D1 ------- PB15
RES ------ PB12
DC------ PB10
CS ------ PB11
Part3. 自定义更改显示字符
首先打开main.c,把TEST_MainPage之外的函数删除掉。我们只需要这一个显示函数。
之后可以右键跳转到这个函数的定义处,也可以通过打开test.c然后跳转到约66行处,可以看到字符显示由这个函数控制。我们可以通过更改显示的字来改变OLED屏幕上的显示。
改变好之后,我们还需要在字符库中添加这些汉字的字模。打开oledfont.h
,跳转到约273行的typFNT_GB16 cfont16[ ]这个函数,可以发现字模全部存储在这里。
然后,我们把需要的汉字字模添加到后面就可以了。这里推荐网址链接: https://www.zhetao.com/fontarray.html一键提取字模。
如图所示。
然后进行编译,烧录,就可以看到显示了!
Part4. 显示温度湿度
显示的原理相同,不过要增加一些代码,我们可以直接向工程中添加如下代码:
void read_AHT20(void)
{
uint8_t i;
for(i=0; i<6; i++)
{
readByte[i]=0;
}
//-------------
I2C_Start();
I2C_WriteByte(0x71);
ack_status = Receive_ACK();
readByte[0]= I2C_ReadByte();
Send_ACK