小兴教你做平衡小车-stm32程序开发(I2C控制OLED显示屏)

1 前言

目前市面上的传感器很多,如果是想要通过单片机来控制传感器,那咱们就需要去了解下通讯协议了。比较常见的通讯协议有I2C、SPI、USART等。通讯协议就好比一种约定,约定好主机和从机之间的沟通方式。

2 材料准备

学习I2C最好的办法是看协议手册。这里给大家分享下载链接。
当时百度了一波,发现没能找到协议下载位置,还好有一位微信博主分享了协议手册,再次感谢了。
在这里插入图片描述
下载链接如下:
1、NXP文档
2、ZLG文档(中文翻译)
3、TI文档

这时候我发现手册的名字是UM10204,这就谈到搜索的艺术了。如果只是搜索I2C协议手册,不太容易找到我们需要的东东,但是如果稍微具体一下,那结果就不一样了。

还有一个技巧想告诉大家,如果不想看到杂七杂八的广告等网站,使用bing搜索引擎是一个不错的选择。下图我是用bing国际版搜索的,你看第一个就是啦。
在这里插入图片描述

3 大致研读下I2C手册

首先咱们打开UM10204这个手册。我这里使用的是目前看来最新的版本了。
在这里插入图片描述
看了下手册的更新日志,发现是1982年发出的,原来一个通讯协议的发展并不是一蹴而就的。
在这里插入图片描述
在数字电路通讯中,通常使用1表示高电平,0表示低电平。我们使用0.3VDD作为VIL,使用0.7VDD作为VIH。电压大于VIH就是高电平,电压低于VIL就是低电平。
在这里插入图片描述

下图可以看出SCL的数据需要保持(当SDA为高电平的时候),同样SCL的数据可以改变(当SDA为低电平的时候)。

在这里插入图片描述
在这里插入图片描述
下图主要介绍了I2C通讯的开始状态和结束状态。
在这里插入图片描述
下图是I2C写时序。(不太理解没关系的,只有咱们可以抓取下波形看看)
在这里插入图片描述从这个图中看出,主机和从机通过SDA和SCL来进行连接,其中SCL是由主机产生(这里的主机不妨理解为单片机,从机不妨理解为传感器)。主机和从机共享SDA这根总线。谁需要使用的时候将总线拿到手中即可。
在这里插入图片描述
下图是I2C的读时序。
在这里插入图片描述

4 OLED硬件介绍

本次选用的是4脚OLED显示屏。下图看到SCL和SDA的字样,显然如果想点亮OLED显示屏,需要使用I2C来实现。
在这里插入图片描述
模块资料的下载地址如下。淘宝优信电子给的下载链接蛮多的,这里我就下载百度网盘的吧

https://www.yourcee.com/filedownload/533852
https://www.yourcee.com/filedownload/534145
https://pan.baidu.com/s/1J57Izsv-PKmbwVrA2ynDzg 提取码:vktz

此时,去喝了杯茶回来,发现终于下载好了。咱们选择第三个即可。
在这里插入图片描述
我们把文件标一下序号。
在这里插入图片描述
第一个取模软件的界面如下。主要作用呢,可以把文字和图片转化为数据的形式。
参考博客:0.96寸OLED取模教程——字符与图片取模

第二个是参考代码,里面呢,由很多单片机开发的程序。在很多很多的程序中,看到一个熟悉的“身影”。咱们只需要关注他即可。
在这里插入图片描述
进入文件夹中,只需要下图所示的文件即可。

在这里插入图片描述
在打开main.c文件,我们来看看他的主函数怎么写的。
主要使用的函数是OLED_Init、OLED_Clear、OLED_ShowCHinese、OLED_ShowString、OLED_ShowChar、OLED_ShowNum、OLED_DrawBMP

#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "bmp.h"
 int main(void)
  {	u8 t;
		delay_init();	    	 //延时函数初始化	  
		NVIC_Configuration(); 	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 	LED_Init();			     //LED端口初始化
	//		delay_ms(8000);
		OLED_Init();			//初始化OLED  
		OLED_Clear()  	; 
	
		t=' ';
		OLED_ShowCHinese(0,0,0);//中
				OLED_ShowCHinese(18,0,1);//景
		OLED_ShowCHinese(36,0,2);//园
		OLED_ShowCHinese(54,0,3);//电
		OLED_ShowCHinese(72,0,4);//子
		OLED_ShowCHinese(90,0,5);//科
		OLED_ShowCHinese(108,0,6);//技
	while(1) 
	{		
		OLED_Clear();
		OLED_ShowCHinese(0,0,0);//中
		OLED_ShowCHinese(18,0,1);//景
		OLED_ShowCHinese(36,0,2);//园
		OLED_ShowCHinese(54,0,3);//电
		OLED_ShowCHinese(72,0,4);//子
		OLED_ShowCHinese(90,0,5);//科
		OLED_ShowCHinese(108,0,6);//技
		OLED_ShowString(6,3,"0.96' OLED TEST",16);
		//OLED_ShowString(8,2,"ZHONGJINGYUAN");  
	 //	OLED_ShowString(20,4,"2014/05/01");  
		OLED_ShowString(0,6,"ASCII:",16);  
		OLED_ShowString(63,6,"CODE:",16);  
		OLED_ShowChar(48,6,t,16);//显示ASCII字符	   
		t++;
		if(t>'~')t=' ';
		OLED_ShowNum(103,6,t,3,16);//显示ASCII字符的码值 	
			delay_ms(8000);
		delay_ms(8000);

					delay_ms(8000);
		delay_ms(8000);
		delay_ms(8000);
		OLED_DrawBMP(0,0,128,8,BMP1);  //图片显示(图片显示慎用,生成的字表较大,会占用较多空间,FLASH空间8K以下慎用)
		delay_ms(8000);
					delay_ms(8000);
		delay_ms(8000);
		delay_ms(8000);
		OLED_DrawBMP(0,0,128,8,BMP1);
		delay_ms(8000);
					delay_ms(8000);
		delay_ms(8000);
		delay_ms(8000);
	}	  
	
}

