STM32F1单片机-OLED显示屏

一、OLED显示屏介绍

  • OLED:有机发光二极管,主要有0.96寸(SSD1306/1315)和1.3寸(SH116)显示屏
  • 0.96寸OLED模块如下图所示,分别为4针(4行16列)和6针(4行16列)
  • 供电3-5.5V,通信协议I2C(4针)/SPI(6针),分辨率:128*64

  下图分别为4针和6针OLED接线图

在这里插入图片描述

二、OLED显示汉字

  • OLED显示汉字,需要事先定义好汉字字符数据,在函数中汉字都是UTF-8编码格式的,需要在控制栏里填入如下数据,开启对UTF-8汉字写入代码操作的支持

在这里插入图片描述

  • 定义汉字数组图片数组,使用如下软件

在这里插入图片描述

  设置如下

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  将字模数据格式复制到OLED.Data.c,就可以显示出想要的汉字

三、OLED显示图像

  • OLED显示图像,事先定义好图像数组,取模方式同样采用上述软件,步骤如下,每次打开软件时,都需要事先设置好配置

在这里插入图片描述

在这里插入图片描述

  最后将图像数据按格式复制到OLED.Data.c,就可以显示出所画的图像

四、编程

4.1 显示字符

  下面是OLED.h

void OLED_Init(void);
void OLED_Clear(void);
void OLED_ShowChar(uint8_t Line, uint8_t Column, char Char);
void OLED_ShowString(uint8_t Line, uint8_t Column, char *String);
void OLED_ShowNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);
void OLED_ShowSignedNum(uint8_t Line, uint8_t Column, int32_t Number, uint8_t Length);
void OLED_ShowHexNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);
void OLED_ShowBinNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);

4.2 显示汉字和图像

  得到字模数据以后,在OLED.Data.c定义好

const ChineseCell_t OLED_CF16x16[] = {
	
	",",
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x58,0x38,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,0x18,0x24,0x24,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	
	"你",
	0x00,0x80,0x60,0xF8,0x07,0x40,0x20,0x18,0x0F,0x08,0xC8,0x08,0x08,0x28,0x18,0x00,
	0x01,0x00,0x00,0xFF,0x00,0x10,0x0C,0x03,0x40,0x80,0x7F,0x00,0x01,0x06,0x18,0x00,
	
	"好",
	0x10,0x10,0xF0,0x1F,0x10,0xF0,0x00,0x80,0x82,0x82,0xE2,0x92,0x8A,0x86,0x80,0x00,
	0x40,0x22,0x15,0x08,0x16,0x61,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,
	
	"世",
	0x20,0x20,0x20,0xFE,0x20,0x20,0xFF,0x20,0x20,0x20,0xFF,0x20,0x20,0x20,0x20,0x00,
	0x00,0x00,0x00,0x7F,0x40,0x40,0x47,0x44,0x44,0x44,0x47,0x40,0x40,0x40,0x00,0x00,
	
	"界",
	0x00,0x00,0x00,0xFE,0x92,0x92,0x92,0xFE,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,0x00,
	0x08,0x08,0x04,0x84,0x62,0x1E,0x01,0x00,0x01,0xFE,0x02,0x04,0x04,0x08,0x08,0x00,
	
	"苏",
	0x00,0x00,0x10,0x10,0x10,0x1C,0x30,0xD0,0x90,0x98,0x8C,0x08,0x08,0x00,0x00,0x00,
	0x00,0x00,0x0C,0x26,0x11,0x0D,0x03,0x20,0x60,0x38,0x07,0x04,0x04,0x0C,0x00,0x00,
	
	"州",
	0x00,0x00,0x80,0x00,0xF8,0x00,0xC0,0x00,0xF8,0x00,0xC0,0x02,0xFC,0x00,0x00,0x00,
	0x00,0x00,0x21,0x18,0x07,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,
	
	"科",
	0x00,0x80,0x80,0x90,0xD0,0xF8,0x44,0x40,0x40,0xD0,0x00,0xFC,0x00,0x00,0x00,0x00,
	0x00,0x08,0x04,0x02,0x01,0x3F,0x01,0x02,0x02,0x02,0x02,0xFF,0x01,0x01,0x01,0x00,
	
	"技",
	0x00,0x00,0x40,0x40,0xD2,0x2C,0xA0,0x00,0x20,0xE0,0x3C,0x90,0x10,0x00,0x00,0x00,
	0x00,0x04,0x04,0x02,0x3E,0x01,0x20,0x23,0x25,0x15,0x0D,0x13,0x20,0x20,0x20,0x00,
	
	"大",
	0x00,0x00,0x00,0x80,0x80,0x80,0x80,0xFC,0x80,0x40,0x40,0x40,0x40,0x00,0x00,0x00,
	0x00,0x00,0x00,0x40,0x20,0x10,0x0C,0x03,0x06,0x08,0x30,0x20,0x20,0x40,0x00,0x00,
	
	"学",
	0x00,0x00,0xC0,0x40,0x20,0xAC,0xA0,0xA4,0xE0,0x98,0x26,0x22,0x70,0x20,0x20,0x00,
	0x00,0x00,0x04,0x04,0x04,0x04,0x44,0x45,0x3E,0x02,0x02,0x02,0x02,0x02,0x00,0x00,
	
	/*按照上面的格式,在这个位置加入新的汉字数据*/
	//...
	
	
	/*未找到指定汉字时显示的默认图形(一个方框,内部一个问号),请确保其位于数组最末尾*/
	"",		
	0xFF,0x01,0x01,0x01,0x31,0x09,0x09,0x09,0x09,0x89,0x71,0x01,0x01,0x01,0x01,0xFF,
	0xFF,0x80,0x80,0x80,0x80,0x80,0x80,0x96,0x81,0x80,0x80,0x80,0x80,0x80,0x80,0xFF,

};
/*测试图像(一个方框,内部一个二极管符号),宽16像素,高16像素*/
const uint8_t Diode[] = {
	0xFF,0x01,0x81,0x81,0x81,0xFD,0x89,0x91,0xA1,0xC1,0xFD,0x81,0x81,0x81,0x01,0xFF,
	0xFF,0x80,0x80,0x80,0x80,0x9F,0x88,0x84,0x82,0x81,0x9F,0x80,0x80,0x80,0x80,0xFF,
};

