STM32编写OLED显示屏驱动

简介: STM32编写OLED显示屏驱动

前言

这篇文章将带大家学习如何编写OLED显示屏的驱动程序。这里我使用的是HAL库的硬件IIC,OLED屏幕使用的是SSD1306的。

这里需要参考SSD1306的数据手册来编写驱动程序。

手册位置:


一、OLED的器件地址

OLED的器件地址由8个位组成,分别是011110SA0 R/W#。

image.png数据手册有这样一段话:

D/C# pin acts as SA0 for slave address selection

根据这段话可以得知D/C#这个引脚被作为了SA0。

根据OLED的原理图我们可以得知D/C接到了GND所以SA0 = 0。

image.png

R/W位:当要写数据时这一位是0,当要读数据时这一位是1。

所以可以得出OLED的器件地址:

写地址:0x78

读地址:0x79


二、编写写数据和写命令函数

写命令函数

这里调用了HAL库自带的HAL_I2C_Mem_Write函数来写命令和写数据。

我们需要参照数据手册中的I2C-bus Write data这一小节来编写函数。


根据数据手册可知:

第一步先发送器件地址(这里是写数据也就是0x78)。

第二步发送控制字节:

控制字节由Co位和D/C位决定

image.png

当发送的是命令的时候D/C和Co都为0。

当发送的是数据的时候D/C为1和Co为0。

所以发送命令时控制字节为0x00,发送数据时控制字节为0x40。

image.png

第三步发送数据字节也就是下面函数中的uint8_t data和uint8_t cmd这两个参数。

image.png

void OLED_WR_CMD(uint8_t cmd)
{
  HAL_I2C_Mem_Write(&hi2c1, 0x78, 0x00, I2C_MEMADD_SIZE_8BIT, &cmd, 1, 0x100);
}

写数据函数

void OLED_WR_DATA(uint8_t data)
{
  HAL_I2C_Mem_Write(&hi2c1, 0x78, 0x40, I2C_MEMADD_SIZE_8BIT, &data, 1, 0x100);
}

三、编写初始化OLED屏幕函数

下面是OLED显示屏初始化的步骤。

image.png

这些要设置的参数都放入了CMD_Data数组中。

uint8_t CMD_Data[] = {
0xAE, 0x00, 0x10, 0x40, 0xB0, 0x81, 0xFF, 0xA1, 0xA6, 0xA8, 0x3F,
0xC8, 0xD3, 0x00, 0xD5, 0x80, 0xD8, 0x05, 0xD9, 0xF1, 0xDA, 0x12,
0xD8, 0x30, 0x8D, 0x14, 0xAF };      //初始化命令

这里使用for循环将参数写入。

void WriteCmd(void)
{
  uint8_t i = 0;
  for (i = 0; i < 27; i++)
  {
    HAL_I2C_Mem_Write(&hi2c1, 0x78, 0x00, I2C_MEMADD_SIZE_8BIT, CMD_Data + i, 1, 0x100);
  }
}
//初始化oled屏幕
void OLED_Init(void)
{
  HAL_Delay(200);
  WriteCmd();
}

四、其他功能函数编写

清屏函数

//清屏
void OLED_Clear(void)
{
  uint8_t i, n;
  for (i = 0; i < 8; i++)
  {
    OLED_WR_CMD(0xb0 + i);
    OLED_WR_CMD(0x00);
    OLED_WR_CMD(0x10);
    for (n = 0; n < 128; n++)
      OLED_WR_DATA(0);
  }
}

开启OLED显示和关闭OLED显示函数

image.png

//开启OLED显示    
void OLED_Display_On(void)
{
  OLED_WR_CMD(0X8D);  //SET DCDC命令
  OLED_WR_CMD(0X14);  //DCDC ON
  OLED_WR_CMD(0XAF);  //DISPLAY ON
}
//关闭OLED显示     
void OLED_Display_Off(void)
{
  OLED_WR_CMD(0X8D);  //SET DCDC命令
  OLED_WR_CMD(0X10);  //DCDC OFF
  OLED_WR_CMD(0XAE);  //DISPLAY OFF
}

设置坐标函数

这里OLED被设置为了页地址模式,地址范围是0xb0-0xb7。也就是y的范围是0-7。

x的范围就是0-127

void OLED_Set_Pos(uint8_t x, uint8_t y)
{
  OLED_WR_CMD(0xb0 + y);
  OLED_WR_CMD(((x & 0xf0) >> 4) | 0x10);
  OLED_WR_CMD(x & 0x0f);
}

五、显示字符和数字函数编写

