IAR for STM8L标准库硬件I2C/SPI驱动SSD1306 OLED屏幕

IAR for STM8L标准库硬件I2C/SPI驱动SSD1306 OLED屏幕


  • 🌿参考STM32硬件驱动 https://github.com/lamik/OLED_SSD1306_STM32_HAL

  • ✨说明,本工程仅验证了硬件I2C接口,硬件SPI接口的SSD1306 OLED屏幕手上没有,并没有验证是否可行。

  • 🔧基于IAR开发环境,单片机:STM8L052R8

  • 🌼效果演示:
    在这里插入图片描述
    在这里插入图片描述

  • 🔧软件驱动方式可以参考屏幕驱动厂家提供的资料修改得来。

  • 👉🏻图形取模方式,可以参考屏幕厂家资料。测试时,我也是直接拷贝的屏幕厂家资料中的取模图片数据粘贴过来的。注意:不要找我要取模软件(有截图,有名字,自行搜索下载)
    - 、
-

📓硬件接口说明

  • 🌿硬件引脚映射关系图:

在这里插入图片描述

  • 🌿硬件接口软件配置在hw_setup.h文件中,具体单片机驱动根据具体型号修改相关内容。
#define SSD1306_I2C                         I2C1
#define   SSD1306_I2C_CLK               CLK_Peripheral_I2C1
#define SSD1306_SPI_CLK             CLK_Peripheral_SPI1
......
/* SPI Connection */
#define SSD1306_SCK_Pin         GPIO_Pin_5
#define SSD1306_SCK_Port        GPIOC
#define SSD1306_MOSI_Pin        GPIO_Pin_6
#define SSD1306_MOSI_Port       GPIOC
#define SSD1306_MISO_Pin        GPIO_Pin_7
#define SSD1306_MISO_Port       GPIOC

#define SSD1306_CS_Pin          GPIO_Pin_4
#define SSD1306_CS_Port         GPIOC

#define SSD1306_DC_Pin          GPIO_Pin_3
#define SSD1306_DC_Port         GPIOC
#define SSD1306_RESET_Pin       GPIO_Pin_0
#define SSD1306_RESET_Port      GPIOE

/* I2C Connection */
#define SSD1306_SCL_Pin         GPIO_Pin_1
#define SSD1306_SCL_Port        GPIOC
#define SSD1306_SDA_Pin         GPIO_Pin_0
#define SSD1306_SDA_Port        GPIOC

📑OLED驱动相关

  • 📌API相关显示函数说明,可以参考原创作者的blog文章:https://msalamon.pl/wyswietlacze-oled-ssd1306-i2c-czy-spi/
  • oled_ssd1306.h
/**
  *****************************************************************************
  * @file           : oled_ssd1306.h
  * @brief          : Header for SSD1306 display driver
  *
  *****************************************************************************
  * @attention
  *
  *  This code is a part of:
  *   OLED SSD1306 library for STM32
  *   https://github.com/lamik/OLED_SSD1306_STM32_HAL
  *
  *  The MIT License.
  *  Created on: 27.01.2017
  *      Author: Mateusz Salamon
  *      www.msalamon.pl
  *      mateusz@msalamon.pl
  *
  *****************************************************************************
  */

#ifndef __OLED_SSD1306_H_
#define __OLED_SSD1306_H_

/* Includes ------------------------------------------------------------------*/
#include "stm8l15x.h"
/* Exported defines ----------------------------------------------------------*/
/**
  * @brief  Resolution
  */
#define SSD1306_LCDWIDTH   128
#define SSD1306_LCDHEIGHT  64

/**
  * @brief  Select the instruction set
  * @note   Please set what functionality you want to use.
  *         Some functions need other functionalities.
  *         It should works automatically.
  * 条件编译
  *         1 - will be compiled
  *         0 - won't be compiled
  */
#define GRAPHIC_ACCELERATION_COMMANDS  1
#define ADVANCED_GRAPHIC_COMMANDS      1

/**
  *****************************************************************************
  */

/**
  * @brief  Commands
  */
