STM32+OLED屏显示字符串、汉字、图片(二)

这篇具有很好参考价值的文章主要介绍了STM32+OLED屏显示字符串、汉字、图片(二)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

上一节初始化了OLED屏,使得它完成了清屏,现在驱动它在屏幕上打印字符串、汉字以及图片。

        1.1   STM32+OLED屏初始化(一) 

        1.2  STM32+OLED屏显示字符串、汉字、图片(二)

        1.3  STM32+OLED屏多级菜单显示(三)

        1.4  STM32+OLED屏(软件IIC+位带+帧缓冲区)刷新速率优化(四) 

1.制作字库

字符集:

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

        要想屏幕上显示字符,需要相应的字库,现在先做一个字库。

        打开取模软件pctolcd2002完美版,再点击选项,配置如下所选,点击确定。

oled代码转图片,stm32,单片机,嵌入式硬件

oled代码转图片,stm32,单片机,嵌入式硬件

        点阵格式:阴码字体亮,阳码字体不亮 

        字符走向:逆向低位在前,顺向高位在前(主要看驱动IC的编码格式)、

        取模方式:指字模图形的扫描方向 

        输出数制:生成字模的数的进制 

        每行显示数据:生成数组的大小,字符的长(页)x字符的宽(如8*16字体,2页*8列 = 16;如12*24字体,3页*12列 = 36;如16*32字体,4页*16列 = 64)

        选择字库字体大小,最好选择8的倍数,因为64行已经分为8页(每页8行),如果不是8的倍数,就会显示到其他页去,操作会变得麻烦一些。

oled代码转图片,stm32,单片机,嵌入式硬件

自命名字库名称

        一个8x16的英文字库就完成了,字符在字库中的存取是二维数组Ascii_8*16[95][16];就拿字符 ' A ' 来说,字符 ' A ' 存在Ascii_8*16[33][0] ~ Ascii_8*16[33][16]之间

oled代码转图片,stm32,单片机,嵌入式硬件

oled代码转图片,stm32,单片机,嵌入式硬件

生成其他大小的字库

        生成12*24的字库,首先要调节字体大小,其次要调节每行显示数据:24/8=3页,3*12=36,所以每行显示数据的点阵设置为36,最后,点击生成字模,复制粘贴到OLED_Fonnt.h文件中

oled代码转图片,stm32,单片机,嵌入式硬件

三种大小不同的字库

        字库中存取了三种字体,第一个比较特殊(在网上找的,但不完整),自己尝试着生成,发现自己生成的字体显示不清晰,如果有朋友有完整的,请@我分享我一份,其他两个是自己生成的

oled代码转图片,stm32,单片机,嵌入式硬件

2.显示一个字符 

        显示字符串从一个字符开始,字符串只不过是一串字符,完成显示一个字符后再循环多次,就可以完成字符串显示了,字符显示先定义起始光点,再把字库中的数据写入,即可完成。就拿8*16字体来说,8列*16行(2页),所以要写2页(i < 2),字宽写8列(j < 8),第一页设置起始光点写入数据,第二页再设置起光点偏移一位( + i),因为字宽是8,数据再偏移八位( + i*8),完成显示

/**
  * @brief  OLED显示一个字符
  * @param  Line 行位置
  * @param  Column 列位置
  * @param  Fontsize 字体大小
  * @param  Char 要显示的一个字符,
  * @retval 无
  */
void OLED_ShowChar(uint8_t Line, uint8_t Column, uint16_t Fontsize, char Char)
{      	
	uint8_t i, j;
	
	switch(Fontsize) {
		case 8:	{
			OLED_SetCursor(Line, Column);		
			for (j=0; j<6; j++) {//字宽为6
				OLED_Write_Data(Ascii_6x8[Char-' '][j]);			
			}
			break;
		}
		case 16: {
			for(i=0; i<2; i++) {
				OLED_SetCursor(Line+i, Column);	//循环2次显示上/下半部分内容	
				for (j=0; j<8; j++) {//字宽为8
					OLED_Write_Data(Ascii_8x16[Char-' '][j+i*8]);			
				}
			}
			break;
		}
		case 24: {
			for(i=0; i<3; i++) {
				OLED_SetCursor(Line+i, Column);	//循环3次显示上/中/下半部分内容	
				for (j=0; j<12; j++) {//字宽为12
					OLED_Write_Data(Ascii_12x24[Char-' '][j+i*12]);			
				}
			}
			break;
		}
	}
}

        6*8字体 ' A ', 8*16字体 ' A ', 12*24字体 ' A '

