U8g2
- U8g2 是一个用于控制 OLED 和 LCD 显示器的开源库,特别适用于各种微控制器和嵌入式系统。它支持 I2C、SPI 等通信方式
- 使用的OLED上使用的是IIC协议
- 使用步骤
- 开启I2C1的模式为I2C,配置其SPeed Mode模式为Fast Mode
- 开启RCC为Crystal,配置时钟电路为64Mhz
- USART1为异步通信(串口连接在这里,故要使用)
- 在Core下放置u8g2_port文件夹,并在project-》properties中添加其路径,文件夹都要添加途径,子文件夹也一样,如下图
- 使用方法
1. u8g2_t u8g2;
2. u8g2_Init(&u8g2, &hi2c1, 0x78);
可以通过调用该函数查看I2C设备上挂载的地址
void I2C_Scan(void)
{
HAL_StatusTypeDef result;
uint8_t i;
printf("Scanning I2C bus...\r\n");
for (i = 1; i < 128; i++)
{
result = HAL_I2C_IsDeviceReady(&hi2c1, (uint16_t)(i << 1), 1, 10);
if (result == HAL_OK)
{
printf("I2C device found at address 0x%02X\r\n", i);
}
}
printf("Scan complete.\r\n");
}
3. u8g2_ClearBuffer(&u8g2);
4. 绘制完成后,调用 u8g2_SendBuffer() 将缓冲区中的数据发送到 OLED 显示屏
5. u8g2_SetFont(&u8g2, u8g2_font_ncenB08_tr);
6. u8g2_DrawStr(&u8g2, 0, 24, "Hello, STM32!");
7. u8g2_DrawHLine(&u8g2, 10, 30, 50);
8. u8g2_DrawBox(&u8g2, 10, 10, 50, 20);
9. 玩花的还可以在一张图片显示后,再延迟显示另一个。
10. 等等
示例代码
#include "main.h"
#include "u8g2.h"
u8g2_t u8g2;
I2C_HandleTypeDef hi2c1;
UART_HandleTypeDef huart1;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_I2C1_Init(void);
static void MX_USART1_UART_Init(void);
#include "stdio.h"
void I2C_Scan(void)
{
HAL_StatusTypeDef result;
uint8_t i;
printf("Scanning I2C bus...\r\n");
for (i = 1; i < 128; i++)
{
result = HAL_I2C_IsDeviceReady(&hi2c1, (uint16_t)(i << 1), 1, 10);
if (result == HAL_OK)
{
printf("I2C device found at address 0x%02X\r\n", i);
}
}
printf("Scan complete.\r\n");
}
int __io_putchar(int ch)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
return ch;
}
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_I2C1_Init();
MX_USART1_UART_Init();
u8g2_Init(&u8g2, &hi2c1, 0x78);
u8g2_SetFont(&u8g2, u8g2_font_9x15_tr);
u8g2_DrawBox(&u8g2, 0, 18, 30, 20);
u8g2_SetFontPosTop(&u8g2);
u8g2_DrawStr(&u8g2, 0, 0, "hello world!!!");
u8g2_DrawPixel(&u8g2, 0, 16);
u8g2_SendBuffer(&u8g2);
I2C_Scan();
while (1)
{
}
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL8;
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_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != 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_USART1_UART_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
}
static void MX_GPIO_Init(void)
{
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
}
void Error_Handler(void)
{
__disable_irq();
while (1)
{
}
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t *file, uint32_t line)
{
}
#endif
1.将图片保存为bmp格式
2.https:
3.用2的软件给出取模
4.u8g2_DrawXBMP();
5.代码示例
#include "main.h"
#include "u8g2.h"
u8g2_t u8g2;
const unsigned char hellokitty[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C ,
0x3C,0x00,0x00,0x7C,0x00,0xFC,0x67,0x00,0x00,0xC6,0xFF,0xFF,0x41,0x00,0x00,0x02,0x3F,0xFF,0x41,0x00,0x00,0x03,0x00,0xFF,0xC3,0x00,0x00,0x03,0x00,0xFF,0xFF,0x00,0x00,0x03,0x00,0xFF,0xFF,0x01,0x00,0x03,0x00,0xFF,0xFF,0x01,0x00,0x06,0x00,0xFF,0xFF,0x01,0x00,0x02,0x00,0xFE,0xFF,0x01,0x00,0x03,0x00,0x80,0xFF,0x01,0x00,0x01 ,
0x00,0x00,0xFC,0x00,0x00,0x01,0x00,0x00,0xF8,0x00,0x80,0x01,0x00,0x00,0x90,0x01,0x80,0x00,0x00,0x00,0x80,0x01,0x80,0x00,0x00,0x00,0x80,0x07,0xF0,0x03,0x00,0x00,0xC0,0x01,0x80,0x81,0x01,0x80,0x81,0x01,0x80,0xC1,0x01,0x80,0x81,0x01,0x00,0x81,0x00,0x80,0xC1,0x07,0xC0,0x03,0xC0,0x03,0x80,0x00,0x00,0x03,0xC0,0x03,0xC0,0x00 ,
0x00,0x0E,0x00,0x00,0xE0,0x00,0x00,0x0E,0x00,0x00,0xE0,0x01,0x80,0x19,0x00,0x00,0x30,0x02,0x80,0x70,0x00,0x00,0x1C,0x00,0x00,0xC0,0x03,0x80,0x07,0x00,0x00,0x00,0xFE,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
const unsigned char hanziku[14][ 32 ] = {
{0x00,0x00,0xFF,0x7F,0x20,0x02,0x20,0x02,0x20,0x02,0xFC,0x1F,0x24,0x12,0x24,0x12,0x24,0x12,0x24,0x12,0x14,0x1C,0x0C,0x10,0x04,0x10,0x04,0x10,0xFC,0x1F,0x04,0x10},
{0x40,0x08,0x84,0x08,0x88,0x08,0xE8,0x7D,0x41,0x04,0x42,0x02,0xC2,0x3D,0x48,0x21,0x48,0x11,0x44,0x11,0x47,0x7D,0x44,0x11,0x24,0x11,0x24,0x11,0x94,0x15,0x08,0x08},
{0x00,0x00,0x04,0x00,0x88,0x1F,0x08,0x10,0x00,0x10,0x00,0x10,0x0F,0x10,0x88,0x1F,0x88,0x10,0x88,0x00,0x88,0x00,0x88,0x00,0xA8,0x40,0x98,0x40,0x08,0x7F,0x00,0x00},
{0x00,0x04,0x7E,0x04,0x40,0x04,0x20,0x04,0x10,0x04,0x10,0x15,0x50,0x25,0x30,0x25,0x9C,0x44,0x93,0x44,0x50,0x44,0x10,0x04,0x10,0x04,0x10,0x04,0x14,0x05,0x08,0x02},
{0x08,0x00,0xC8,0x7F,0x08,0x02,0x08,0x02,0x98,0x3F,0x2A,0x21,0x0A,0x21,0xCA,0x7F,0x09,0x00,0x08,0x00,0x88,0x3F,0x88,0x20,0x88,0x20,0x88,0x20,0x88,0x3F,0x88,0x20},
{0x40,0x00,0x80,0x00,0xFE,0x7F,0x02,0x40,0x11,0x24,0x08,0x08,0x04,0x10,0x00,0x00,0xF8,0x0F,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xFE,0x3F,0x00,0x00},
{0x00,0x02,0x11,0x22,0xCA,0x2F,0x04,0x12,0x0A,0x0A,0xE9,0x7F,0x08,0x02,0x08,0x01,0x8C,0x1F,0xCA,0x10,0xA9,0x10,0x88,0x1F,0x88,0x10,0x88,0x10,0x85,0x1F,0x82,0x10},
{0x00,0x00,0x00,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x04,0x10,0x04,0x10,0x04,0x10,0x08,0x08,0x08,0x08,0x10,0x04,0x10,0x04,0x20,0x02,0x40},
{0x00,0x12,0x00,0x22,0x00,0x02,0xFF,0x7F,0x00,0x02,0x48,0x02,0x48,0x22,0x48,0x22,0xFE,0x22,0x48,0x14,0x48,0x14,0x48,0x48,0x44,0x4C,0x44,0x52,0x02,0x61,0xC0,0x40},
{0x80,0x00,0x00,0x01,0xFC,0x7F,0x04,0x01,0xF4,0x1F,0x04,0x11,0xFC,0x7F,0x04,0x11,0xF4,0x1F,0x04,0x01,0xF4,0x1F,0x14,0x10,0x12,0x10,0x12,0x10,0xF1,0x1F,0x10,0x10},
{0x44,0x10,0x84,0x08,0x04,0x00,0xE4,0x3F,0x24,0x22,0xBF,0x2A,0x24,0x27,0x24,0x22,0xE4,0x3F,0x04,0x00,0xC4,0x1F,0x5C,0x10,0xC7,0x1F,0x42,0x10,0xC0,0x1F,0x40,0x10},
{0x00,0x02,0x04,0x02,0x08,0x02,0x88,0x12,0x81,0x22,0x42,0x42,0x42,0x42,0x28,0x12,0x08,0x12,0x04,0x12,0x07,0x08,0x04,0x08,0x04,0x04,0x04,0x02,0x84,0x01,0x60,0x00},
{0x08,0x00,0xC8,0x7F,0x08,0x02,0x08,0x02,0x98,0x3F,0x2A,0x21,0x0A,0x21,0xCA,0x7F,0x09,0x00,0x08,0x00,0x88,0x3F,0x88,0x20,0x88,0x20,0x88,0x20,0x88,0x3F,0x88,0x20},
{0x80,0x00,0x82,0x00,0xC4,0x0F,0x24,0x08,0x00,0x04,0xE8,0x3F,0x08,0x22,0x08,0x22,0xF4,0x7F,0x04,0x22,0x07,0x22,0xE4,0x3F,0x04,0x22,0x04,0x02,0x84,0x02,0x00,0x01},
};
I2C_HandleTypeDef hi2c1;
UART_HandleTypeDef huart1;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_I2C1_Init(void);
static void MX_USART1_UART_Init(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_I2C1_Init();
MX_USART1_UART_Init();
u8g2_Init(&u8g2, &hi2c1, 0x78);
u8g2_SetFont(&u8g2, u8g2_font_9x15_tr);
u8g2_SetFontPosTop(&u8g2);
u8g2_ClearBuffer(&u8g2);
u8g2_DrawStr(&u8g2, 0,0,"hello u8g2!");
u8g2_DrawPixel(&u8g2, 0, 16);
u8g2_DrawLine(&u8g2, 10, 16, 50, 16);
u8g2_DrawBox(&u8g2, 0,18, 30, 20);
u8g2_DrawFrame(&u8g2, 35, 18, 30, 20);
u8g2_DrawRBox(&u8g2, 65, 18, 30,20, 8);
u8g2_DrawRFrame(&u8g2, 95, 18, 30,20 , 7);
u8g2_SendBuffer(&u8g2);
HAL_Delay(1000);
u8g2_ClearBuffer(&u8g2);
u8g2_DrawCircle(&u8g2, 32,32, 30, U8G2_DRAW_UPPER_RIGHT|U8G2_DRAW_LOWER_LEFT);
u8g2_DrawDisc(&u8g2, 32,32, 25, U8G2_DRAW_UPPER_RIGHT|U8G2_DRAW_LOWER_LEFT);
u8g2_DrawEllipse(&u8g2, 90,30, 30, 20, U8G2_DRAW_ALL);
u8g2_DrawFilledEllipse(&u8g2, 90,30, 25,18, U8G2_DRAW_ALL);
u8g2_SendBuffer(&u8g2);
HAL_Delay(1000);
u8g2_ClearBuffer(&u8g2);
u8g2_DrawTriangle(&u8g2, 15,0, 0,30, 30,30);
u8g2_SetFont(&u8g2, u8g2_font_unifont_t_chinese3);
u8g2_SetFontPosTop(&u8g2);
u8g2_DrawUTF8(&u8g2, 30, 0, "欢迎界面");
u8g2_DrawUTF8X2(&u8g2, 0, 30, "菜单确定取消");
u8g2_SendBuffer(&u8g2);
u8g2_ClearBuffer(&u8g2);
u8g2_DrawXBMP(&u8g2, 5, 10, 48, 48, hellokitty);
for(int i=0;i<3;i++){
u8g2_DrawXBM(&u8g2, 60+16*i, 10, 16,16, hanziku[i] );
}
u8g2_SendBuffer(&u8g2);
while (1)
{
}
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL8;
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_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != 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_USART1_UART_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
}
static void MX_GPIO_Init(void)
{
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
}
void Error_Handler(void)
{
__disable_irq();
while (1)
{
}
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t *file, uint32_t line)
{
}
#endif