STM32外设系列—OLED

06-13 1113阅读

🎀 文章作者:二土电子

🌸 关注文末公众号获取其他资料和工程文件!

🐸 期待大家一起学习交流!



文章目录

  • 一、OLED简介
  • 二、数据手册分析
    • 2.1 供电电压
    • 2.2 引脚定义
    • 2.3 原理图介绍
    • 2.4 数据手册程序
    • 三、IIC通信
      • 3.1 什么是IIC
      • 3.2 IIC通信协议
      • 3.3 IIC主从通信过程
        • 3.3.1 写入数据
        • 3.3.2 读取数据
        • 四、OLED程序设计
          • 4.1 OLED初始化
          • 4.2 OLED控制函数编写
            • 4.2.1 OLED显示开/关程序
            • 4.2.2 OLED显示一组汉字程序
            • 4.2.3 OLED显示一串字符串
            • 4.2.3 OLED显示图片
            • 五、OLED画点/画线

              一、OLED简介

              OLED是开发时常用的显示器件,这里介绍的是0.96寸的四针脚OLED,IIC控制。

              STM32外设系列—OLED

              二、数据手册分析

              2.1 供电电压

              STM32外设系列—OLED

              供电电压在3V~5V,用3.3V即可。

              2.2 引脚定义

              STM32外设系列—OLED

              2.3 原理图介绍

              STM32外设系列—OLED

              I2C通信接口由从地址位DC、I2C总线数据信号SDA(输出SDAOUT/D2输出,SDAIN/D1输入)和I2C总线时钟信号SCL(D0)组成。数据信号和时钟信号都必须连接到上拉电阻器上。

              从属地址位(SA0)必须在通过I2C总线传输或接收任何信息之前,先识别该从属地址。设备将响应从地址,后面是从地址位(“SA0”位)和读/写选择位(“R/W#”,具有以下字节格式的位)

              STM32外设系列—OLED

              “SA0”位为从属地址提供了一个扩展位。可以选择“0111100”或“0111101”作为OLED的从属地址。D/C# pin作为SA0进行从属地址的选择”。“收发#”位用于确定I2c总线接口的操作模式。R/W#=1,它处于读取模式。R/W#=0,它处于写模式。

              从属地址DC说明
              0111 100(0x78)DC = 0默认值
              0111 1010(0x7A)DC = 1用户需要切换电阻位置来修改IIC地址

              2.4 数据手册程序

              数据手册中会给出一些底层程序,可以通过这写程序快速的了解到如何使用。后面的程序设计中会详细介绍这部分,这里就不再做介绍了。

              三、IIC通信

              3.1 什么是IIC

              IIC(Inter-Integrated Circuit)其实是IICBus简称,中文是集成电路总线,它是一种串行通信总线,使用多主从架构,由飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备而发展。IIC支持一主多从,主机通过寻址的方式呼叫从机,然后进行数据传输。

              I2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有从设备的SDA和SLK都接到总线上。

              3.2 IIC通信协议

              IIC协议中有两种帧,一种是地址帧,用来寻找从设备。一种是数据帧,用来作主从机之间的数据交互。IIC协议还规定了起始信号,终止信号和应答信号。

              STM32外设系列—OLED

              • 空闲状态

                I2C总线总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。

              • 起始信号

                SCL为高电平期间,SDA信号线由高电平向低电平的变化表示起始信号

              • 终止信号

                SCL为高电平期间,SDA由低电平向高电平的变化表示终止信号

                起始信号和终止信号都是由主机发送的,起始信号产生之后,总线处于被占用的状态,在终止信号产生之后,总线就处于空闲状态。

                当从机接收完一帧时,会发送一个应答信号。应答信号为低电平时,规定为有效应答(ACK,简称应答位),表示接收器已经成功地接受了该字节应答位为高电平时,规定为非应答信号(NACK),一般表示接收器接收该字节没有成功。

                IIC通信协议有自己的数据格式,每一个字节必须保证是8bit长度。数据传送时,先传送最高位,每一个被传送的字节后面都必须跟随1bit的应答位(即每一帧数据一共有9bit)。

                3.3 IIC主从通信过程

                3.3.1 写入数据

                主设备往从设备写入数据需要有下面的过程

                • 主设备发送一个起始信号(START)
                • 主设备在数据线上广播从设备地址
                • 确定数据传输方向(R/W)
                • 等待从设备应答信号(ACK)
                • 主设备发送数据到从设备,从设备接收到后,会返回给主设备一个应答信号,直到主设备发送完数据,或者从设备返回一个NACK信号,表示从设备不再接收数据
                • 数据发送完毕,主设备发送终止信号(STOP)

                  STM32外设系列—OLED

                  3.3.2 读取数据

                  • 主设备发送起始信号(START)
                  • 主设备在数据线上广播从设备地址
                  • 确定数据传输方向(R/W)
                  • 等待从设备应答信号(ACK)
                  • 从机向主机发送需要读取的数据
                  • 主设备每接收到一个字节数据,后面就会跟着向从设备发送一个应答信号
                  • 接收完最后一个数据后,主机会发送一个无效应答信号(NACK)
                  • 主设备发送终止信号,数据读取完毕

                    STM32外设系列—OLED

                    四、OLED程序设计

                    4.1 OLED初始化

                    OLED初始化包括两部分,一部分是初始化STM32的GPIO,另一部分是根据数据手册提供的程序初始化OLED。STM32F103ZET6提供了两个IIC接口

                    SCLSDA
                    IIC1PB6PB7
                    IIC2PB10PB11

                    实际使用软件模拟IIC时,使用任意的GPIO即可,不必要使用上面规定的IIC引脚。这里只是使用了IIC1的引脚而已。

                    首先是数据手册提供的IIC相关函数

                    /*
                     *==============================================================================
                     *函数名称:IIC_delay
                     *函数功能:IIC延时
                     *输入参数:无
                     *返回值:无
                     *备  注:数据手册提供
                     *==============================================================================
                     */
                    void IIC_delay (void)
                    {
                    	u8 t = 1;
                    	while (t--);
                    }
                    /*
                     *==============================================================================
                     *函数名称:I2C_Start
                     *函数功能:IIC起始信号
                     *输入参数:无
                     *返回值:无
                     *备  注:数据手册提供
                     *==============================================================================
                     */
                    void I2C_Start (void)
                    {
                    	OLED_SDA_Set();
                    	OLED_SCL_Set();
                    	IIC_delay();
                    	OLED_SDA_Clr();
                    	IIC_delay();
                    	OLED_SCL_Clr();
                    	IIC_delay();
                    }
                    /*
                     *==============================================================================
                     *函数名称:I2C_Stop
                     *函数功能:IIC终止信号
                     *输入参数:无
                     *返回值:无
                     *备  注:数据手册提供
                     *==============================================================================
                     */
                    void I2C_Stop (void)
                    {
                    	OLED_SDA_Clr();
                    	OLED_SCL_Set();
                    	IIC_delay();
                    	OLED_SDA_Set();
                    }
                    /*
                     *==============================================================================
                     *函数名称:I2C_WaitAck
                     *函数功能:IIC等待应答
                     *输入参数:无
                     *返回值:无
                     *备  注:数据手册提供
                     *==============================================================================
                     */
                    void I2C_WaitAck (void)
                    {
                    	OLED_SDA_Set();
                    	IIC_delay();
                    	OLED_SCL_Set();
                    	IIC_delay();
                    	OLED_SCL_Clr();
                    	IIC_delay();
                    }
                    /*
                     *==============================================================================
                     *函数名称:Send_Byte
                     *函数功能:写入一个字节
                     *输入参数:dat:需要写入的数据
                     *返回值:无
                     *备  注:数据手册提供
                     *==============================================================================
                     */
                    void Send_Byte (u8 dat)
                    {
                    	u8 i;
                    	for (i = 0;i 
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]