#define SSD1306_SETCONTRAST          0x81
#define SSD1306_DISPLAYALLON_RESUME  0xA4
#define SSD1306_DISPLAYALLON         0xA5
#define SSD1306_NORMALDISPLAY        0xA6
#define SSD1306_INVERTDISPLAY        0xA7
#define SSD1306_DISPLAYOFF           0xAE
#define SSD1306_DISPLAYON            0xAF
#define SSD1306_SETDISPLAYOFFSET     0xD3
#define SSD1306_SETCOMPINS           0xDA
#define SSD1306_SETVCOMDETECT        0xDB
#define SSD1306_SETDISPLAYCLOCKDIV   0xD5
#define SSD1306_SETPRECHARGE         0xD9
#define SSD1306_SETMULTIPLEX         0xA8
#define SSD1306_SETLOWCOLUMN         0x00
#define SSD1306_SETHIGHCOLUMN        0x10
#define SSD1306_SETSTARTLINE         0x40
#define SSD1306_MEMORYMODE           0x20
#define SSD1306_COLUMNADDR           0x21
#define SSD1306_PAGEADDR             0x22
#define SSD1306_COMSCANINC           0xC0
#define SSD1306_COMSCANDEC           0xC8
#define SSD1306_SEGREMAP             0xA0
#define SSD1306_CHARGEPUMP           0x8D
#define SSD1306_EXTERNALVCC          0x01
#define SSD1306_SWITCHCAPVCC         0x02

/**
  * @brief  Scrolling defines
  */
#define SSD1306_ACTIVATE_SCROLL                       0x2F
#define SSD1306_DEACTIVATE_SCROLL                     0x2E
#define SSD1306_SET_VERTICAL_SCROLL_AREA              0xA3
#define SSD1306_RIGHT_HORIZONTAL_SCROLL               0x26
#define SSD1306_LEFT_HORIZONTAL_SCROLL                0x27
#define SSD1306_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL  0x29
#define SSD1306_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL   0x2A

/**
  * @brief  Advanced Graphic defines
  */
#define SSD1306_FADE_OUT  0x23
#define SSD1306_ZOOM_IN   0xD6

/**
  * @brief  Colors
  */
#define BLACK    0
#define WHITE    1
#define INVERSE  2

/* Private typedef -----------------------------------------------------------*/
/**
  * @brief  Scrolling enums
  */
typedef enum {
  SCROLL_EVERY_5_FRAMES,
  SCROLL_EVERY_64_FRAMES,
  SCROLL_EVERY_128_FRAMES,
  SCROLL_EVERY_256_FRAMES,
  SCROLL_EVERY_3_FRAMES,
  SCROLL_EVERY_4_FRAMES,
  SCROLL_EVERY_25_FRAMES,
  SCROLL_EVERY_2_FRAMES
} scroll_horizontal_speed;

/* Exported functions ------------------------------------------------------- */
/**
  * @brief  Functions
  */
#ifdef SSD1306_I2C_CONTROL
void SSD1306_I2cInit(void);
#endif

#ifdef SSD1306_SPI_CONTROL
void SSD1306_SpiInit(void);
#endif

/**
  * @brief  Configuration
  */
void SSD1306_DisplayON(uint8_t DisplayState);//开显示
void SSD1306_InvertColors(uint8_t Invert);//反色显示
void SSD1306_RotateDisplay(uint8_t Rotate);//屏幕旋转
void SSD1306_SetContrast(uint8_t Contrast);
void SSD1306_Command(uint8_t com);//写指令
/**
  * @brief  Drawing
  */
void SSD1306_DrawPixel(int16_t x, int16_t y, uint8_t Color);
void SSD1306_Clear(uint8_t Color);
void SSD1306_Display(void);
void SSD1306_Bitmap(uint8_t *bitmap);

#if GRAPHIC_ACCELERATION_COMMANDS == 1
/**
  * @brief  Graphic Acceleration Commands
  */
void SSD1306_StartScrollRight(uint8_t StartPage, uint8_t EndPage,
       scroll_horizontal_speed Speed);//页寻址模式
void SSD1306_StartScrollLeft(uint8_t StartPage, uint8_t EndPage,
       scroll_horizontal_speed Speed);
void SSD1306_StartScrollRightUp(uint8_t StartPage, uint8_t EndPage,
       scroll_horizontal_speed HorizontalSpeed, uint8_t VerticalOffset);
void SSD1306_StartScrollLeftUp(uint8_t StartPage, uint8_t EndPage,
       scroll_horizontal_speed HorizontalSpeed, uint8_t VerticalOffset);
