基于STM32的0.96寸OLED显示屏显示数据
一、利用SPI串口在OLED屏幕上显示数据
1.什么是SPI
SPI(Serial Peripheral Interface)就是串行外围设备接口。
SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚。SPI 是一个环形总线结构,由 ss(cs)、sck、sdi、sdo 构成,时序主要是在 sck 的控制下,两个双向移位寄存器进行数据交换。
上升沿发送、下降沿接收、高位先发送。
上升沿到来的时候,sdo 上的电平将被发送到从设备的寄存器中。
下降沿到来的时候,sdi 上的电平将被接收到主设备的寄存器中。
2.使用0.96寸OLED显示屏显示数据
本次使用的开发板为野火stm32指南者
利用OLED所带的官方代码进行改进
下载解压后,选择1-Demo->Demo_STM32->0.96inch_OLED_Demo_STM32F103RCT6_Hardware_4-wire_SPI->PROJECT里面找到工程文件
具体连接方式入main函数的注释一样进行连接
而此时将其烧录到板子中是他原厂的一些东西,不是我们想要的
要想输出我们想要的一些汉字,需要了解中文的点阵(16*16)

在此字库种找到那些我们需要的汉字或者数字等,然后使用他们的16进制码,才能显示我们想要的文字
这是我等下将要输入的汉字的代码
DB 04H 40H 3FH F8H 04H 40H 04H 40H FFH FEH 01H 00H 1FH F0H 11H 10H;
DB 11H 10H 1FH F0H 11H 10H 11H 10H 1FH F0H 04H 40H 08H 20H 10H 10H;"黄",0
DB 00H 40H 00H 40H 78H A0H 49H 10H 4AH 08H 4CH 06H 4BH F8H 48H 00H;
DB 48H 00H 4BH F8H 7AH 08H 4AH 08H 02H 08H 02H 08H 03H F8H 02H 08H;"哈",1
DB 00H 40H 00H 40H 78H A0H 49H 10H 4AH 08H 4CH 06H 4BH F8H 48H 00H;
DB 48H 00H 4BH F8H 7AH 08H 4AH 08H 02H 08H 02H 08H 03H F8H 02H 08H;"哈",2
实现显示代码
void TEST_MainPage(void)
{
GUI_ShowCHinese(20,20,16,"黄哈哈",1);//中文姓名
GUI_ShowString(10,40,"631807030114",16,1);//数字详细
delay_ms(1500);
delay_ms(1500);
}
主函数如下:
int main(void)
{
delay_init(); //延时函数初始化
OLED_Init(); //初始化OLED
OLED_Clear(0); //清屏(全黑)
while(1)
{
TEST_MainPage(); //界面显示
}
}
显示结果
(眼睛看着没有帧变化,但手机照出来却有一闪一闪的)
二、显示AHT20的温度和湿度
1.实验代码
显示温湿度,需要将上述代码进行改变
添加bsp_i2c.c,bsp_i2c.,usart.c,usart.h文件到USER文件夹中
具体代码请移步:
链接: 利用ATH20连接stm32的温度采集
并在工程文件的USER中进行添加
然后向HARDWARE加入stm32f10x_usart.c,该文件在STM32F10x_FWLib\src中
温湿度几个字和冒号的字模要添加到oledfont.h中
添加相应的点阵字
"温",0x00,0x00,0x23,0xF8,0x12,0x08,0x12,0x08,0x83,0xF8,0x42,0x08,0x42,0x08,0x13,0xF8,
0x10,0x00,0x27,0xFC,0xE4,0xA4,0x24,0xA4,0x24,0xA4,0x24,0xA4,0x2F,0xFE,0x00,0x00,/*"温",0*/
"度",0x01,0x00,0x00,0x80,0x3F,0xFE,0x22,0x20,0x22,0x20,0x3F,0xFC,0x22,0x20,0x22,0x20,
0x23,0xE0,0x20,0x00,0x2F,0xF0,0x24,0x10,0x42,0x20,0x41,0xC0,0x86,0x30,0x38,0x0E,/*"度",0*/
"湿",0x00,0x00,0x27,0xF8,0x14,0x08,0x14,0x08,0x87,0xF8,0x44,0x08,0x44,0x08,0x17,0xF8,
0x11,0x20,0x21,0x20,0xE9,0x24,0x25,0x28,0x23,0x30,0x21,0x20,0x2F,0xFE,0x00,0x00,/*"湿",0*/
"显",0x00,0x00,0x1F,0xF0,0x10,0x10,0x10,0x10,0x1F,0xF0,0x10,0x10,0x10,0x10,0x1F,0xF0,
0x04,0x40,0x44,0x44,0x24,0x44,0x14,0x48,0x14,0x50,0x04,0x40,0xFF,0xFE,0x00,0x00,/*"显",0*/
"示",0x00,0x00,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x01,0x00,
0x01,0x00,0x11,0x10,0x11,0x08,0x21,0x04,0x41,0x02,0x81,0x02,0x05,0x00,0x02,0x00,/*"示",0*/