第三个是OLED显示屏数据手册。这个我们不关注。
在这里插入图片描述

第四个是OLED显示屏的原理图,我们看最后一个即可。
在这里插入图片描述
我们如果给模块供电3.3V,则稳压管则不起作用,VCC为3.3V。
如果给模块供电5V。则662K稳压管会降压到3.3V,VCC为3.3V。
R6和R7是上拉电阻,阻值为4.7k,上拉的电压为VCC(3.3V)。
R11和R12是OLED模块设备地址设置,正常情况下,只需要焊接其中一个即可(模块默认焊接R11)。也就是说模块的设备地址为0x78
该模块设计由硬件复位电路,这个电路设计的很巧妙,有兴趣的小伙伴可以学习学习。
在这里插入图片描述
在这里插入图片描述
第5-7个文件我们就不做介绍了。

第8个文件我们可以了解下。
其中必要重要的代码移植的部分。因为有时候我们需要去开发不同的单片机,很多情况下,代码是没办法使用的。

在这里插入图片描述

5 OLED模块程序移植

我们只需要在原有工程添加这五个文件即可。
在这里插入图片描述
在这里插入图片描述
经过一段时间的摸索后,最终点亮了OLED灯。此时模块的SCL接PA6,SDA接PA7。
在这里插入图片描述
程序里面还需要注意几个地方。这个需要根据实际连线来修改。
在这里插入图片描述
在这里插入图片描述
等等,如果我想显示其他汉字怎么办呢。我们只需要使用字模软件生成十六进制数据,拷贝到下oledfont.h中即可。
在这里插入图片描述
这时候我正想打开PCtoLCD2002.exe软件,发现怎么都打不开了。这个还是比较奇怪的。那好吧,我把重新解压下资料包吧,这总行了吧。
在这里插入图片描述
没想到真的可以。
在这里插入图片描述
参考博客:0.96寸OLED取模教程——字符与图片取模
进行如图所示的设置。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6 OLED模块抓取部分I2C波形(OLED初始化)

oled执行过程中,I2C波形抓取。
OLED_WR_Byte(0xAE,OLED_CMD);//–display off
在这里插入图片描述
OLED_WR_Byte(0x00,OLED_CMD);//—set low column address
在这里插入图片描述
OLED_WR_Byte(0x10,OLED_CMD);//—set high column address
在这里插入图片描述
OLED_WR_Byte(0x40,OLED_CMD);//–set start line address
在这里插入图片描述
OLED_WR_Byte(0xB0,OLED_CMD);//–set page address
在这里插入图片描述
OLED_WR_Byte(0x81,OLED_CMD); // contract control
在这里插入图片描述
OLED_WR_Byte(0xFF,OLED_CMD);//–128
在这里插入图片描述
OLED_WR_Byte(0xA1,OLED_CMD);//set segment remap
在这里插入图片描述
OLED_WR_Byte(0xA6,OLED_CMD);//–normal / reverse
在这里插入图片描述
OLED_WR_Byte(0xA8,OLED_CMD);//–set multiplex ratio(1 to 64)
在这里插入图片描述
OLED_WR_Byte(0x3F,OLED_CMD);//–1/32 duty
在这里插入图片描述
OLED_WR_Byte(0xC8,OLED_CMD);//Com scan direction
在这里插入图片描述
OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset
在这里插入图片描述
OLED_WR_Byte(0x00,OLED_CMD);//
在这里插入图片描述
OLED_WR_Byte(0xD5,OLED_CMD);//set osc division
在这里插入图片描述
OLED_WR_Byte(0x80,OLED_CMD);//
在这里插入图片描述
OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode off
在这里插入图片描述
OLED_WR_Byte(0x05,OLED_CMD);//
在这里插入图片描述
OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge Period
在这里插入图片描述
OLED_WR_Byte(0xF1,OLED_CMD);//
在这里插入图片描述
OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartion
在这里插入图片描述
OLED_WR_Byte(0x12,OLED_CMD);//
在这里插入图片描述
OLED_WR_Byte(0xDB,OLED_CMD);//set Vcomh
在这里插入图片描述
OLED_WR_Byte(0x30,OLED_CMD);//
在这里插入图片描述
OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enable
在这里插入图片描述
OLED_WR_Byte(0x14,OLED_CMD);//
在这里插入图片描述
OLED_WR_Byte(0xAF,OLED_CMD);//–turn on oled panel
在这里插入图片描述