void SSD1306_StopScroll(void);
#endif

#if ADVANCED_GRAPHIC_COMMANDS == 1
/**
  * @brief  Advanced Graphic Commands
  */
void SSD1306_StartFadeOut(uint8_t Interval);//逐渐降低对比度
void SSD1306_StartBlinking(uint8_t Interval);//效果与淡出类似,只是显示返回到“间隔”值并在循环中“闪烁”。
void SSD1306_StopFadeOutOrBlinking(void);//恢复正常显示效果
void SSD1306_ZoomIn(uint8_t Zoom);//缩放显示
#endif

#endif /* __OLED_SSD1306_H_ */

  • oled_ssd1306.c
/**
  *****************************************************************************
  * @file           : oled_ssd1306.c
  * @brief          : SSD1306 display driver
  *
  *****************************************************************************
  * @attention
  *
  *  This code is a part of:
  *   OLED SSD1306 library for STM32
  *   https://github.com/lamik/OLED_SSD1306_STM32_HAL
  *
  *  The MIT License.
  *  Created on: 27.01.2017
  *      Author: Mateusz Salamon
  *      www.msalamon.pl
  *      mateusz@msalamon.pl
  *
  *****************************************************************************
  */


/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "oled_ssd1306.h"
#include "hw_setup.h"

/* Private includes ----------------------------------------------------------*/
#include <string.h>



/* Private variables ---------------------------------------------------------*/
static uint8_t buffer[SSD1306_LCDHEIGHT * SSD1306_LCDWIDTH / 8];

/* Exported functions ------------------------------------------------------- */
/**
  * @brief  Send command to the controller
  * @param  com: specifies the signgle command to send
  * @retval None
  */
void SSD1306_Command(uint8_t com)
{
#ifdef SSD1306_I2C_CONTROL
  /* ***I2C*** */
  I2C_CWrite(SSD1306_I2C_ADDRESS, 0x00, &com, sizeof(com));
#endif
#ifdef SSD1306_SPI_CONTROL
  /* ***SPI*** */
  GPIO_ResetBits(SSD1306_DC_Port, SSD1306_DC_Pin);
#ifndef SPI_CS_HARDWARE_CONTROL
  GPIO_ResetBits(SSD1306_CS_Port, SSD1306_CS_Pin);
#endif
  SPI_Transmit(&com, 1);
#ifndef SPI_CS_HARDWARE_CONTROL
  GPIO_SetBits(SSD1306_CS_Port, SSD1306_CS_Pin);
#endif
#endif
}

/**
  * @brief  Send data to the controller
  * @param  dat: specifies the single data to send
  * @retval None
  */
void SSD1306_Data(uint8_t dat)
{
#ifdef SSD1306_I2C_CONTROL
  /* ***I2C*** */
  I2C_CWrite(SSD1306_I2C_ADDRESS, 0x40, &dat, sizeof(dat));
#endif
#ifdef SSD1306_SPI_CONTROL
  /* ***SPI*** */
  GPIO_SetBits(SSD1306_DC_Port, SSD1306_DC_Pin);
#ifndef SPI_CS_HARDWARE_CONTROL
  GPIO_ResetBits(SSD1306_CS_Port, SSD1306_CS_Pin);
#endif
  SPI_Transmit(&dat, 1);
#ifndef SPI_CS_HARDWARE_CONTROL
  GPIO_SetBits(SSD1306_CS_Port, SSD1306_CS_Pin);
#endif
#endif
}

#if defined(SSD1306_SPI_CONTROL) || defined(SSD1306_RESET_USE)
/**
  * @brief  Pull reset pin to ground for 5ms to reset controller
  * @param  None
  * @retval None
  */
void SSD1306_Reset(void)
{
  GPIO_ResetBits(SSD1306_RESET_Port, SSD1306_RESET_Pin);
  Delay_ms(5);
  GPIO_SetBits(SSD1306_RESET_Port, SSD1306_RESET_Pin);
}
#endif

/**
  * @brief  Configuration functions
  */

/**
  * @brief  Set the global inversion mode
  * @param  Invert: Set to one for enable inverse mode
  * @retval None
  */
