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

news/2024/6/3 18:01:10 标签: stm32, 学习, 笔记

今日学习0.96寸单色OLED显示屏的自由取模显示:

宋体汉字比较复杂,常用字符可以直接复制存下来,毕竟只有那么几十个字母字符,但汉字实在太多了,基本不会全部放在单片机里存着,一般用到多少个字就取几个字的模,因此汉字放在这里与自由取模一起讲。

文章提供源码、原理解释、测试工程下载,测试效果图展示。

阅读此文需要确定自己已经理解了OLED基本显示原理,并且会用OLED显示一个字符,不懂基础的可以看我之前的文章:

STM32 F103C8T6学习笔记8:0.96寸单色OLED显示屏显示字符_NULL指向我的博客-CSDN博客

目录

取模软件的使用:

汉字显示函数的编写:

字库取模与函数:

 显示程序测试:

 显示程序代码:

显示效果图:

 整体测试工程下载:

图像显示函数的编写:

图像的取模:

 图像打印函数的编写:

 程序设计:

 显示效果:

 测试工程下载:


取模软件的使用:

 OLED显示屏 以及 其他许多显示屏 的灵活使用,离不开取模软件,我们也需要学习一下这个取模软件的使用,十分简单,没有软件的可以下载我的测试工程,测试工程里面带有取模软件~~

 

打开取模软件,首先与我一样进行设置:

 现在要对汉字取模,首先新建图像,一般汉字选择16*16点阵区域:

 这样模板上就有一块16*16的取模区域了:

 但它太小了,不利于绘制,因此可以放大看(多按几下放大格点):

然后点文字输入区,鼠标在输入区空白处右键,选择字体:

一般16*16像素大小的字体要选择12:

 此处输入了“我”,然后Ctrl+Enter直接生成:

 同时,使用鼠标点击任意黑白色块可以自定义调整这个图像的细节,当然,字模方面系统直接生成的已经比较好了,无需调整,这个调整也是我提一嘴的~~:

 最后选择取模方式,C51,这个16*16的字模就在底部生成了,可以直接复制了用了~~:

 最后提一嘴,一般用二维数组操作、保存、使用字模~~

汉字显示函数的编写:

字库取模与函数:

char Hzk[][32]={
{0x10,0x10,0x10,0xFF,0x10,0x90,0x00,0x3F,0x48,0x48,0x44,0x44,0x44,0x42,0x70,0x00},
{0x04,0x44,0x82,0x7F,0x01,0x00,0x00,0xFF,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x00},/*"指",0*/

{0x00,0xF8,0x08,0x08,0x0C,0xCA,0x49,0x48,0x48,0xC8,0x08,0x08,0x08,0xF8,0x00,0x00},
{0x00,0xFF,0x00,0x00,0x00,0x1F,0x08,0x08,0x08,0x1F,0x00,0x40,0x80,0x7F,0x00,0x00},/*"向",1*/

{0x20,0x24,0x24,0x24,0xFE,0x23,0x22,0x20,0x20,0xFF,0x20,0x22,0x2C,0xA0,0x20,0x00},
{0x00,0x08,0x48,0x84,0x7F,0x02,0x41,0x40,0x20,0x13,0x0C,0x14,0x22,0x41,0xF8,0x00},/*"我",2*/

};

//显示汉字
void OLED_ShowCHinese(u8 x,u8 y,u8 no)
{      			    
	u8 t,adder=0;
	OLED_Set_Pos(x,y);	
    for(t=0;t<16;t++)
		{
				OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);
				adder+=1;
     }	
		OLED_Set_Pos(x,y+1);	
    for(t=0;t<16;t++)
			{	
				OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);
				adder+=1;
      }					
}

这要结合字库数组来看,一个16*16像素的字共有32个字符编码,一行16个,在二维数组分俩行存一个字,因此要连传2行二维数组才能将一个汉字的字模传给oled.

 显示程序测试:

 这里我已经取好了需要显示的字模,然后准备在OLED上显示 “NULL指向我”

 显示程序代码:

#include "main.h"

int main(void)
{	
	init_ALL();     //初始化所有函数
  while(1)
	{
		OLED_ShowChar(0,0,'N',16);
		OLED_ShowChar(12,0,'U',16);		
		OLED_ShowChar(24,0,'L',16);		
		OLED_ShowChar(36,0,'L',16);		
		
   OLED_ShowCHinese(48,0,0);
   OLED_ShowCHinese(64,0,1);		
   OLED_ShowCHinese(80,0,2);
	}
}


//初始化所有函数:
void init_ALL(void)
{
	SysTick_Init(72);         //初始化滴答计时器
//	Timer2_Init();						//初始化定时器2
	i2c_GPIO_Config();	      //IIC初始化	
	OLED_Init();              //初始化OLED屏幕
	OLED_Clear();             //清空屏幕数据
}

显示效果图:

 整体测试工程下载:

https://download.csdn.net/download/qq_64257614/88232357?spm=1001.2014.3001.5503

图像显示函数的编写:

图像的取模:

现在大部分图像的清晰度像素很高,因此需要一些软件处理一下,降低像素才能取模,这里我使用Photoshop将其像素降为 68*64(至少要比OLED的128*64像素小):

 清晰度下降了,但能凑合着看:

 然后调整为二阶色:

 保存时后缀一定要选.bmp    否则直接改后缀保存位式不会变,取模软件使用时 会直接报错!:

 取模软件打开刚才修改好的图:

