void OLED_display_on(void) { oled_write_byte(0x8d, OLED_CMD); oled_write_byte(0x14, OLED_CMD); oled_write_byte(0xaf, OLED_CMD); } void OLED_display_off(void) { oled_write_byte(0x8d, OLED_CMD); oled_write_byte(0x10, OLED_CMD); oled_write_byte(0xae, OLED_CMD);
时间: 2023-06-16 22:02:09 浏览: 119
这段代码是用于 OLED 显示屏控制的。其中,OLED_display_on() 函数用于打开 OLED 显示屏,而 OLED_display_off() 函数则用于关闭 OLED 显示屏。
具体来说,OLED_display_on() 函数通过向 OLED 显示屏发送三个命令字节,分别为 0x8d、0x14 和 0xaf,来打开 OLED 显示屏。其中,第一个命令字节为设置 DC-DC 电源模式/开关电源模式,第二个命令字节为设置 DC-DC 电源输出电压,第三个命令字节为打开 OLED 显示屏。
而 OLED_display_off() 函数则通过向 OLED 显示屏发送三个命令字节,分别为 0x8d、0x10 和 0xae,来关闭 OLED 显示屏。其中,第一个命令字节和第二个命令字节与 OLED_display_on() 函数相同,第三个命令字节为关闭 OLED 显示屏。
相关问题
0.96存oled屏幕写点函数
以下是一个基本的OLED屏幕控制函数,可以在STM32上使用:
```c
#include "stm32f1xx_hal.h"
#include "fonts.h"
#define OLED_I2C_ADDRESS 0x78
#define OLED_WIDTH 128
#define OLED_HEIGHT 64
#define OLED_COMMAND 0x00
#define OLED_DATA 0x40
#define OLED_CONTROL_BYTE(mode, addr) ((mode << 7) | (addr))
#define OLED_SETCONTRAST 0x81
#define OLED_DISPLAY_ALLON 0xA5
#define OLED_DISPLAY_NORMAL 0xA6
#define OLED_DISPLAY_OFF 0xAE
#define OLED_DISPLAY_ON 0xAF
#define OLED_SETDISPLAYOFFSET 0xD3
#define OLED_SETCOMPINS 0xDA
#define OLED_SETVCOMDETECT 0xDB
#define OLED_SETDISPLAYCLOCKDIV 0xD5
#define OLED_SETPRECHARGE 0xD9
#define OLED_SETMULTIPLEX 0xA8
#define OLED_SETLOWCOLUMN 0x00
#define OLED_SETHIGHCOLUMN 0x10
#define OLED_SETSTARTLINE 0x40
#define OLED_MEMORYMODE 0x20
#define OLED_COLUMNADDR 0x21
#define OLED_PAGEADDR 0x22
#define OLED_COMSCANINC 0xC0
#define OLED_COMSCANDEC 0xC8
#define OLED_SEGREMAP 0xA0
#define OLED_CHARGEPUMP 0x8D
static I2C_HandleTypeDef hi2c1;
static void OLED_WriteCommand(uint8_t cmd)
{
uint8_t control = OLED_CONTROL_BYTE(OLED_COMMAND, 0x00);
HAL_I2C_Mem_Write(&hi2c1, OLED_I2C_ADDRESS, control, 1, &cmd, 1, 100);
}
static void OLED_WriteData(uint8_t* data, uint16_t len)
{
uint8_t control = OLED_CONTROL_BYTE(OLED_DATA, 0x00);
HAL_I2C_Mem_Write(&hi2c1, OLED_I2C_ADDRESS, control, 1, data, len, 100);
}
void OLED_Init(I2C_HandleTypeDef* i2c)
{
hi2c1 = *i2c;
HAL_Delay(100);
OLED_WriteCommand(OLED_DISPLAY_OFF);
OLED_WriteCommand(OLED_SETDISPLAYCLOCKDIV);
OLED_WriteCommand(0x80);
OLED_WriteCommand(OLED_SETMULTIPLEX);
OLED_WriteCommand(OLED_HEIGHT - 1);
OLED_WriteCommand(OLED_SETDISPLAYOFFSET);
OLED_WriteCommand(0x00);
OLED_WriteCommand(OLED_SETSTARTLINE | 0x00);
OLED_WriteCommand(OLED_CHARGEPUMP);
OLED_WriteCommand(0x14);
OLED_WriteCommand(OLED_MEMORYMODE);
OLED_WriteCommand(0x00);
OLED_WriteCommand(OLED_SEGREMAP | 0x01);
OLED_WriteCommand(OLED_COMSCANDEC);
OLED_WriteCommand(OLED_SETCOMPINS);
OLED_WriteCommand(0x12);
OLED_WriteCommand(OLED_SETCONTRAST);
OLED_WriteCommand(0xCF);
OLED_WriteCommand(OLED_SETPRECHARGE);
OLED_WriteCommand(0xF1);
OLED_WriteCommand(OLED_SETVCOMDETECT);
OLED_WriteCommand(0x40);
OLED_WriteCommand(OLED_DISPLAY_ALLON);
OLED_WriteCommand(OLED_DISPLAY_NORMAL);
OLED_WriteCommand(OLED_DISPLAY_ON);
}
void OLED_FillScreen(uint8_t color)
{
uint8_t data[128];
uint8_t fill = color ? 0xFF : 0x00;
for (int i = 0; i < 128; ++i)
{
data[i] = fill;
}
for (int i = 0; i < 8; ++i)
{
OLED_SetPosition(0, i);
OLED_WriteData(data, 128);
}
}
void OLED_SetPosition(uint8_t x, uint8_t y)
{
OLED_WriteCommand(OLED_COLUMNADDR);
OLED_WriteCommand(x);
OLED_WriteCommand(OLED_WIDTH - 1);
OLED_WriteCommand(OLED_PAGEADDR);
OLED_WriteCommand(y);
OLED_WriteCommand(OLED_HEIGHT / 8 - 1);
}
void OLED_DrawPixel(uint8_t x, uint8_t y, uint8_t color)
{
OLED_SetPosition(x, y / 8);
uint8_t data = 1 << (y % 8);
if (color)
{
data = ~data;
}
OLED_WriteData(&data, 1);
}
void OLED_DrawChar(uint8_t x, uint8_t y, char c, FontDef_t* font, uint8_t color)
{
uint32_t i, j;
uint32_t height = font->FontHeight;
uint32_t width = font->FontWidth;
uint32_t offset = (c - font->StartChar) * height * (width / 8);
const uint8_t* data = &font->FontTable[offset];
for (i = 0; i < height; i++)
{
for (j = 0; j < width; j++)
{
if ((data[i * (width / 8) + j / 8] >> (j % 8)) & 0x01)
{
OLED_DrawPixel(x + j, y + i, color);
}
}
}
}
void OLED_DrawString(uint8_t x, uint8_t y, const char* str, FontDef_t* font, uint8_t color)
{
uint32_t i = 0;
while (str[i] != '\0')
{
OLED_DrawChar(x, y, str[i], font, color);
x += font->FontWidth;
i++;
}
}
```
注意:此代码仅供参考,可能需要根据具体的OLED屏幕型号和MCU平台进行适当修改。同时,还需要提供字体文件(fonts.h)以支持文字显示功能。
stm32f103c8t6实现利用mxclube实现oled屏的驱动
首先,你需要在MXCube中启用I2C和GPIO外设,然后将I2C和GPIO引脚配置为所需的功能。然后,你可以使用OLED驱动器的数据手册,编写代码来实现OLED的初始化和控制。
以下是一些可能有用的参考代码:
1. 初始化I2C外设
```c
I2C_HandleTypeDef hi2c1;
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();
}
}
```
2. 初始化GPIO外设
```c
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pins : PC13 PC14 PC15 */
GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/*Configure GPIO pins : PA0 PA1 PA2 */
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
```
3. 初始化OLED
```c
void OLED_Init(void)
{
OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel
OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
OLED_WR_Byte(0x40,OLED_CMD);//--set start line address Set Mapping RAM Display Start Line (0x00~0x3F)
OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register
OLED_WR_Byte(0xCF,OLED_CMD); // Set SEG Output Current Brightness
OLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping 0xa0左右反置 0xa1正常
OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction 0xc0上下反置 0xc8正常
OLED_WR_Byte(0xA6,OLED_CMD);//--set normal display
OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty
OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset Shift Mapping RAM Counter (0x00~0x3F)
OLED_WR_Byte(0x00,OLED_CMD);//-not offset
OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency
OLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec
OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period
OLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
OLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration
OLED_WR_Byte(0x12,OLED_CMD);
OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomh
OLED_WR_Byte(0x40,OLED_CMD);//Set VCOM Deselect Level
OLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02)
OLED_WR_Byte(0x02,OLED_CMD);//
OLED_Clear();
OLED_WR_Byte(0x8D,OLED_CMD);//电荷泵设置
OLED_WR_Byte(0x14,OLED_CMD);//开启
OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel
}
```
4. OLED写入命令或数据
```c
void OLED_WR_Byte(uint8_t dat,uint8_t cmd)
{
if(cmd)
{
HAL_GPIO_WritePin(GPIOA, OLED_DC_Pin, GPIO_PIN_SET);//写命令
}
else
{
HAL_GPIO_WritePin(GPIOA, OLED_DC_Pin, GPIO_PIN_RESET);//写数据
}
HAL_I2C_Mem_Write(&hi2c1, OLED_ADDRESS<<1, 0x00, 1, &dat, 1, 10);
}
```
5. 清空OLED屏幕
```c
void OLED_Clear(void)
{
uint8_t i,n;
for(i=0;i<8;i++)
{
OLED_WR_Byte (0xb0+i,OLED_CMD); //设置页地址(0~7)
OLED_WR_Byte (0x00,OLED_CMD); //设置显示位置—列低地址
OLED_WR_Byte (0x10,OLED_CMD); //设置显示位置—列高地址
for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA);
} //更新显示
}
```
这些代码只是参考,你需要根据你的具体需求和OLED屏的数据手册来编写你自己的OLED驱动程序。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)