void SSD1306_InvertColors(uint8_t Invert)
{
  SSD1306_Command(Invert ? SSD1306_INVERTDISPLAY : SSD1306_NORMALDISPLAY);
}

/**
  * @brief  Set the display rotation
  * @param  Rotate: Set to one for enable rotated mode
  * @retval None
  */
void SSD1306_RotateDisplay(uint8_t Rotate)
{
  if(Rotate > 1) Rotate = 1;

  SSD1306_Command(SSD1306_SEGREMAP | (0x01 & Rotate));
               /* Set Segment Re-Map Default                        */
               /* 0xA0  (0x00) => column Address 0 mapped to 127    */
               /* 0xA1  (0x01) => Column Address 127 mapped to 0    */

  SSD1306_Command(SSD1306_COMSCANINC | (0x08 & (Rotate << 3)));
               /* Set COM Output Scan Direction                     */
               /* 0xC0  (0x00) => normal mode (RESET) Scan from     */
               /*  COM0 to COM[N-1];Where N is the Multiplex ratio. */
               /* 0xC8  (0xC8) => remapped mode. Scan from COM[N-1] */
               /*  to COM0;;Where N is the Multiplex ratio.         */
}

/**
  * @brief  Set the display on or off
  * @param  DisplayState: Set the current display state
  * @retval None
  */
void SSD1306_DisplayON(uint8_t DisplayState)
{
  SSD1306_Command(DisplayState ? SSD1306_DISPLAYON : SSD1306_DISPLAYOFF);
}

/**
  * @brief  Set the display contrast value
  * @param  Contrast: Contrast value
  * @retval None
  */
void SSD1306_SetContrast(uint8_t Contrast)
{
	/* Set Contrast Control */
  SSD1306_Command(SSD1306_SETCONTRAST);
  SSD1306_Command(Contrast);
}

#if GRAPHIC_ACCELERATION_COMMANDS == 1
/**
  * @brief  Graphic Acceleration Command
  */

/**
  * @brief  Enable the auto scroll functionality, right direction
  * @param  StartPage: Internal starting page number
  *         EndPage  : Internal endining page number
  *         Speed    : Frames per second from @ref scroll_horizontal_speed
  * @retval None
  */
void SSD1306_StartScrollRight(uint8_t StartPage, uint8_t EndPage, scroll_horizontal_speed Speed)
{
  SSD1306_Command(SSD1306_RIGHT_HORIZONTAL_SCROLL);
  SSD1306_Command(0x00);
  SSD1306_Command(StartPage);
  SSD1306_Command(Speed);
  SSD1306_Command(EndPage);
  SSD1306_Command(SSD1306_ACTIVATE_SCROLL);
}

/**
  * @brief  Enable the auto scroll functionality, left direction
  * @param  StartPage: Internal starting page number
  *         EndPage  : Internal endining page number
  *         Speed    : Frames per second from @ref scroll_horizontal_speed
  * @retval None
  */
void SSD1306_StartScrollLeft(uint8_t StartPage, uint8_t EndPage, scroll_horizontal_speed Speed)
{
  //可以参考:http://www.51hei.com/bbs/dpj-180145-1.html
  SSD1306_Command(0x2E);        //关闭滚动
  SSD1306_Command(SSD1306_LEFT_HORIZONTAL_SCROLL);//水平向左或者右滚动 26/27
  SSD1306_Command(0x00);//虚拟字节
  SSD1306_Command(StartPage); //起始页 0
  SSD1306_Command(Speed);  //滚动时间间隔
  SSD1306_Command(EndPage);//终止页 7
  SSD1306_Command(0x00);//虚拟字节
  SSD1306_Command(0xFF);//虚拟字节
  SSD1306_Command(SSD1306_ACTIVATE_SCROLL);//开启滚动
  
}

/**
  * @brief  Enable the auto scroll functionality, two direction
  * @param  Direction       : Direction
  *         StartPage       : Internal starting page number
  *         EndPage         : Internal endining page number
  *         HorizontalSpeed : Frames per second from
  *                           @ref scroll_horizontal_speed
  *         VerticalOffset  :
  * @retval None
  */