//显示2个数字
//x,y :起点坐标  
//len :数字的位数
//size:字体大小
//mode:模式 0,填充模式;1,叠加模式
//num:数值(0~4294967295);       
void OLED_ShowNum(uint8_t x, uint8_t y, unsigned int num, uint8_t len, uint8_t size2)
{
  uint8_t t, temp;
  uint8_t enshow = 0;
  for (t = 0; t < len; t++)
  {
    temp = (num / oled_pow(10, len - t - 1)) % 10;
    if (enshow == 0 && t < (len - 1))
    {
      if (temp == 0)
      {
        OLED_ShowChar(x + (size2 / 2)*t, y, ' ', size2);
        continue;
      }
      else enshow = 1;
    }
    OLED_ShowChar(x + (size2 / 2)*t, y, temp + '0', size2);
  }
}
//在指定位置显示一个字符,包括部分字符
//x:0~127
//y:0~63
//mode:0,反白显示;1,正常显示         
//size:选择字体 16/12 
void OLED_ShowChar(uint8_t x, uint8_t y, uint8_t chr, uint8_t Char_Size)
{
  unsigned char c = 0, i = 0;
  c = chr - ' ';//得到偏移后的值     
  if (x > 128 - 1) { x = 0; y = y + 2; }
  if (Char_Size == 16)
  {
    OLED_Set_Pos(x, y);
    for (i = 0; i < 8; i++)
      OLED_WR_DATA(F8X16[c * 16 + i]);
    OLED_Set_Pos(x, y + 1);
    for (i = 0; i < 8; i++)
      OLED_WR_DATA(F8X16[c * 16 + i + 8]);
  }
  else {
    OLED_Set_Pos(x, y);
    for (i = 0; i < 6; i++)
      OLED_WR_DATA(F6x8[c][i]);
  }
}
//显示一个字符号串
void OLED_ShowString(uint8_t x, uint8_t y, uint8_t *chr, uint8_t Char_Size)
{
  unsigned char j = 0;
  while (chr[j] != '\0')
  {
    OLED_ShowChar(x, y, chr[j], Char_Size);
    x += 8;
    if (x > 120) { x = 0; y += 2; }
    j++;
  }
}
//显示汉字
//hzk 用取模软件得出的数组
void OLED_ShowCHinese(uint8_t x, uint8_t y, uint8_t no)
{
  uint8_t t, adder = 0;
  OLED_Set_Pos(x, y);
  for (t = 0; t < 16; t++)
  {
    OLED_WR_DATA(Hzk[2 * no][t]);
    adder += 1;
  }
  OLED_Set_Pos(x, y + 1);
  for (t = 0; t < 16; t++)
  {
    OLED_WR_DATA(Hzk[2 * no + 1][t]);
    adder += 1;
  }
}

总结

这篇文章主要就是讲解了如何编写OLED的驱动程序。

相关文章
|
2月前
|
存储 编解码 开发者
基于STM32和OLED的小恐龙游戏项目设计与实现【免费开源】
小恐龙游戏最初是作为浏览器离线小游戏而广为人知,其简单的操作与生动的画面使其深受用户喜爱。本项目将经典的小恐龙跳跃游戏移植到嵌入式平台上,使用STM32微控制器作为核心控制器,OLED屏幕进行显示,搭配按键或触摸实现用户交互。通过本项目,既可以体验游戏开发在嵌入式系统上的实现方式,又能掌握STM32 GPIO、定时器、OLED驱动、按键扫描及简单动画实现技术。
基于STM32和OLED的小恐龙游戏项目设计与实现【免费开源】
STM32Cubemx PWM驱动加湿器模拟火山喷发效果
STM32Cubemx PWM驱动加湿器模拟火山喷发效果
276 14
STM32Cubemx PWM驱动SG90舵机
STM32Cubemx PWM驱动SG90舵机
638 13
STM32CubeMX mpu6050驱动
STM32CubeMX mpu6050驱动
214 10
STM32CubeMX EC11旋转编码器驱动
STM32CubeMX EC11旋转编码器驱动
1113 10
STM32CubeMX OLED驱动
STM32CubeMX OLED驱动
216 10
|
传感器
手把手在STM32F103C8T6上构建可扩展可移植的DHT11驱动
【8月更文挑战第29天】本文详细介绍在STM32F103C8T6上构建可扩展且可移植的DHT11温湿度传感器驱动的步骤,包括硬件与软件准备、硬件连接、驱动代码编写及测试。通过这些步骤,可根据实际项目需求优化和扩展代码。
594 0
STM32CubeMX WS2812B灯驱动
STM32CubeMX WS2812B灯驱动
897 1
STM32CubeMX ULN2003步进电机驱动
STM32CubeMX ULN2003步进电机驱动
326 0
STM32Cubemx TB6612直流电机驱动
STM32Cubemx TB6612直流电机驱动
766 0