发现不太理想,尝试人工补足一波 再 生成字模::

 像这样存在一纬数组就行:

 图像打印函数的编写:

这个图像是68*64的,因此在显示时,Y坐标只能是0开始~

这是一个一个点位传过去显示:

/***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7*****************/
//x0 传入图像显示起始点x坐标
//y0 传入图像显示起始点y坐标
//x1 传入图像x横向像素个数 + x0
//y1 传入图像y纵向像素个数  占用的页数 
//BMP[] 传入图像数组        
void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[])
{ 	
 unsigned int j=0;
 unsigned char x,y;
  
  if(y1%8==0) y=y1/8;      
  else y=y1/8+1;
	for(y=y0;y<y1;y++)
	{
		OLED_Set_Pos(x0,y);
    for(x=x0;x<x1;x++)
	    {      
	    	OLED_WR_Byte(BMP[j++],OLED_DATA);	
	    }
	}
}

 程序设计:

目标:OLED上显示该图片,且从左往右逐渐平移,起始点从(0,0)平移到(60,0)

#include "main.h"

uint16_t i;

int main(void)
{	
	init_ALL();     //初始化所有函数
  while(1)
	{
		
		for(i=0;i<60;i++)
		{
			delay_ms(50);
			OLED_DrawBMP(i,0,68+i,8,BMP);
			
			if(i==59)
			{
			  OLED_Clear();             //清空屏幕数据
			}
		}
	}
}


//初始化所有函数:
void init_ALL(void)
{
	SysTick_Init(72);         //初始化滴答计时器
//	Timer2_Init();						//初始化定时器2
	i2c_GPIO_Config();	      //IIC初始化	
	OLED_Init();              //初始化OLED屏幕
	OLED_Clear();             //清空屏幕数据
}


 显示效果:

 程序设计的注意点就是要在合适的时机清屏,适当的延时,正确的X,Y坐标等等~~~

 测试工程下载:

https://download.csdn.net/download/qq_64257614/88232357?spm=1001.2014.3001.5503


http://www.niftyadmin.cn/n/4951956.html

相关文章

【校招VIP】前端校招考点之vue底层特性

考点介绍&#xff1a; 大家在面试途中遇到的相对多的问题&#xff0c;也是难点的问题&#xff0c;一般都有vue底层原理。对于只会用但是不懂的小白来说真是太痛苦了&#xff0c;仅仅能说出来 一些 数据劫持&#xff0c;双向数据绑定&#xff0c;虚拟dom树的名词来说远远不够。 …

机器学习——随机森林【手动代码】

随机森林这个内容&#xff0c;是目前来说。。。最最最简单&#xff0c;最好理解&#xff0c;应该也是最好实现的了&#xff01;&#xff01;&#xff01; 先挖坑&#xff0c;慢慢填 随机森林&#xff0c;这个名字取得&#xff0c;果然深得该算法的核心精髓&#xff0c;既随机&a…

centos7.9和redhat6.9 离线升级OpenSSH和openssl (2023年的版本)

升级注意事项&#xff01; 1、多开几个连接窗口&#xff08;xshell&#xff09;&#xff0c;避免升级openssh失败无法再次连接终端&#xff0c;否则要跑机房了。 2、可开启telnet服务、vnc服务、打快照。多几个“保命”的路数。一、centos7.9的信息 [rootnode2 ~]# openssl v…

深入浅出Pytorch函数——torch.nn.init.sparse_

分类目录&#xff1a;《深入浅出Pytorch函数》总目录 相关文章&#xff1a; 深入浅出Pytorch函数——torch.nn.init.calculate_gain 深入浅出Pytorch函数——torch.nn.init.uniform_ 深入浅出Pytorch函数——torch.nn.init.normal_ 深入浅出Pytorch函数——torch.nn.init.c…

LeetCode 160.相交链表

文章目录 &#x1f4a1;题目分析&#x1f4a1;解题思路&#x1f6a9;步骤一&#xff1a;找尾节点&#x1f6a9;步骤二&#xff1a;判断尾节点是否相等&#x1f6a9;步骤三&#xff1a;找交点&#x1f344;思路1&#x1f344;思路2 &#x1f514;接口源码 题目链接&#x1f449;…

【Redis】Redis中的布隆过滤器

【Redis】Redis中的布隆过滤器 前言 在实际开发中&#xff0c;会遇到很多要判断一个元素是否在某个集合中的业务场景&#xff0c;类似于垃圾邮件的识别&#xff0c;恶意IP地址的访问&#xff0c;缓存穿透等情况。类似于缓存穿透这种情况&#xff0c;有许多的解决方法&#xf…

LVS-DR模式以及其中ARP问题

目录 LVS_DR LVS_DR数据包流向分析 LVS-DR中ARP问题 问题一 问题二 解决ARP的两个问题的设置方法 LVS-DR特点 LVS-DR优缺点 优点 缺点 LVS-DR集群构建 1.配置负载调度器 2.部署共享存储 3.配置节点服务器 4.测试 LVS 群集 LVS_DR LVS_DR数据包流向分析 客户端…

高效使用ChatGPT之ChatGPT客户端

ChatGPT客户端&#xff0c;支持Mac, Windows, and Linux 下载地址见文章结尾 软件截图 Windows: Mac&#xff1a; 说明 chatgpt桌面版&#xff0c;相比于网页版的chatgpt&#xff0c;最大的特色是支持历史聊天对话记录导出&#xff0c;且支持三种格式&#xff1a;PNG、PDF、…