void SSD1306_ScrollingHorVer(uint8_t Direction, uint8_t StartPage,
       uint8_t EndPage, scroll_horizontal_speed HorizontalSpeed, uint8_t VerticalOffset)
{
  if(VerticalOffset > 127) VerticalOffset = 127;
  SSD1306_Command(Direction);
  SSD1306_Command(0x00);
  SSD1306_Command(StartPage);
  SSD1306_Command(HorizontalSpeed);
  SSD1306_Command(EndPage);
  SSD1306_Command(VerticalOffset);
  SSD1306_Command(SSD1306_ACTIVATE_SCROLL);
}

/**
  * @brief  Enable the auto scroll finctionality, left and up direction
  * @param  Direction       : Direction
  *         StartPage       : Internal starting page number开始页:[0-7]
  *         EndPage         : Internal endining page number结束页:
  *         HorizontalSpeed : Frames per second from
  *                           @ref scroll_horizontal_speed
  *         VerticalOffset  :垂直偏移量
  * @retval None
  */
void SSD1306_StartScrollLeftUp(uint8_t StartPage, uint8_t EndPage,
       scroll_horizontal_speed HorizontalSpeed, uint8_t VerticalOffset)
{
  SSD1306_ScrollingHorVer(SSD1306_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL,
                          StartPage, EndPage, HorizontalSpeed, VerticalOffset);
}

/**
  * @brief  Enable the auto scroll finctionality, right and up direction
  * @param  Direction       : Direction
  *         StartPage       : Internal starting page number
  *         EndPage         : Internal endining page number
  *         HorizontalSpeed : Frames per second from
  *                           @ref scroll_horizontal_speed
  *         VerticalOffset  :
  * @retval None
  */
void SSD1306_StartScrollRightUp(uint8_t StartPage, uint8_t EndPage,
       scroll_horizontal_speed HorizontalSpeed, uint8_t VerticalOffset)
{
  SSD1306_ScrollingHorVer(SSD1306_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL,
                          StartPage, EndPage, HorizontalSpeed, VerticalOffset);
}

/**
  * @brief  Disable the auto scroll finctionality
  * @param  None
  * @retval None
  */
void SSD1306_StopScroll(void)
{
  SSD1306_Command(SSD1306_DEACTIVATE_SCROLL);
}
#endif

/**
  * @brief  Advanced Graphic Commands
  */
#if ADVANCED_GRAPHIC_COMMANDS == 1
/**
  * @brief  Enable auto fade out finctionality
  * @param  Interval : Time between fade steps
  * @retval None
  */
void SSD1306_StartFadeOut(uint8_t Interval)
{
  SSD1306_Command(SSD1306_FADE_OUT);
  SSD1306_Command(0x20 | (0x0F & Interval));
}

/**
  * @brief  Enable auto blink functionality
  * @param  Interval : Time between blink steps
  * @retval None
  */
void SSD1306_StartBlinking(uint8_t Interval)
{
  SSD1306_Command(SSD1306_FADE_OUT);
	SSD1306_Command(0x30 | (0x0F & Interval));
}

/**
  * @brief  Disable auto fade out/blinking functionality
  * @param  Interval : Time between fade steps
  * @retval None
  */
void SSD1306_StopFadeOutOrBlinking(void)
{
  SSD1306_Command(SSD1306_FADE_OUT);
  SSD1306_Command(0x00);
}

/**
  * @brief  Enable or disable zoom functionality
  * @param  Zoom : Set to 1 to enable zoom
  * @retval None
  */
void SSD1306_ZoomIn(uint8_t Zoom)
{
  SSD1306_Command(SSD1306_ZOOM_IN);
  SSD1306_Command(Zoom ? 0x01 : 0x00);
}
#endif

/**
  * @brief  Send the SSD1306 initialization set of commands
  * @param  None
  * @retval None
  */