oled代码转图片,stm32,单片机,嵌入式硬件

3.显示字符串

        字符串的显示较为简单,在显示字符的基础上偏移一个字符的字宽,就可以了。如6*8字体的字宽是6,就偏移 + i*6;8*16字体的字宽是8,就偏移 + i*8;12*24字体的字宽是12,就偏移 + i*12

/**
  * @brief  OLED显示字符串
  * @param  Line 行位置
  * @param  Column 列位置
  * @param  Fontsize 字体大小
  * @param  String 显示字符串,
  * @retval 无
  */
#include <string.h>
void OLED_ShowString(uint8_t Line, uint8_t Column, uint16_t Fontsize, const char* String)
{
	uint8_t i, len;
	len = strlen(String);//算出字符串长度
	
	for(i=0; i<len; i++) {
		switch(Fontsize) {
			case 8:OLED_ShowChar(Line, Column+i*6, Fontsize, String[i]);
			break;
			case 16:OLED_ShowChar(Line, Column+i*8, Fontsize, String[i]);
			break;
			case 24:OLED_ShowChar(Line, Column+i*12, Fontsize, String[i]);
			break;
		}
	}
}

         6*8字体 " ABCD ", 8*16字体 " ABCD ", 12*24字体 " ABCD "

oled代码转图片,stm32,单片机,嵌入式硬件

4.显示汉字

        汉字的显示同理,先制作中文字库,但是中文汉字太多了,简单选择几个“ 点个赞吧!”显示即可,首先,制作汉字字库:因为字宽为16*2页 = 32

oled代码转图片,stm32,单片机,嵌入式硬件

        加入OLED_Font.h,自定义二维数组名称:

oled代码转图片,stm32,单片机,嵌入式硬件

        显示一个汉字,显示汉字和显示字符同理,只不过汉字的字宽是16,所以字宽写16列(j < 16),后续的数据偏移也自然是16位( + i*16);完成显示

/**
  * @brief  OLED显示汉字
  * @param  Line 行位置
  * @param  Column 列位置
  * @param  Chinese 显示汉字编号
  * @retval 无
  */
void OLED_ShowChinese(uint8_t Line, uint8_t Column, uint8_t Chinese)
{
	uint8_t i, j;
	
	for(i=0; i<2; i++) {
		OLED_SetCursor(Line+i, Column);	//循环2次显示上/下半部分内容	
		for (j=0; j<16; j++) {//字宽为16
			OLED_Write_Data(Chinese_16x16[Chinese][j+i*16]);			
		}
	}
}

        显示效果:

oled代码转图片,stm32,单片机,嵌入式硬件

5.显示图片

        同理,制作图源库,找一张自己喜欢的图片,选择画图工具打开

oled代码转图片,stm32,单片机,嵌入式硬件

        设置像素大小,进行裁剪

oled代码转图片,stm32,单片机,嵌入式硬件

        另存为BMP单色位图片

oled代码转图片,stm32,单片机,嵌入式硬件

oled代码转图片,stm32,单片机,嵌入式硬件

        打开取模工具,选择图形模式,再打开刚刚制作的图片,生成字模

oled代码转图片,stm32,单片机,嵌入式硬件

oled代码转图片,stm32,单片机,嵌入式硬件

        保存到OLED_Font.h中,删除所有的大括号,保存为一维数组

oled代码转图片,stm32,单片机,嵌入式硬件

        写法一样,依次取数 