再修改主函数代码为
#include "delay.h"
#include "usart.h"
#include "bsp_i2c.h"
#include "sys.h"
#include "oled.h"
#include "gui.h"
#include "test.h"
int main(void)
{
delay_init(); //延时函数初始化
uart_init(115200);
IIC_Init();
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
OLED_Init(); //初始化OLED
OLED_Clear(0);
while(1)
{
//printf("温度湿度显示");
read_AHT20_once();
OLED_Clear(0);
delay_ms(1500);
}
}
实验结果
显示屏上显示出AHT20测出的温湿度
三、上下的滑动显示长字符
OLED屏的滚屏命令有水平平移和垂直和水平滚动两种方式
添加的两种代码如下:
水平左右
OLED_WR_Byte(0x2E,OLED_CMD); //关闭滚动
OLED_WR_Byte(0x26,OLED_CMD); //水平向左或者右滚动 26/27
OLED_WR_Byte(0x00,OLED_CMD); //虚拟字节
OLED_WR_Byte(0x00,OLED_CMD); //起始页 0
OLED_WR_Byte(0x07,OLED_CMD); //滚动时间间隔
OLED_WR_Byte(0x07,OLED_CMD); //终止页 7
OLED_WR_Byte(0x00,OLED_CMD); //虚拟字节
OLED_WR_Byte(0xFF,OLED_CMD); //虚拟字节
OLED_WR_Byte(0x2F,OLED_CMD); //开启滚动
垂直和水平滚动
OLED_WR_Byte(0x2e,OLED_CMD); //关闭滚动
OLED_WR_Byte(0x29,OLED_CMD); //水平垂直和水平滚动左右 29/2a
OLED_WR_Byte(0x00,OLED_CMD); //虚拟字节
OLED_WR_Byte(0x00,OLED_CMD); //起始页 0
OLED_WR_Byte(0x07,OLED_CMD); //滚动时间间隔
OLED_WR_Byte(0x07,OLED_CMD); //终止页 1
OLED_WR_Byte(0x01,OLED_CMD); //垂直滚动偏移量
OLED_WR_Byte(0x2F,OLED_CMD); //开启滚动
1.代码
采用最开始的工程文件,对其进行改造
把main.c改为如下(滑动字符根据自己的需要添加字模并改动)
#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "gui.h"
#include "test.h"
int main(void)
{
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
OLED_Init();
OLED_Clear(0);
while(1)
{
GUI_ShowString(0,0,"HCC",8,1);
delay_ms(50);
roll();
}
}
在HARDWARE的oled.c文件下的末尾加入以下代码
void roll(void)
{
OLED_WR_Byte(0x2e,OLED_CMD);
OLED_WR_Byte(0x29,OLED_CMD);
OLED_WR_Byte(0x00,OLED_CMD);
OLED_WR_Byte(0x00,OLED_CMD);
OLED_WR_Byte(0x07,OLED_CMD);
OLED_WR_Byte(0x07,OLED_CMD);
OLED_WR_Byte(0x01,OLED_CMD);
OLED_WR_Byte(0x2F,OLED_CMD);
}
实验结果
横屏
输入的数据“ HCC ”在显示屏上水平滑动
竖屏
“欢迎来到重交大”,在显示屏上垂直滑动
四、心得体会
通过本次实验,实现了利用ISP传输数据到OLED上,还结合了之前的AHT20芯片,通过另一种方式显示了采集的数据。其中,滚动的方式实现参考了许多资料,最后终于做了出来。