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

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

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

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

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

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

目录

取模软件的使用:

汉字显示函数的编写:

字库取模与函数:

 显示程序测试:

 显示程序代码:

显示效果图:

 整体测试工程下载:

图像显示函数的编写:

图像的取模:

 图像打印函数的编写:

 程序设计:

 显示效果:

 测试工程下载:


取模软件的使用:

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

汉字显示函数的编写:

字库取模与函数:

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指向我”

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

 显示程序代码:

#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();             //清空屏幕数据
}

显示效果图:

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

 整体测试工程下载:

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

图像显示函数的编写:

图像的取模:

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

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

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

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

 然后调整为二阶色:

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

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

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

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

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

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

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

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

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

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

 图像打印函数的编写:

这个图像是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

 程序设计:

目标: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

你可能感兴趣的:(STM32,F103,C8T6笔记,硬件模块与传感器的驱动,stm32,学习,笔记)