OLED关于命令和数据发送的区别

 发送设备地址后,后面需要发送一个控制位,D/C为1代表的是发送数据,D/C为0的代表是发送命令,这就是为什么例程代码中有0x00和0x40了,具体信息可以查看芯片手册

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个基于STM32 HAL库的OLED显示字符和数据的代码模板: ```c #include "stm32f4xx_hal.h" // OLED的I2C地址 #define OLED_ADDRESS 0x78 // OLED的分辨率 #define OLED_WIDTH 128 #define OLED_HEIGHT 64 // OLED的缓冲区 uint8_t OLED_Buffer[1024]; I2C_HandleTypeDef hi2c1; // I2C1的句柄 void OLED_Init(void) { // 以下是初始化OLED的I2C通信 HAL_I2C_Init(&hi2c1); // 以下是初始化OLED命令 uint8_t OLED_InitCmd[] = { 0xAE, // 关闭OLED显示 0xD5, 0x80, // 设置时钟分频因子,震荡频率 0xA8, 0x3F, // 设置驱动路数 0xD3, 0x00, // 设置显示偏移 0x40, // 设置显示开始行 [5:0],这个值默认为0 0x8D, 0x14, // 设置内存地址模式 0x20, 0x00, // 设置内存地址模式为水平模式 0xA0, // 设置列地址的扫描方向 0xC0, // 设置行地址的扫描方向 0xDA, 0x12, // 设置COM硬件引脚配置 0x81, 0xCF, // 设置对比度 0xD9, 0xF1, // 设置预充电周期 0xDB, 0x40, // 设置VCOMH Deselect Level 0xA4, // 全局显示开启,显示指令开启 0xA6, // 设置显示方式,A6为反相显示,A7为正常显示 0xAF // 打开OLED显示 }; HAL_I2C_Mem_Write(&hi2c1, OLED_ADDRESS, 0x00, 1, OLED_InitCmd, sizeof(OLED_InitCmd), 1000); } void OLED_Clear(void) { memset(OLED_Buffer, 0x00, sizeof(OLED_Buffer)); // 清空缓冲区 OLED_Update(); // 更新OLED屏幕 } void OLED_Update(void) { uint8_t OLED_DataCmd[] = { 0x40, // 数据写入命令 }; // 分别将每行数据发送OLED for (uint8_t y = 0; y < OLED_HEIGHT / 8; y++) { uint8_t OLED_PageCmd[] = { 0xB0 + y, // 设置页地址 0x00, // 设置列地址低位 0x10, // 设置列地址高位 }; HAL_I2C_Mem_Write(&hi2c1, OLED_ADDRESS, 0x00, 1, OLED_PageCmd, sizeof(OLED_PageCmd), 1000); HAL_I2C_Mem_Write(&hi2c1, OLED_ADDRESS, 0x40, 1, &OLED_Buffer[y * OLED_WIDTH], OLED_WIDTH, 1000); } } void OLED_DrawPixel(uint8_t x, uint8_t y) { if (x >= OLED_WIDTH || y >= OLED_HEIGHT) { return; } OLED_Buffer[x + (y / 8) * OLED_WIDTH] |= 1 << (y % 8); } void OLED_DrawChar(uint8_t x, uint8_t y, char c) { if (x >= OLED_WIDTH || y >= OLED_HEIGHT) { return; } for (uint8_t i = 0; i < 8; i++) { OLED_Buffer[x + (y / 8) * OLED_WIDTH + i * OLED_WIDTH] = Font8x8[c][i]; } } void OLED_DrawString(uint8_t x, uint8_t y, const char *str) { if (x >= OLED_WIDTH || y >= OLED_HEIGHT) { return; } while (*str) { OLED_DrawChar(x, y, *str++); x += 8; } } ``` 其中,`OLED_Init()`函数用于初始化OLED屏幕;`OLED_Clear()`函数用于清空屏幕;`OLED_Update()`函数用于更新屏幕,需要在修改了缓冲区之后调用;`OLED_DrawPixel()`函数用于在指定位置绘制一个像素;`OLED_DrawChar()`函数用于在指定位置绘制一个字符;`OLED_DrawString()`函数用于在指定位置绘制一个字符串。在使用这些函数之前,需要先定义好OLED的I2C地址和分辨率,并且需要引入一个8x8的字体数组(例如`Font8x8`)。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凉界流

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值