void SSD1306_Init(void)
{
  /* Display Off */
  SSD1306_Command(SSD1306_DISPLAYOFF);
  SSD1306_Command(0x00);

  SSD1306_Command(SSD1306_SETHIGHCOLUMN);
  SSD1306_Command(0x40);
  /* Set addressing mode */
  SSD1306_Command(SSD1306_MEMORYMODE);
  /* Horizontal Addressing Mode */
  SSD1306_Command(0x00);

  SSD1306_SetContrast(0xFF);
  SSD1306_RotateDisplay(1);

  /* Set Normal Display */
  SSD1306_Command(SSD1306_NORMALDISPLAY);
  /* Select Multiplex Ratio */
  SSD1306_Command(SSD1306_SETMULTIPLEX);
  /* Default => 0x3F (1/64 Duty)	0x1F(1/32 Duty) */
  SSD1306_Command(0x3F);
  /* Setting Display Offset */
  SSD1306_Command(SSD1306_SETDISPLAYOFFSET);
  SSD1306_Command(0x00);  /* 00H Reset */
  /* Set Display Clock */
  SSD1306_Command(SSD1306_SETDISPLAYCLOCKDIV);
  SSD1306_Command(0x80);  /* 105HZ */
  /* Set Pre-Charge period */
  SSD1306_Command(SSD1306_SETPRECHARGE);
  SSD1306_Command(0x22);

  /* Set COM Hardware Configuration */
  SSD1306_Command(SSD1306_SETCOMPINS);
  SSD1306_Command(0x12);
              /* Alternative COM Pin---See IC Spec page 34       */
              /* (0x02)=> A4=0;Sequential COM pin configuration; */
              /*          A5=0;Disable COM Left/Right remap      */
  /* Set Deselect Vcomh level */
  SSD1306_Command(SSD1306_SETVCOMDETECT);
  SSD1306_Command(0x40);
  /* Set Charge Pump */
  SSD1306_Command(SSD1306_CHARGEPUMP);
  /* SSD1306_Command(0x10); */  /* Disable Charge Pump */
  SSD1306_Command(0x14);  /* Endable Charge Pump */
  /* Entire Display ON */
  SSD1306_Command(SSD1306_DISPLAYALLON_RESUME);

#if GRAPHIC_ACCELERATION_COMMANDS == 1
  SSD1306_StopScroll();
#endif

#if ADVANCED_GRAPHIC_COMMANDS == 1
  SSD1306_StopFadeOutOrBlinking();
#endif

  SSD1306_DisplayON(1);
}

#ifdef SSD1306_I2C_CONTROL
/**
  * @brief  Initialize SSD1306 through I2C, extra code container
  * @param  None
  * @retval None
  */
void SSD1306_I2cInit(void)
{
#if defined(SSD1306_RESET_USE)
  /* For reconfigured SPI module as I2C */
  SSD1306_Reset();
#endif
  SSD1306_Init();
}
#endif

#ifdef SSD1306_SPI_CONTROL
/**
  * @brief  Initialize SSD1306 through SPI, extra code container
  * @param  None
  * @retval None
  */
void SSD1306_SpiInit(void)
{
#if defined(SSD1306_RESET_USE)
  SSD1306_Reset();
#endif
  SSD1306_Init();
}
#endif

/**
  * @brief  Put single pixel in frame buffer
  * @param  x, y : Pixel position
  *         Color: Pixel color
  * @retval None
  */
void SSD1306_DrawPixel(int16_t x, int16_t y, uint8_t Color)
{
  if((x < 0) || (x >= SSD1306_LCDWIDTH) || (y < 0) || (y >= SSD1306_LCDHEIGHT))
    return;

  switch(Color)
  {
    case WHITE:
      buffer[x + (y / 8) * SSD1306_LCDWIDTH] |=  (1 << (y & 7));
      break;
    case BLACK:
      buffer[x + (y / 8) * SSD1306_LCDWIDTH] &= ~(1 << (y & 7));
      break;
    case INVERSE:
      buffer[x + (y / 8) * SSD1306_LCDWIDTH] ^=  (1 << (y & 7));
      break;
    default:
      break;
  }
}

/**
  * @brief  Clear the frame buffer
  * @param  Color : Fill color
  * @retval None
  */
void SSD1306_Clear(uint8_t Color)
{
  switch(Color)
  {
    case WHITE:
      memset(buffer, 0xFF, (SSD1306_LCDHEIGHT * SSD1306_LCDWIDTH / 8));
      break;
    case BLACK:
      memset(buffer, 0x00, (SSD1306_LCDHEIGHT * SSD1306_LCDWIDTH / 8));
      break;
    default:
      break;
  }
}

/**
  * @brief  Send buffer to GCRAM
  * @param  None
  * @retval None
  */