7 OLED显示图像

参考博客:
1、基于STM32单片只因的OLED显示分辨率位128*64的图片
2、Image2Lcd图片取模软件

在线抠图网站:https://www.remove.bg/zh
压缩图片网站:https://fontmeme.com/zh/resize-images/

为了得到128_64像素的图片,可以尝试把网页缩小,然后使用snipaste软件来进行截图,最后保存为bmp格式即可。

在这里插入图片描述
在这里插入图片描述
之后我们是使用Image2Lcd软件来对图像进行二值化处理。
在这里插入图片描述
经过了一顿操作之后,图片分别经过经过了下图的四个变化,最后得到可以使用的128*64像素的二值化图片。
在这里插入图片描述
之后在PCtoLCD2002软件中输出十六进制数据即可。
在这里插入图片描述

{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,
0x80,0xC0,0x60,0x70,0x30,0x30,0x30,0x60,0x60,0x60,0xC0,0xC0,0x80,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0x70,0x30,0x18,
0x1C,0x0C,0x0E,0x06,0x03,0x03,0x03,0x01,0x01,0x00,0x00,0x00,0x01,0xC1,0xF1,0xF9,
0xF9,0xE0,0xF0,0xF8,0xF8,0xF8,0xF0,0xE0,0xE0,0xC0,0x80,0x00,0x01,0x03,0x87,0x06,
0x0E,0x1C,0x38,0x70,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xC0,0xF0,0x78,0x9C,0x8E,0x07,0x03,0x01,0x00,0xE0,0xF8,0x38,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0x7F,0x3B,
0x39,0x31,0x31,0x61,0xE1,0xC1,0x01,0x01,0x81,0xC3,0x7F,0xFF,0xFC,0xE0,0x03,0x0F,
0x1E,0x78,0xF0,0xC0,0x00,0x01,0x07,0x1F,0x7C,0xF0,0x80,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0x0F,0x0C,0xFF,0xFF,0x03,0x00,0x00,0x80,0xE0,0xFF,0xFF,0x00,
0x00,0x00,0x00,0x00,0xF8,0xF8,0xE0,0x60,0x7C,0xFC,0xFC,0x98,0x3F,0x3F,0x18,0x00,
0x00,0x1C,0x3C,0x3C,0x9C,0xC3,0xFF,0x7F,0xC3,0x80,0x00,0x00,0x03,0x03,0x1F,0x3F,
0x3F,0x9F,0xE7,0x7F,0x7F,0xF8,0xE0,0xE0,0x70,0x3F,0x1F,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,
0xC0,0xC0,0xE0,0xE0,0xF0,0xB0,0xB0,0xB3,0xF3,0xF3,0xFF,0xFF,0x83,0x1F,0x7F,0xFE,
0xFC,0xFC,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0x38,0x00,0x00,0x01,0x03,0x03,0x06,0x06,
0xFE,0xFE,0xC6,0xC7,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0xE3,0x66,0xFE,0xFE,0x72,0x03,
0x03,0xF9,0xFC,0xFE,0xFF,0xFF,0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xBE,0xFF,0xFB,0xB9,
0xFF,0x77,0x73,0x73,0xFB,0xEF,0xFF,0xEF,0xFF,0xDB,0xFF,0xFF,0xFF,0xFE,0xFC,0xF9,
0xF9,0xFB,0xFB,0xFB,0xFB,0xF9,0xF9,0xF8,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xF8,
0xF8,0xF9,0xFB,0xFB,0xFB,0xFE,0xF6,0xF6,0xF6,0xF6,0xF2,0xE3,0xE1,0xE0,0xE0,0xE0,
0xF0,0xF8,0xF9,0xFF,0xFF,0xF3,0xF1,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFD,0xDD,0xDD,0xDD,0xDF,
0xFF,0xBB,0xBA,0x7E,0x70,0xFE,0xEE,0xFF,0xD1,0xF1,0xFF,0xFF,0xFB,0xFB,0xFB,0xFB,
0xF3,0xF3,0xF3,0xE3,0xC7,0x87,0x0F,0x7F,0xFF,0xDF,0xDF,0xDF,0xFF,0xBF,0xBF,0xBF,
0xBF,0x7F,0x7F,0xFF,0xBF,0xBF,0xBF,0xFF,0xDF,0xDF,0xDF,0xDF,0xFF,0x7F,0x1F,0x0F,
0xC7,0xE7,0xF3,0xF3,0xF3,0xF9,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x07,0x06,0x05,0x07,
0x07,0x07,0x07,0x07,0x07,0x06,0x04,0x05,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,
0x07,0x07,0x07,0x07,0x07,0x07,0x00,0x00,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,
0x07,0x00,0x00,0x00,0x01,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x00,0x00,0x06,
0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"\\vmware-host\Shared Folders\transfer\hardware\ikun\128_64_single_color.bmp",0*/
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>