/**
  * @brief  OLED显示图片
  * @param  无
  * @retval 无
  */
void OLED_ShowImageBMG(void)
{
	uint8_t i, j;
	
	for(i=0; i<8; i++) {
		OLED_SetCursor(0+i, 0);	//循环8次显示8页内容	
		for (j=0; j<128; j++) {//字宽为8
			OLED_Write_Data(ImageBMG64x128[j+i*128]);			
		}
	}
}

显示效果:

oled代码转图片,stm32,单片机,嵌入式硬件

6.编写RTC显示时钟

        最后,再编写一个实时时钟完成显示,常规时钟配置就不展示了,直接上最终源码

/**
  * @brief  OLED显示RTC
  * @param  无
  * @retval 无
  */
void OLED_ShowRTC(void)
{
	char buff[50];
	
	RTC_Get_StdTime(RTC_GetCounter());
	
	sprintf(buff,"%0.2d-%0.2d-%0.2d",RTC_CLOCK.hour, RTC_CLOCK.min, RTC_CLOCK.sec);
	OLED_ShowString(4, 10,  24, buff);
	
	sprintf(buff,"Date:%0.4d-%0.2d-%0.2d",RTC_CLOCK.year,RTC_CLOCK.mon,RTC_CLOCK.day);
	OLED_ShowString(1, 6,  16, buff);
}

        oled代码转图片,stm32,单片机,嵌入式硬件

7.主函数 

main.c函数

//#include "main.c"

int main(void)
{
	OLED_Init();
	Usart_Init();

	printf("OLED显示字符串、汉字、图片\r\n");

//	//显示字符串
//	OLED_ShowString(0,0,8,"ABCD");
//	OLED_ShowString(1,0,16,"ABCD");
//	OLED_ShowString(3,0,24,"ABCD");
//	
//	//显示汉字
//	OLED_ShowChinese(3,16*2,0);// 点
//	OLED_ShowChinese(3,16*3,1);// 个
//	OLED_ShowChinese(3,16*4,2);// 赞
//	OLED_ShowChinese(3,16*5,3);// 吧
//	OLED_ShowChinese(3,16*6,4);// ! 
	
//	//显示图片
//	OLED_ShowImageBMG();
    
    //显示时钟
    OLED_ShowRTC();
	while (1) {
		
		delay_ms(1000);
	}
}

        总结:历经万险终于完了,虽然最终的效果都实现了,但代码并不健壮。问题在于访问光点缺少越界保护,屏幕的范围在64*128之间,可是起始光点设置的范围却没有限制;除此之外,字符串的一部分超出显示范围没有进行换行换页,这些问题可能在今后造成巨大的错误。

源码分享:

链接:https://pan.baidu.com/s/1ZpaEZhR0IvtqoiW-65ATKw?pwd=p08k 
提取码:p08k文章来源地址https://www.toymoban.com/news/detail-816324.html

