[APM32F4] APM32F411V Tiny Board测评】-5-iic代码测试和oled的驱动

[复制链接]
 楼主| chenqiguang1998 发表于 2024-5-29 18:35 | 显示全部楼层 |阅读模式
本帖最后由 chenqiguang1998 于 2024-6-3 15:11 编辑

#申请原创#  在本次测评中,我们将对 APM32F411V Tiny Board 的 IIC 代码进行测试,并尝试驱动 0.96 寸 IIC 协议的 OLED 蓝黄双色模块。

一、引脚设置

根据 OLED 模块的引脚定义,我们可以将其 SCL 和 SDA 引脚分别连接到 APM32F411V Tiny Board 的 PB3 和 PB10 引脚上。

二、IIC 代码测试

首先,我们需要确保 APM32F411V Tiny Board 上的 IIC 接口已经正确连接。根据参考手册,我们可以使用以下代码来初始化 IIC 接口:
  1. I2C_HandleTypeDef  hi2c2;
  2. void MX_I2C2_Init(void) {
  3.     hi2c2.Instance = I2C2;
  4.     hi2c2.Init.ClockSpeed = 100000;
  5.     hi2c2.Init.DutyCycle = I2C_DUTYCYCLE_2;
  6.     hi2c2.Init.OwnAddress1 = 0;
  7.     hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  8.     hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  9.     hi2c2.Init.OwnAddress2 = 0;
  10.     hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  11.     hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  12.     DAL_I2C_Init(&hi2c2);
  13. }