void SSD1306_Display(void)
{
  SSD1306_Command(SSD1306_PAGEADDR);
  SSD1306_Command(0x00);
  SSD1306_Command(0x07);

#ifdef SSD1306_I2C_CONTROL
  I2C_CWrite(SSD1306_I2C_ADDRESS, 0x40, (uint8_t*)&buffer,
            (SSD1306_LCDHEIGHT * SSD1306_LCDWIDTH / 8));
#endif

#ifdef SSD1306_SPI_CONTROL
  GPIO_WriteHigh(SSD1306_DC_Port, SSD1306_DC_Pin);
  #ifndef SPI_CS_HARDWARE_CONTROL
    GPIO_WriteLow(SSD1306_CS_Port, SSD1306_CS_Pin);
  #endif
  SPI_Transmit((uint8_t*)&buffer, (SSD1306_LCDHEIGHT * SSD1306_LCDWIDTH / 8));
  #ifndef SPI_CS_HARDWARE_CONTROL
    GPIO_WriteHigh(SSD1306_CS_Port, SSD1306_CS_Pin);
  #endif
#endif
}

/**
  * @brief  Display bitmap directly on screen
  * @param  bitmap : Pointer to the bitmap data
  * @retval None
  */
void SSD1306_Bitmap(uint8_t *bitmap)
{
  SSD1306_Command(SSD1306_PAGEADDR);
  SSD1306_Command(0x00);
  SSD1306_Command(0x07);

#ifdef SSD1306_I2C_CONTROL
  I2C_CWrite(SSD1306_I2C_ADDRESS, 0x40, bitmap,
            (SSD1306_LCDHEIGHT * SSD1306_LCDWIDTH / 8));
#endif

#ifdef SSD1306_SPI_CONTROL
  GPIO_WriteHigh(SSD1306_DC_Port, SSD1306_DC_Pin);
  #ifndef SPI_CS_HARDWARE_CONTROL
    GPIO_WriteLow(SSD1306_CS_Port, SSD1306_CS_Pin);
  #endif
  SPI_Transmit(bitmap, (SSD1306_LCDHEIGHT * SSD1306_LCDWIDTH / 8));
  #ifndef SPI_CS_HARDWARE_CONTROL
    GPIO_WriteHigh(SSD1306_CS_Port, SSD1306_CS_Pin);
  #endif
#endif
}

  • 🌿main函数
int main( void )
{
    /* STM8 configuration */
    MCU_Config();

    /* SSD1306 configuration */
#ifdef SSD1306_I2C_CONTROL
    SSD1306_I2cInit();
#endif
#ifdef SSD1306_SPI_CONTROL
    SSD1306_SpiInit();
#endif

    /* Benchmark variables */
    uint8_t i;
    uint16_t frames       = 0;
    uint16_t fps          = 0;
    uint16_t loops        = 0;
    uint16_t loops_overal = 0;

    char     fps_c[15];

    /* SSD1306 demo code */
    SSD1306_ZoomIn( 0 ); 
    SSD1306_Bitmap( ( uint8_t* )picture );

    Delay_ms( 2000 );
    SSD1306_Clear( BLACK );
    
    GFX_SetFont( font_7x7 );//字体:font_6x4 font_7x5 font_7x7 font_8x5
    GFX_SetFontSize( 1 );//0代表1/2  1代表1:1


    for( i = 0; i < 16; i++ )
    {
//    SSD1306_StartScrollLeftUp( 0, 7, SCROLL_EVERY_2_FRAMES, 0 );//左上滚动
        SSD1306_StartScrollLeft( 0, 7, SCROLL_EVERY_2_FRAMES );//整屏内容水平滚动
//   SSD1306_StartBlinking( 1 );//屏幕亮度调节
        SSD1306_ZoomIn( 0 ); //屏幕像数整体,比例缩放,0/1
        Delay_ms( 300 );
    }
    i=0;
    SSD1306_Command( 0x2E );      //关闭滚动,需要添加此指令,否则影响运行后面的显示
    SSD1306_ZoomIn( 1 ); //恢复原比例,否则对后面的显示内容有影响
    SSD1306_Clear( BLACK ); //BLACK WHITE INVERSE

    /* Infinite loop */
    for( ;; )
    {

        if( !timer_1s )
        {
            timer_1s     = 1000;
            fps          = frames;
            frames       = 0;
            loops_overal = loops;
            loops        = 0;
        }

        sprintf( fps_c, "LOOP: %04d %03d", loops_overal, i);
        SSD1306_Clear( BLACK );
        GFX_DrawString( 0, 0, fps_c, WHITE, BLACK );
        sprintf( fps_c, " FPS: %02d", fps );
        GFX_DrawString( 0, 8, fps_c, WHITE, BLACK );
        GFX_DrawString( 0, 16, "Perseverance51", WHITE, BLACK );
        GFX_DrawString( 0, 24, "Hello World", WHITE, BLACK );
        frames++;

        GPIO_SetBits( TEST_Port, TEST_Pin );
        SSD1306_Display();
        GPIO_ResetBits( TEST_Port, TEST_Pin );
        loops++;
        i++;
    }
}

