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

文章目录

  • 1 前言
  • 2 材料准备
  • 3 大致研读下I2C手册
  • 4 OLED硬件介绍
  • 5 OLED模块程序移植
  • 6 OLED模块抓取部分I2C波形(OLED初始化)
  • 7 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*/
    }
    
    

    作者:爱发明的小兴

    物联沃分享整理
    物联沃-IOTWORD物联网 » 小兴教你做平衡小车-stm32程序开发(I2C控制OLED显示屏)

    发表回复