OLED显示屏详解(IIC协议0.96寸 STM32)

06-01 1196阅读

目录

 一、介绍

 二、模块原理

1.原理图

2.工作原理:SSD1306显存与命令

三、程序设计

main.c文件

oled.h文件

oled.c文件

四、实验效果 

五、资料获取

项目分享


一、介绍

        OLED是有机发光二极管,又称为有机电激光显示(Organic Electroluminescence Display, OLED)。OLED由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术

OLED显示屏详解(IIC协议0.96寸 STM32)

 以下是OLED显示屏的参数:

尺寸

0.96寸

模块电压

DC:3~5V

分辨率

128×64

驱动

SSD1306

管脚数

4针

接口

IIC

工作温度

-20℃~70℃

哔哩哔哩视频链接:

https://www.bilibili.com/video/BV17Z421K7vV/?share_source=copy_web&vd_source=097fdeaf6b6ecfed8a9ff7119c32faf2

(资料分享见文末) 

 二、模块原理

1.原理图

OLED显示屏详解(IIC协议0.96寸 STM32)

  以下为OLED显示屏的引脚描述

引脚名称

描述

VCC

供给电压3~5V

SCL

I2C总线时钟线

SDA

I2C总线数据线

GND

电源地

2.工作原理:SSD1306显存与命令

OLED显示屏详解(IIC协议0.96寸 STM32)

SSD1306的显存总共为128*64bit大小,其将这些显存分为了8页。每页包含了128个字节,总共8页,这样刚好是128*64的点阵大小。