接下来,我们可以使用以下代码来向 OLED 模块发送数据:
  1. #define OLED_ADDRESS 0x78

  2. // 向 OLED 发送命令
  3. void OLED_SendCommand(uint8_t command) {
  4.     DAL_I2C_Master_Transmit(&hi2c2, OLED_ADDRESS, &command, 1, 100);
  5. }

  6. // 向 OLED 发送数据
  7. void OLED_SendData(uint8_t data) {
  8.     DAL_I2C_Master_Transmit(&hi2c2, OLED_ADDRESS, &data, 1, 100);
  9. }

  10. // OLED 初始化
  11. void OLED_Init(void) {
  12.     OLED_SendCommand(0xAE); // 关闭显示
  13.     OLED_SendCommand(0x20); // 设置内存地址模式
  14.     OLED_SendCommand(0x02);
  15.     OLED_SendCommand(0xB0); // 设置页地址
  16.     OLED_SendCommand(0xC8); // 扫描方向反转
  17.     OLED_SendCommand(0x00); // 低列起始地址
  18.     OLED_SendCommand(0x10); // 高列起始地址
  19.     OLED_SendCommand(0x40); // 设置显示起始行
  20.     OLED_SendCommand(0x81); // 设置对比度
  21.     OLED_SendCommand(0xFF);
  22.     OLED_SendCommand(0xA1); // 段重映射
  23.     OLED_SendCommand(0xA6); // 正常显示(非反相)
  24.     OLED_SendCommand(0xA8); // 设置多路复用比
  25.     OLED_SendCommand(0x3F);
  26.     OLED_SendCommand(0xA4); // 全局显示开启
  27.     OLED_SendCommand(0xD3); // 设置显示偏移
  28.     OLED_SendCommand(0x00);
  29.     OLED_SendCommand(0xD5); // 设置时钟分频比
  30.     OLED_SendCommand(0x80);
  31.     OLED_SendCommand(0xD9); // 预充电设置
  32.     OLED_SendCommand(0xF1);
  33.     OLED_SendCommand(0xDA); // 引脚配置
  34.     OLED_SendCommand(0x12);
  35.     OLED_SendCommand(0x8D); // 电荷泵设置
  36.     OLED_SendCommand(0x14);
  37.     OLED_SendCommand(0xAF); // 开启显示
  38. }

  39. // 在指定位置显示一个像素
  40. void OLED_SetPixel(uint8_t x, uint8_t y, uint8_t color) {
  41.     uint8_t page = y / 8;
  42.     uint8_t col = x;
  43.     if (color) {
  44.         OLED_SendData(0x01 << (y % 8));
  45.     } else {
  46.         OLED_SendData(0x00);
  47.     }
  48.     OLED_SendCommand(0xB0 + page);
  49.     OLED_SendCommand((col & 0xF0) >> 4 | 0x10);
  50.     OLED_SendCommand(col & 0x0F);
  51. }

  52. // 发送命令函数修改
  53. void OLED_WriteCmd(uint8_t cmd) {
  54.     DAL_I2C_Master_Transmit(&hi2c, OLED_ADDRESS, &cmd, 1, 1000);
  55. }

  56. // 发送数据函数修改
  57. void OLED_WriteData(uint8_t data) {
  58.     DAL_I2C_Master_Transmit(&hi2c, OLED_ADDRESS, &data, 1, 1000);
  59. }

  60. // 设置光标位置函数修改
  61. void OLED_SetCursor(uint8_t x, uint8_t y) {
  62.     OLED_WriteCmd(0xB0 + y);
  63.     OLED_WriteCmd(((x & 0xF0) >> 4) | 0x10);
  64.     OLED_WriteCmd((x & 0x0F) | 0x01);
  65. }

  66. void OLED_Clear()
  67. {
  68.     for (uint8_t i = 0; i < 8; i++)
  69.     {
  70.         OLED_SetCursor(0, i);
  71.         for (uint8_t j = 0; j < 128; j++)
  72.         {
  73.             OLED_WriteData(0x00);
  74.         }
  75.     }
  76. }

  77. void OLED_ShowString(uint8_t x, uint8_t y, const char *str)
  78. {
  79.     OLED_SetCursor(x, y);
  80.     while (*str)
  81.     {
  82.         OLED_WriteData(*str++);
  83.     }
  84. }

  85. typedef enum {
  86.     MENU_FUNCTION,
  87.     MENU_TEST,
  88.     MENU_FUNCTION_SOFT,
  89.     MENU_FUNCTION_NORMAL,
  90.     MENU_FUNCTION_STRONG,
  91.     MENU_TEST_PROGRESSIVE,
  92.     MENU_TEST_SENSOR_BASED
  93. } Menu;

  94. Menu current_menu = MENU_FUNCTION;
  95. Menu previous_menu = MENU_FUNCTION_SOFT;

  96. #define OLED_COLOR_BLACK 0x00

  97. void OLED_Fill_Black(uint8_t data) {
  98.     for (int page = 0; page < 8; page++) {
  99.         // 设置页地址
  100.         uint8_t cmd[2] = {0xB0 + page, 0x00};
  101.         DAL_I2C_Master_Transmit(&hi2c, OLED_ADDRESS, cmd, 2, 100);

  102.         // 逐列填充颜色数据
  103.         for (int col = 0; col < 128; col++) {
  104.             DAL_I2C_Master_Transmit(&hi2c, OLED_ADDRESS, &data, 1, 100);
  105.         }
  106.     }
  107. }

  108. void OLED_WriteString(const char *str, uint8_t font, uint8_t color) {
  109.     while (*str) {
  110.         uint8_t data[2] = {(uint8_t)*str, color};
  111.         HAL_I2C_Master_Transmit(&hi2c, OLED_ADDRESS, data, 2, 100);
  112.         str++;
  113.     }
  114. }
最后进行测试:
  1. int main()
  2. {
  3.     DAL_Init();
  4.     SystemClock_Config();

  5.     MX_I2C2_Init();
  6.     OLED_Init();

  7.     OLED_Clear();
  8.     OLED_ShowString(0, 0, "Hello, World!");




beacherblack 发表于 2024-6-4 12:24 | 显示全部楼层
硬件iic还有之前的bug吗?  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

59

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部