基于SPI的0.96OLED数据显示温湿度

关于SPI

SPI 接口是 Motorola 首先提出的全双工三线同步串行外围接口,采用主从模式(Master Slave)架构;支持多 slave 模式应用,一 般仅支持单 Master。 时钟由 Master 控制,在时钟移位脉冲下,数据按位传输,高位在前,低位在后(MSB first);SPI 接口有 2 根单向数据线,为全双工通信,目前应用中的数据速率可达几 Mbps 的水平。


提示:以下是本篇文章正文内容,下面案例可供参考

0.96OLED屏幕

相关资料:0.96inch SPI OLED Module(下载原始代码)


屏幕滚动和读取显示AHT20温湿度传感器

1.前期准备

打开源码和接线

单片机实验的第一步当然是接线了

这里我们打开上面链接资料里面下载好的源码
Demo文件夹里面找到Stm32相关部分
这里我选择的是与我板子对应的F103RCT6的4线制SPI模式
在这里插入图片描述
打开后可以看到代码里面很清楚的给出了接线怎么接

在这里插入图片描述
用母对母杜邦线接好
在这里插入图片描述

2.屏幕滚动

SSD1306(OLED驱动芯片)指令详解
通过查阅资料和其他博客,发现滚动的代码如下

void roll_v(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); 
}  
void roll_h(void)
{
				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);        //开启滚动

}    

写一个测试函数在main里面循环

void TEST_Menu(void)
{
	GUI_ShowString(0,0,"631707060324",16,1);
	GUI_ShowCHinese(0,20,16,"肖思睿",1);
	roll_h();
	
}

结果如下
在这里插入图片描述

读取并显示温湿度

1.字模的提取

上面屏幕滚动的视频里面可以看到我显示了自己的名字和学号

但是如果你试过就会发现
在资料里面下载下来的代码改动后不能直接显示中文

这是因为代码里面没有相关的字模

在嵌入式设备 LCD 上显示的汉字大多数都属于点阵汉字。常用的点阵字库来自 UCDOS。

我们可以在程序里面添加对应的字模实现显示
在这里插入图片描述
比如这是我添加的

	"肖",0x01,0x00,0x21,0x08,0x11,0x10,0x09,0x20,0x01,0x00,0x3F,0xF8,0x20,0x08,0x20,0x08,
	0x3F,0xF8,0x20,0x08,0x20,0x08,0x3F,0xF8,0x20,0x08,0x20,0x08,0x20,0x28,0x20,0x20,
	"思",0x00,0x00,0x3F,0xF8,0x21,0x10,0x21,0x10,0x3F,0xF8,0x21,0x10,0x21,0x10,0x3F,0xF8,
	0x20,0x08,0x01,0x00,0x08,0x88,0x48,0x84,0x48,0x12,0x48,0x12,0x87,0xF0,0x00,0x00,
	"睿",0x01,0x00,0x01,0xF8,0x01,0x00,0x7F,0xFE,0x40,0x02,0x9F,0xF4,0x09,0x20,0x32,0x90,
	0x0C,0x60,0x3F,0xF8,0xD0,0x16,0x1F,0xF0,0x10,0x10,0x1F,0xF0,0x10,0x00,0x1F,0xF0,	

代码的提取可以通过字模提取软件提取
也可以通过计算手动添加(不推荐,虽然我没找到软件就是手动添加的)

在这里插入图片描述
比如肖字
在这里插入图片描述
第一行就是:0x01,0x00,即:0000 0001 0000 0000
依次类推,就可以得到相关代码

添加到oledfont.h文件里面就可以直接调用了

2.代码实现部分

1.GPIO

要同时实现OLED和AHT20的工作,我们第一个要修改的是GPIO_Init

因为他们所接的引脚不同

OLED.c文件里面的初始化函数
添加AHT20连接的PB6和PB7

void OLED_Init_GPIO(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	 //使能B端口时钟
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_6|GPIO_Pin_7;	//GPIOB10,11,12,6,7
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
 	GPIO_Init(GPIOB, &GPIO_InitStructure);	  //初始化GPIOB10、11、12,6,7
 	GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_6|GPIO_Pin_7);	
}

2.显示部分

				GUI_DrawLine(WIDTH/2-1,10+(HEIGHT-10)/2-1,WIDTH/2-1,HEIGHT-1,1);
				GUI_DrawLine(0,10+(HEIGHT-10)/2-1,WIDTH-1,10+(HEIGHT-10)/2-1,1);
				GUI_ShowString(0,1,"631707060324",16,1); 
				GUI_ShowCHinese(0,20,16,"肖思睿",1);
				GUI_ShowString(0,39,"TEMP",8,1);
				GUI_DrawCircle(WIDTH/2-1-19, 51, 1,2);
				GUI_ShowString(WIDTH/2-1-14,46,"C",16,1);
				GUI_ShowString(WIDTH/2-1+2,39,"hum",8,1);
				GUI_ShowString(WIDTH/2-1+40,46,"%",16,1);
				GUI_ShowNum(WIDTH/2-1-50,46,(tem/10),3,16,1);
				GUI_ShowNum(WIDTH/2-1+5,46,(hum/10),3,16,1);

3.实现效果

可以看到,由于手给温湿度测量带来的变化清晰的显示在了屏幕上
在这里插入图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要在STM32上实现0.96OLED IIC显示,需要进行以下步骤: 1. 确定OLED的IIC地址和控制寄存器的设置。不同的OLED可能有不同的IIC地址和控制寄存器设置,需要先查看OLED数据手册。 2. 配置STM32的IIC接口。在STM32中,可以使用硬件IIC接口或者软件模拟IIC接口。如果使用硬件IIC接口,需要配置GPIO和IIC控制器的寄存器;如果使用软件模拟IIC接口,则需要编写软件模拟IIC的代码。 3. 编写OLED控制代码。根据OLED数据手册,编写控制代码,包括初始化OLED显示字符和图形等。 下面是一个简单的例子,演示了如何在STM32上实现0.96OLED IIC显示。这个例子使用了硬件IIC接口。 ```c #include "stm32f10x.h" #define OLED_ADDR 0x78 void OLED_Init() { // 初始化OLED // ... } void OLED_ShowChar(uint8_t x, uint8_t y, char chr) { // 在(x,y)位置显示字符chr // ... } void OLED_ShowString(uint8_t x, uint8_t y, const char* str) { // 在(x,y)位置显示字符串str // ... } int main() { // 配置GPIO和IIC控制器的寄存器 // ... // 初始化IIC接口 // ... // 初始化OLED OLED_Init(); // 显示字符 OLED_ShowChar(0, 0, 'H'); OLED_ShowChar(8, 0, 'e'); OLED_ShowChar(16, 0, 'l'); OLED_ShowChar(24, 0, 'l'); OLED_ShowChar(32, 0, 'o'); // 显示字符串 OLED_ShowString(0, 2, "World"); while(1) { // 主循环 } } ``` 需要注意的是,这个例子仅仅是一个简单的示例,实际的代码可能会更加复杂。在实际的开发中,需要根据具体的硬件和软件环境进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值