OLED显示屏详解(IIC协议0.96寸 STM32)

  • 命令 0X81 : 设置对比度 。 包含两个字节,第一个 0X81 为命令,随后发送的一个字节为要设置的对比度的值。这个值设置得越大屏幕就越亮。
  • 命令0XAE/0XAF : 0XAE 为关闭显示命令; 0XAF 为开启显示命令。
  • 命令0XB0~B7 : 用于设置页地址,其低三位的值对应着 GRAM 的页地址。
  • 命令0X00~0X0F : 用于设置显示时的起始列地址低四位。
  • 命令0X10~0X1F : 用于设置显示时的起始列地址高四位。

    三、程序设计

    使用STM32F103C8T6将中英文字符、数字和图片显示在OLED显示屏上

    main.c文件

    #include "stm32f10x.h"
    #include "led.h"
    #include "usart.h"
    #include "delay.h"
    #include "dht11.h"
    #include "oled.h"
    #include "bmp.h"
    /*****************辰哥单片机设计******************
    											STM32
     * 项目			:	OLED显示屏实验                     
     * 版本			: V1.0
     * 日期			: 2024.8.7
     * MCU			:	STM32F103C8T6
     * 接口			:	参看oled.h							
     * BILIBILI	:	辰哥单片机设计
     * CSDN			:	辰哥单片机设计
     * 作者			:	辰哥 
    **********************BEGIN***********************/
    int main(void)
    { 
    	
      SystemInit();//配置系统时钟为72M	
    	delay_init(72);
    	LED_Init();
    	LED_On();
    	USART1_Config();//串口初始化
    	
    	OLED_Init();
    	
    	printf("Start \n");
    	delay_ms(1000);
    	
    	//OLED_ShowChinese(u8 x,u8 y,u8 num,u8 size1,u8 mode) 
    	//x,y:起点坐标 num:汉字对应的序号 mode:0,反色显示;1,正常显示
    	OLED_ShowChinese(0,32,0,16,1); //你
    	OLED_ShowChinese(32,32,1,16,1);//好
    	OLED_ShowChinese(64,32,2,16,1);//世
    	OLED_ShowChinese(96,32,3,16,1);//界
    	
    	//OLED_ShowString(u8 x,u8 y,u8 *chr,u8 size1,u8 mode);
    	//x,y:起点坐标 size1:字体大小 *chr:字符串起始地址 mode:0,反色显示;1,正常显示
    	//OLED_ShowString(0,16,"HELLO WORLD!",16,1);
    		
    		
    	//OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size1,u8 mode);
    	//x,y :起点坐标 num :要显示的数字 len :数字的位数 size:字体大小 mode:0,反色显示;1,正常显示
    	//OLED_ShowNum(0,32,666,3,24,1);
    	
    	//OLED_Clear();
    	//OLED_ShowPicture(u8 x,u8 y,u8 sizex,u8 sizey,u8 BMP[],u8 mode)
    	//x,y:起点坐标 sizex,sizey,图片长宽 BMP[]:要写入的图片数组 mode:0,反色显示;1,正常显示
    //	OLED_ShowPicture(0,0,128,64,BMP4,0);
      while (1)
      {
    		LED_Toggle();
    		delay_ms(500);
      }
    }

    oled.h文件

    #ifndef __OLED_H
    #define __OLED_H 
    #include "sys.h"
    #include "stdlib.h"	
    /*****************辰哥单片机设计******************
    											STM32
     * 文件			:	OLED显示屏h文件                     
     * 版本			: V1.0
     * 日期			: 2024.8.7
     * MCU			:	STM32F103C8T6
     * 接口			:	见代码							
     * BILIBILI	:	辰哥单片机设计
     * CSDN			:	辰哥单片机设计
     * 作者			:	辰哥 
    **********************BEGIN***********************/
    //----------------OLED端口定义----------------- 
    /***************根据自己需求更改****************/
    #define OLED_SCL_PROT  			GPIOB
    #define OLED_SCL_PIN				GPIO_Pin_11
    #define OLED_SCL_GPIO_CLK   RCC_APB2Periph_GPIOB
    #define OLED_SDA_PROT  			GPIOB
    #define OLED_SDA_PIN				GPIO_Pin_10
    #define OLED_SDA_GPIO_CLK   RCC_APB2Periph_GPIOB
    /*********************END**********************/
    #define OLED_SCL_Clr() GPIO_ResetBits(OLED_SCL_PROT,OLED_SCL_PIN)//SCL
    #define OLED_SCL_Set() GPIO_SetBits(OLED_SCL_PROT,OLED_SCL_PIN)
    #define OLED_SDA_Clr() GPIO_ResetBits(OLED_SDA_PROT,OLED_SDA_PIN)//DIN
    #define OLED_SDA_Set() GPIO_SetBits(OLED_SDA_PROT,OLED_SDA_PIN)
    #define OLED_CMD  0	//写命令
    #define OLED_DATA 1	//写数据
    void OLED_ClearPoint(u8 x,u8 y);
    void OLED_ColorTurn(u8 i);
    void OLED_DisplayTurn(u8 i);
    void OLED_I2C_Start(void);
    void OLED_I2C_Stop(void);
    void OLED_I2C_WaitAck(void);
    void OLED_Send_Byte(u8 dat);
    void OLED_WR_Byte(u8 dat,u8 mode);
    void OLED_DisPlay_On(void);
    void OLED_DisPlay_Off(void);
    void OLED_Refresh(void);
    void OLED_Clear(void);
    void OLED_DrawPoint(u8 x,u8 y,u8 t);
    void OLED_DrawLine(u8 x1,u8 y1,u8 x2,u8 y2,u8 mode);
    void OLED_DrawCircle(u8 x,u8 y,u8 r);
    void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size1,u8 mode);
    void OLED_ShowChar6x8(u8 x,u8 y,u8 chr,u8 mode);
    void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 size1,u8 mode);
    void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size1,u8 mode);
    void OLED_ShowChinese(u8 x,u8 y,u8 num,u8 size1,u8 mode);
    void OLED_ScrollDisplay(u8 num,u8 space,u8 mode);
    void OLED_ShowPicture(u8 x,u8 y,u8 sizex,u8 sizey,u8 BMP[],u8 mode);
    void OLED_Init(void);
    #endif
    

    oled.c文件

    #include "oled.h"
    #include "stdlib.h"
    #include "oledfont.h"
    #include "delay.h"
    /*****************辰哥单片机设计******************
    											STM32
     * 文件			:	OLED显示屏c文件                     
     * 版本			: V1.0
     * 日期			: 2024.8.7
     * MCU			:	STM32F103C8T6
     * 接口			:	见代码							
     * BILIBILI	:	辰哥单片机设计
     * CSDN			:	辰哥单片机设计
     * 作者			:	辰哥 
    **********************BEGIN***********************/
    u8 OLED_GRAM[144][8];
    //反显函数
    void OLED_ColorTurn(u8 i)
    {
    	if(i==0)
    		{
    			OLED_WR_Byte(0xA6,OLED_CMD);//正常显示
    		}
    	if(i==1)
    		{
    			OLED_WR_Byte(0xA7,OLED_CMD);//反色显示
    		}
    }
    //屏幕旋转180度
    void OLED_DisplayTurn(u8 i)
    {
    	if(i==0)
    		{
    			OLED_WR_Byte(0xC8,OLED_CMD);//正常显示
    			OLED_WR_Byte(0xA1,OLED_CMD);
    		}
    	if(i==1)
    		{
    			OLED_WR_Byte(0xC0,OLED_CMD);//反转显示
    			OLED_WR_Byte(0xA0,OLED_CMD);
    		}
    }
    //延时
    void IIC_delay(void)
    {
    	u8 t=3;
    	while(t--);
    }
    //起始信号
    void OLED_I2C_Start(void)
    {
    	OLED_SDA_Set();
    	OLED_SCL_Set();
    	IIC_delay();
    	OLED_SDA_Clr();
    	IIC_delay();
    	OLED_SCL_Clr();
    	IIC_delay();
    }
    //结束信号
    void OLED_I2C_Stop(void)
    {
    	OLED_SDA_Clr();
    	OLED_SCL_Set();
    	IIC_delay();
    	OLED_SDA_Set();
    }
    //等待信号响应
    void OLED_I2C_WaitAck(void) //测数据信号的电平
    {
    	OLED_SDA_Set();
    	IIC_delay();
    	OLED_SCL_Set();
    	IIC_delay();
    	OLED_SCL_Clr();
    	IIC_delay();
    }
    //写入一个字节
    void OLED_Send_Byte(u8 dat)
    {
    	u8 i;
    	for(i=0;i
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码