STM32F407单片机编程入门(五)OLED显示屏实战含源码
介绍0.96寸7针OLED显示原理,还有取模软件的介绍,中文字库制作等,提供STM32F407VET6单片机显示中文英文字符串,提供代码。
文章目录
一.概要
OLED被称为有机激光二极管显示,OLED采用有机材料涂层和玻璃基板,当有电流通过时有机材料就会发光,所以OLED具有自发光特性,不需要背光源的特点。
显示的原理是将图像或文字分解为一组组小点,并通过控制每个点的亮度或颜色来显示信息。这些小点通常是很小的正方形,并且由有机发光二极管组成。
常用的点阵大小有12x12、14x14、16x16、8x16等,每个点用0或1表示,0代表没有点,1代表有点。这样,每个汉字就可以通过一个二进制数组来表示。
例如汉字16x16点阵如下图显示
其中"光"字C语言数组如下:
{0x40,0x40,0x42,0x44,0x58,0xC0,0x40,0x7F,0x40,0xC0,0x50,0x48,0x46,0x40,0x40,0x00},//光字上半部分点阵数组
{0x80,0x80,0x40,0x20,0x18,0x07,0x00,0x00,0x00,0x3F,0x40,0x40,0x40,0x40,0x78,0x00
},//光字下半部分点阵数组
16*16点阵,所以一个汉字横向是16个点,纵向也是16个点。取模顺序是从低到高,即左上角第一个点作为最低位。
上半部分最左边的1列8个点,就是第一个数,0代表没有点,1代表有点,所以二进制是01000000十六进制就是0x40,第2个是左边第2列,也是0x40,第3个是左边第3列0x42,依次类推,才有上面的数组表格。
二.0.96寸OLED屏介绍
1.OLED屏外观图
正面
背面
2.OLED屏特点
0.96寸OLED显示屏是一种小尺寸的有机发光二极管(OLED)显示屏,具有许多优点和特点。
尺寸:0.96寸指的是显示屏的对角线尺寸,通常为0.96英寸(约24.4毫米),适合小型设备和紧凑空间。
分辨率:通常具有128x64像素的分辨率,可以显示清晰的图像和文本。
技术:采用OLED技术,每个像素都是自发光的,不需要背光,因此具有更高的对比度和更广的视角。
高亮度:OLED显示屏具有较高的亮度,即使在室外或明亮的环境下也能清晰可见。
视角广:OLED显示屏具有广阔的视角,即使从不同的角度观看,图像仍然清晰可见。
薄型轻便:OLED显示屏采用薄型设计,重量轻,适合应用于便携式设备和可穿戴设备。
灵活性:某些OLED显示屏采用柔性基板制造,具有弯曲和弯折的能力,适用于柔性显示应用。
高对比度:OLED显示屏具有高对比度,黑色显示非常深黑,白色显示非常亮白,使图像更加清晰。
3.OLED屏接口定义
4.OLED屏原理图
5.OLED屏像素分辨率
0.96寸OLED是128x64像素的分辨率,我们可以理解为:水平方向分布了128个像素点,垂直方向分布了64个像素点。而驱动芯片在点亮像素点的时候,是以8个像素点为单位的。我们在画点的时候坐标Y的取值为0-7,坐标X的取值为0-127。
三.字库取模软件PCtoLCD2002介绍
PCtoLCD2002 是专业的取字模软件,采用C语言和汇编语言两种格式,支持逐行、逐列、行列、列行四种取模方式,可以选择字体、大小、文字的长宽,自动生成你想要的字符,能生成字符字模,中文字模,也能生成图片字模。
1.生成中文字模
1.双击PCtoLCD2002.exe打开软件
2.配置生成字模格式
3.保存参数配置
4.输入要显示的中文,生成显示数组如图
5.内容拷贝到程序驱动字库数组
6.程序中调用就能显示中文
2.生成图片字模
1.双击PCtoLCD2002.exe打开软件
2.配置生成图片字模格式
3.按确定保存
4.打开需要转换的128*64的图片
5.点击生成字模
5.内容拷贝到程序图片字库数组
6.程序中调用就能显示图片
四.STM32F407驱动OLED显示实验
硬件准备:
STLINK接STM32F407VET6开发板,STLINK接电脑USB口。
插上0.96寸OLED,实现OLED显示实验。
板子GND-----液晶GND
板子3.3--------液晶VDD
板子PA8-------液晶SCK
板子PC9-------液晶SDA
板子PC8-------液晶RES
板子PD14-----液晶DC
板子PD10-----液晶CS
打开STM32CubeMX软件,新建工程
Part Number处输入STM32F407VE,再双击就创建新的工程
配置下载口引脚
配置外部晶振引脚
配置系统主频168Mhz,使用外部晶振
配置工程文件名,保存路径,KEIL5工程输出方式
生成工程
用Keil5打开工程
添加代码
添加OLED驱动文件
OLED管脚对应
中文字库里放取模软件生成的数组
主要代码
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
OLED_Init();//OLED初始化
OLED_Clear();//清屏
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
OLED_Clear();//清屏
OLED_ShowCHinese(18,0,0);//光
OLED_ShowCHinese(36,0,1);//子
OLED_ShowCHinese(54,0,2);//物
OLED_ShowCHinese(72,0,3);//联
OLED_ShowCHinese(90,0,4);//网
OLED_ShowString(6,3,"0.96' OLED TEST");//显示字符串
OLED_ShowString(0,6,"ASCII:");
OLED_ShowString(63,6,"CODE:");
HAL_Delay(5000);//等待5000ms
}
/* USER CODE END 3 */
}
//初始化SSD1306
void OLED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_8;//配置管脚为输出
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);
GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9;//配置管脚为输出
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_14;//配置管脚为输出
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8|GPIO_PIN_9, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_10|GPIO_PIN_14, GPIO_PIN_SET);
HAL_Delay(100);
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(0xF0,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_WR_Byte(0x8D,OLED_CMD);//--set Charge Pump enable/disable
OLED_WR_Byte(0x14,OLED_CMD);//--set(0x10) disable
OLED_WR_Byte(0xA4,OLED_CMD);// Disable Entire Display On (0xa4/0xa5)
OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7)
OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel
OLED_WR_Byte(0xAF,OLED_CMD); /*display ON*/
OLED_Clear();
OLED_Set_Pos(0,0);
}
五.工程源代码下载
通过网盘分享的文件:5.OLED显示实验.zip
链接: https://pan.baidu.com/s/1xboG1UoykLFsL3pFNt_a5A 提取码: kvwe
如果链接失效,可以联系博主给最新链接
程序下载下来之后解压就行
六.小结
该OLED显示屏广泛应用于手持设备、智能手表、健康监测、智能家居等众多领域中,成为现代产品中不可或缺的核心部件之一,所以学会STM32F407驱动OLED显示,能适应很多产品的开发。
更多推荐
所有评论(0)