const uint8_t Xin[] = {
	0xE0,0x30,0x18,0x18,0x10,0x10,0x30,0x20,0x60,0xC0,0x80,0xC0,0x60,0x20,0x30,0x10,
	0x18,0x18,0x30,0xE0,0x03,0x0C,0x38,0x60,0x40,0xC0,0x80,0x00,0x00,0x00,0x01,0x00,
	0x00,0x80,0xC0,0x40,0x60,0x38,0x0C,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,
	0x02,0x06,0x04,0x06,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
};		//新加的星星图标

  主函数中调用显示函数

#include "stm32f10x.h"                  // Device header
#include "OLED.h"

//编码格式UTF-8

int main(void)
{
	OLED_Init();//OLED初始化
	
	OLED_ShowChar(0,0,'A',OLED_8X16);		//OLED_8X16点阵 字体大小
	OLED_ShowChar(0,20,'B',OLED_8X16);
	OLED_ShowString(20,0,"Hello world",OLED_8X16);
	OLED_ShowNum(0,40,520,3,OLED_8X16);
	OLED_ShowChinese(20,20,"你好,世界。");
	OLED_ShowImage(55,20,20,20,Xin);
	OLED_Printf(0,0,OLED_8X16,"NUM1:%d,NUM2:%d",123,-456);
	OLED_DrawPoint(0,0);
	OLED_Clear();
	OLED_ShowChinese(15,0,"苏州科技大学");
	
	OLED_Update();//OLED显示必须添加更新函数
	while(1)
	{
		
	}
}

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OLED是一种高清晰度、高对比度和低功耗的显示技术,常用于小型设备的显示屏幕。STM32F103C8T6是一种32位ARM Cortex-M3微控制器,具有丰富的外设和强大的处理能力。下面是使用STM32F103C8T6驱动OLED的步骤。 步骤1:连接硬件 将OLEDSTM32F103C8T6的SPI接口连接起来,以便进行通信。具体的连接方式可以参考OLEDSTM32F103C8T6的数据手册。 步骤2:编写代码 在STM32CubeIDE中创建一个新项目,并在"Project Manager"中将SPI和GPIO外设添加到项目中。在main.c文件中编写以下代码: #include "stm32f1xx_hal.h" #include "ssd1306.h" SPI_HandleTypeDef hspi1; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_SPI1_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_SPI1_Init(); SSD1306_Init(); while (1) { SSD1306_Clear(); SSD1306_GotoXY(10,10); SSD1306_Puts("Hello World!", &Font_7x10, 1); SSD1306_UpdateScreen(); HAL_Delay(1000); } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16; 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_SPI1_Init(void) { hspi1.Instance = SPI1; hspi1.Init.Mode = SPI_MODE_MASTER; hspi1.Init.Direction = SPI_DIRECTION_2LINES; hspi1.Init.DataSize = SPI_DATASIZE_8BIT; hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; hspi1.Init.NSS = SPI_NSS_SOFT; hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi1.Init.TIMode = SPI_TIMODE_DISABLE; hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; hspi1.Init.CRCPolynomial = 10; if (HAL_SPI_Init(&hspi1) != HAL_OK) { Error_Handler(); } } static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOB_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_5|GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_4; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); } 步骤3:初始化SSD1306库 将SSD1306库添加到项目中,并在main.c文件中调用SSD1306_Init()函数,以便初始化SSD1306库。 步骤4:显示文本 在while循环中,调用SSD1306_Clear()函数清空显示屏幕,然后使用SSD1306_GotoXY()函数将光标移动到(10,10)位置,最后使用SSD1306_Puts()函数将"Hello World!"字符串显示在屏幕上。 步骤5:更新屏幕 使用SSD1306_UpdateScreen()函数更新屏幕,以便显示刚才绘制的文本。 步骤6:延时 使用HAL_Delay()函数延时1秒钟,以便让文本显示在屏幕上。 步骤7:编译和烧录 编译代码并烧录到STM32F103C8T6微控制器中,然后将OLED屏幕连接到SPI接口上,即可看到"Hello World!"字符串在OLED屏幕上显示出来。 以上就是使用STM32F103C8T6驱动OLED的步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值