📚项目工程

链接:https://pan.baidu.com/s/1rdkEzw3J8CzW-Ap2cCKzMQ 
提取码:rbv2
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要配置STM32F407微控制器的标准库驱动I2C OLED显示屏,可以按照以下步骤进行: 1. 首先,确保已经正确连接了STM32F407与I2C OLED显示屏,包括VCC、GND、SCL和SDA引脚的连接。 2. 在STM32CubeMX软件中,选择正确的板卡型号,然后在Peripherals菜单下找到I2C配置。将需要使用的I2C总线的时钟频率设置为合适的值,并启用I2C外设。 3. 在Configuration菜单下,打开Middlewares选项,然后选择I2C文件。在文件配置中,将I2C总线名称设置为需要使用的总线。例如,若使用的是I2C1总线,则将其设置为I2C1。 4. 在User Code Initialization菜单中,找到对应I2C总线的初始化函数。这将为I2C总线的硬件配置生成一段代码。 5. 接下来,将提供给的OLED显示屏驱动程序文件添加到工程中。该文件应包含用于发送I2C数据的函数。 6. 在主函数中,先调用I2C初始化函数,设置I2C的特性和参数。 7. 在需要使用OLED显示屏的地方,调用驱动程序中的相应函数,向OLED发送数据。 8. 至此,完成了配置STM32F407标准库驱动I2C OLED显示屏的过程。 需要注意的是,具体的配置步骤可能会因使用的开发环境和驱动程序而略有不同。在实际操作中,可以参考官方文档和示例代码,以确保正确配置和操作I2C驱动OLED显示屏。 ### 回答2: STM32F407是STMicroelectronics(意法半导体)推出的一款高性能ARM Cortex-M4核心的微控制器。要配置STM32F407标准库驱动I2C(Inter-Integrated Circuit),并连接OLED显示器,可以按照以下步骤进行操作: 1. 硬件连接:将OLED显示器通过I2C总线连接到STM32F407的相应引脚。确保SDA(数据线)连接到I2C数据引脚,SCL(时钟线)连接到I2C时钟引脚。 2. 在STM32CubeMX中配置I2C:打开STM32CubeMX软件,创建一个新项目。在Pinout & Configuration选项卡中,找到I2C接口,选择相应的引脚,将其分配给I2C。 3. 配置I2C时钟频率:在Configuration选项卡中,找到RCC Configuration并展开,选择适当的时钟源和分频因子,以设置I2C的时钟频率。 4. 配置OLED驱动程序:在STM32CubeMX的Middleware选项卡中,找到OLED显示器的相关驱动程序。根据OLED显示器的型号和厂商选择相应的驱动。 5. 生成代码并导出:单击生成代码按钮,然后导出生成的代码。 6. 导入代码到开发环境:将生成的代码导入到用于开发的IDE(集成开发环境)中,如Keil、IAR等。 7. 在代码中初始化I2COLED:在生成的代码中找到I2COLED的初始化函数,并在主程序中调用它们进行初始化。 8. 编写显示代码:根据OLED显示器的配置和需求,编写相应的显示代码来展示内容。 9. 编译和烧录:将代码编译为二进制文件,然后使用烧录工具将二进制文件烧录到STM32F407微控制器中。 通过以上步骤,您就可以配置STM32F407标准库驱动I2C总线上连接的OLED显示器了。请注意,确保您将相应的引脚分配给I2C总线,并正确配置时钟频率以确保I2C通信的正常运行。编写正确的显示代码可以在OLED显示器上展示所需的内容。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值