I2COLED画点函数
时间: 2023-09-08 20:09:30 浏览: 69
I2COLED画点函数可以通过以下代码实现:
```c
void OLED_DrawPixel(uint8_t x, uint8_t y, uint8_t Color)
{
if(x >= OLED_WIDTH || y >= OLED_HEIGHT)
return;
uint8_t page = y / 8;
uint8_t shift = y % 8;
uint8_t data = OLED_Buffer[x + page * OLED_WIDTH];
if(Color == 0)
data &= ~(1 << shift);
else
data |= (1 << shift);
OLED_Buffer[x + page * OLED_WIDTH] = data;
OLED_UpdateScreen();
}
```
其中,x和y表示要绘制的点的坐标,Color表示点的颜色,0为黑色,1为白色。函数首先判断坐标是否越界,然后计算出该点所在的页和位移。接着从OLED缓冲区中读取该点所在的字节数据,并根据Color设置该点的值。最后将修改后的字节数据写回到OLED缓冲区中,并调用OLED_UpdateScreen()函数将缓冲区中的数据更新到OLED屏幕上。
相关问题
i2cOLED接上去不显示
您好!很抱歉听到您遇到了问题。要解决i2c OLED不显示的问题,您可以尝试以下几个步骤:
1. 确保接线正确:检查一下您的i2c OLED模块是否正确连接到主控制器上。确保SDA(数据线)和SCL(时钟线)正确连接。
2. 确认地址设置:某些i2c OLED模块具有可调节的i2c地址。请确保您的主控制器和OLED模块使用相同的i2c地址。如果不确定,可以查看模块的规格说明书。
3. 检查电源供应:确保您的i2c OLED模块有足够的电源供应。有些OLED模块可能需要外部电源。
4. 检查代码:请检查您的代码是否正确初始化了i2c总线和OLED模块。确保您的代码没有错误,并且使用了正确的库和函数。
5. 调整对比度:尝试调整OLED模块的对比度设置。有些模块可能需要手动调整对比度才能正确显示。
如果您尝试了以上步骤后问题仍然存在,可能是硬件故障或其他问题导致的。您可以尝试更换一个新的OLED模块或者检查其他可能影响显示的因素。希望这些提示能帮到您!如果您有任何其他问题,请随时提问。
stm32f103c8t6 I2COLED
好的,以下是在STM32F103C8T6上使用I2C OLED的步骤:
1. 首先,您需要在STM32CubeMX中打开您的项目,并在“Pinout”选项卡中配置I2C和OLED引脚。选中SCL和SDA引脚,将其配置为I2C模式,并设置GPIO的输入/输出模式和速度。同时,您需要根据您的OLED型号选择正确的引脚并将其配置为输出模式。
2. 然后,在“Clock Configuration”选项卡中,启用I2C时钟,并设置I2C时钟的频率。
3. 接下来,在“Configuration”选项卡中,选择I2C外设,并根据您的需求进行配置。例如,您可以设置I2C的工作模式、地址长度、时钟占空比等。同时,您需要在代码中配置OLED的I2C地址和屏幕大小等参数。
4. 在代码中,您需要使用HAL库或其他库来初始化I2C外设,并设置I2C和OLED的参数。例如,您可以使用以下代码初始化I2C1和OLED:
```
I2C_HandleTypeDef hi2c1;
void MX_I2C1_Init(void)
{
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 100000;
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();
}
}
#define OLED_I2C_ADDR 0x78
#define OLED_WIDTH 128
#define OLED_HEIGHT 64
void OLED_Init(void)
{
HAL_Delay(100);
OLED_WR_Byte(0xAE, OLED_CMD); //关闭显示
OLED_WR_Byte(0xD5, OLED_CMD); //设置时钟分频因子,震荡频率
OLED_WR_Byte(0x80, OLED_CMD); //[3:0],分频因子;[7:4],震荡频率
OLED_WR_Byte(0xA8, OLED_CMD); //设置驱动路数
OLED_WR_Byte(0X3F, OLED_CMD); //默认0X3F(1/64)
OLED_WR_Byte(0xD3, OLED_CMD); //设置显示偏移
OLED_WR_Byte(0X00, OLED_CMD); //默认为0
OLED_WR_Byte(0x40, OLED_CMD); //设置显示开始行 [5:0],行数.
OLED_WR_Byte(0x8D, OLED_CMD); //电荷泵设置
OLED_WR_Byte(0x14, OLED_CMD); //bit2,开启/关闭
OLED_WR_Byte(0x20, OLED_CMD); //设置内存地址模式
OLED_WR_Byte(0x02, OLED_CMD); //[1:0],00,列地址模式;01,行地址模式;10,页地址模式;默认10;
OLED_WR_Byte(0xA1, OLED_CMD); //段重定向设置
OLED_WR_Byte(0xC0, OLED_CMD); //设置COM扫描方向;默认为逆向
OLED_WR_Byte(0xDA, OLED_CMD); //设置COM硬件引脚配置
OLED_WR_Byte(0x12, OLED_CMD); //[5:4]配置
OLED_WR_Byte(0x81, OLED_CMD); //对比度设置
OLED_WR_Byte(0xEF, OLED_CMD); //1~255;默认0X7F (亮度设置,越大越亮)
OLED_WR_Byte(0xD9, OLED_CMD); //设置预充电周期
OLED_WR_Byte(0xf1, OLED_CMD); //[3:0],PHASE 1;[7:4],PHASE 2;
OLED_WR_Byte(0xDB, OLED_CMD); //设置VCOMH 电压倍率
OLED_WR_Byte(0x40, OLED_CMD); //设置VCOMH 电压倍率
OLED_WR_Byte(0xA4, OLED_CMD); //全局显示开启;bit0:1,开启;0,关闭;(白屏/黑屏)
OLED_WR_Byte(0xA6, OLED_CMD); //设置显示方式;bit0:1,反相显示;0,正常显示
OLED_WR_Byte(0xAF, OLED_CMD); //开启显示
}
```
5. 接下来,您可以使用HAL库或其他库中提供的函数来向OLED写入数据。例如,您可以使用以下代码向OLED写入一个字节的数据:
```
HAL_I2C_Mem_Write(&hi2c1, OLED_I2C_ADDR, OLED_CMD, 1, &data, 1, 10);
```
6. 最后,不要忘记在使用I2C和OLED外设后及时释放总线,以便其他设备可以访问它。例如,您可以使用以下代码释放I2C总线:
```
HAL_I2C_ReleaseBus(&hi2c1);
```
希望这些步骤可以帮助您在STM32F103C8T6上使用I2C OLED。
阅读全文