stm32codeMx 驱动ssd1306

// 0 0 0 0 0 0 SA0 R/W#
#define LED_DEVICE_ADDR (0x78)

// Co D/C 0 0 0 0 0 0
#define LED_DEVICE_WCMD (0x00) // 连续写命�????????????

#define I2C1_SENDTIMEOUT 100

void ssd1306_init()
{
  uint8_t pdata[] = {0xae,       // 关闭显示
                     0x20, 0x02, // 配置内存寻址模式
                     0x00, 0x10, // 页寻�?
                     0x40,       // 设置显示�?始行
                     0x81, 0x7f, // 设置对比�?
                     0xa0,       // 列地�?映射
                     0xc0,       // 输出扫描方向
                     0xa8, 0x3f, // 设置多重比例
                     0xd3, 0x00, // 显示偏移
                     0xd5, 0x80, // 设置显示时钟分频,振荡器频�?
                     0xd9, 0xf1, // 设置预充电周�?
                     0xda, 0x12, // 设置COM引脚硬件配置
                     0xdb, 0x20, // 设置VCOMH取消选择等级
                     0x8d, 0x14, // 电荷泵设�?
                     0xa4,       // 整个显示打开,忽略\展示内存中的数据
                     0xa6,       // 设置正\反显�? "0�?1�?"或�??"0�?1�?"

                     //
                     //  0x26, // 向左\右水平滚�?
                     //  0x00, // 脏数�?
                     //  0x00, // 页开始地�?
                     //  0x07, // 滚动帧�?�率
                     //  0x07, // 结束页地�?
                     //  0x00, // 脏数�?
                     //  0xFF, // 脏数�?
                     //  0x2f, // 使能滚动

                     //
                     0xaf}; // 显示打开
  int len = sizeof(pdata) / sizeof(pdata[0]),
      ret = 0;

    //写初始化配置
  ret = HAL_I2C_Mem_Write(&hi2c2, LED_DEVICE_ADDR, 0, 0, pdata, len, I2C1_SENDTIMEOUT);
  if (ret != 0)
  {
    printf("error 0\n");
    return;
  }
}


void ssd1306_clear()
{
  // vTaskDelay(50 / portTICK_PERIOD_MS);

  uint8_t data[] = {0xb0,  // 设置页面开始地址
                    0x00,  // 设置页面寻址模式的下起始地址
                    0x10}; // 设置页面寻址模式的上起始地址

  uint8_t pdata[128] = {0xff}; // 像素数据
  int ret = 0,
      len = sizeof(data) / sizeof(data[0]),
      plen = sizeof(pdata) / sizeof(pdata[0]);
  // printf("len %d\n", len);
  for (int i = 0; i < 8; i++)
  {
    //写控制命令告诉ssd1306 需要写指定位置显存
    ret = HAL_I2C_Mem_Write(&hi2c2, LED_DEVICE_ADDR, 0, 0, data, 3, I2C1_SENDTIMEOUT);

    //写数据内容到显存
    ret = HAL_I2C_Mem_Write(&hi2c2, LED_DEVICE_ADDR, 0x40, 1, pdata, plen, I2C1_SENDTIMEOUT);
    if (ret != 0)
    {
      printf("error 5\n");
    }
    data[0] += 1; // 页地址b0~b7
  }
}

可以直接使用,stm32codeMx的使用不多介绍,参考上一篇stm32codeMx 读取24c02

显示效果如下图:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用STM32HAL库驱动SSD1306 OLED显示屏的IIC接口的示例代码: ```c #include "stm32f4xx_hal.h" #include "ssd1306.h" I2C_HandleTypeDef hi2c1; #define SSD1306_I2C_ADDR 0x78 // SSD1306 I2C地址 void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_I2C1_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_I2C1_Init(); ssd1306_Init(&hi2c1); ssd1306_Fill(White); // 填充白色 ssd1306_UpdateScreen(&hi2c1); // 更新屏幕 HAL_Delay(1000); ssd1306_Fill(Black); // 填充黑色 ssd1306_UpdateScreen(&hi2c1); // 更新屏幕 while (1) { } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; RCC_OscInitStruct.PLL.PLLM = 8; RCC_OscInitStruct.PLL.PLLN = 336; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 7; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { Error_Handler(); } } static void MX_I2C1_Init(void) { hi2c1.Instance = I2C1; hi2c1.Init.ClockSpeed = 400000; hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; hi2c1.Init.OwnAddress1 = 0; hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; hi2c1.Init.OwnAddress2 = 0; hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; if (HAL_I2C_Init(&hi2c1) != HAL_OK) { Error_Handler(); } } static void MX_GPIO_Init(void) { __HAL_RCC_GPIOC_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_8; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); } void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(i2cHandle->Instance==I2C1) { __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_I2C1_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); } } void HAL_I2C_MspDeInit(I2C_HandleTypeDef* i2cHandle) { if(i2cHandle->Instance==I2C1) { __HAL_RCC_I2C1_CLK_DISABLE(); HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6 | GPIO_PIN_7); } } ``` 上述代码中,我们通过HAL库初始化了I2C1接口,并在SSD1306 OLED显示屏上绘制了白色和黑色的屏幕。在使用此代码时,需要包含ssd1306.h和ssd1306.c文件,这些文件包含了SSD1306 OLED显示屏的驱动程序。同时需要注意的是,需要根据实际的硬件连接情况修改I2C引脚的定义。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值