到了这里,关于STM32+OLED屏显示字符串、汉字、图片(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32 F103C8T6学习笔记9:0.96寸单色OLED显示屏—自由取模显示—显示汉字与图片

    今日学习0.96寸单色OLED显示屏的自由取模显示: 宋体汉字比较复杂,常用字符可以直接复制存下来,毕竟只有那么几十个字母字符,但汉字实在太多了,基本不会全部放在单片机里存着,一般用到多少个字就取几个字的模,因此汉字放在这里与自由取模一起讲。 文章提供源码

    2024年02月11日
    浏览(19)
  • STM32 OLED显示汉字及屏幕滚动(I2C协议)

    理解OLED屏显和汉字点阵编码原理,使用STM32F103的SPI或IIC接口实现以下功能: 显示自己的学号和姓名; 显示AHT20的温度和湿度; 上下或左右的滑动显示长字符。 STM32F103C8T6最小板 AHT20温湿度传感器 ST-LINK 仿真器 4针脚使用I2C通信协议的OLED屏 面包板 杜邦线 KEIL 5 字模软件 可以看

    2024年02月03日
    浏览(24)
  • STM32+7针脚0.96OLED屏显示数字汉字符号英文(入门级)

    本文即做单纯的简单使用介绍说明,基于stm32t103函数库,采用GPIO口模拟的通信协议方式。 在OLED屏上显示字符以及汉字。 源码获取:链接:https://pan.baidu.com/s/1D6lk-fRq64gJILgeDBd2rQ?pwd=qng5  提取码:qng5 目录 一、OLED屏介绍 二、硬件接线说明 三、软件代码介绍 1、驱动代码 2、OL

    2024年04月14日
    浏览(27)
  • STM32使用1.69寸液晶显示模块使用缓冲区实现快速刷新全屏显示字符串功能

    一个1.69寸SPI接口的液晶显示模块,有320*240=76800个点,每个点有2个字节表示RGB的颜色,所以需要153.6K个字节的数据来刷新全屏,如果SPI口输出数据不是高速并且不紧密排列的话,刷新就会比较慢,有从下到下的肉眼可见的刷新过程,现就是希望使用数据缓冲区(我理解这就是

    2024年01月20日
    浏览(27)
  • STM32C8T6I2C驱动OLED显示汉字版本(江科大基础改编)

    最近突然想显示汉字,然后翻了一圈发现版本好多,所以就挑了一个合适的。然后我的目的主要是驱动OLED0.96寸显示汉字,所以很简单,就是先配置驱动的模型库 在font.h添加这一段库,直接在代码下面添加即可。然后如果想要自己取模就下载PctolLCD2002这个取模软件,搜索百度

    2024年02月10日
    浏览(21)
  • stm32串口发送字符、字符串(标准库)

    目录 一 芯片概述  二 代码编写 2.1 以串口2为例配置初始化代码 2.2 发送自定义长度的字符串 2.3 发送单个字符 2.4 自定义printf函数 三 完整代码 3.1 usart2.c 3.2 usart2.h 3.3 while(1) 本文以stm32f103c8t6系列芯片为例,使用自定义函数发送串口数据。 PA2为TX引脚,PA3为RX引脚 第一个变量

    2024年04月15日
    浏览(24)
  • STM32串口发送字符串

    在STM32串口学习中,串口发送字符串是必不可少的,但是 在学习过程中可能会遇到下面这个问题,就由我来给大家分享一下吧。 下面是封装的串口发送字符串的函数: 在mian.c文件中我们运行代码不会报错,但是我们可以看到Usart_SendString函数打印字符串时会出现警告。 当我们

    2024年02月12日
    浏览(18)
  • stm32实现0.96oled图片显示,菜单功能

    本期内容,我们将学习0.96寸oled的进阶使用,展示图片,实现菜单切换等功能,关于oled的基础内容,这里我不做介绍,大家可以学习 : 夜深人静学32系列17——OLED ,里面讲述了oled的基本知识并实现了一个简单页面的编写。 这个菜单一共有三个等级, 一级菜单:原神启动界

    2024年02月03日
    浏览(53)
  • 0.96寸OLED显示汉字图片及简单GIF

    只是做一些简单显示,具体逻辑大家自行添加。 网上的OLED驱动很多,我懂的也不是很深,这里就不说了,我这里用的是中景园的驱动。这里重点说怎么改可以显示这些东西。 首先我们需要两个重要的东西,一个是字取模软件,另一个是图片的处理取模软件。感谢大佬。 首先

    2024年02月01日
    浏览(27)
  • Oracle-如何判断字符串包含中文字符串(汉字),删除中文内容及保留中文内容

    今天遇见一个问题需要将字段中包含中文字符串的筛选出来 在网上查找了一下有以下三种方式: length计算字符长度,lengthb计算字节长度 筛选出包含中文的字符串 ASCIISTR函数,参数是一个字符串,如果这个字符在ASCII码表中有,则转成ASCII表中的字符。如果没有,则转成xxx

    2024年02月12日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包