汉字点阵与OLED屏显

中文汉字与OLED屏幕显示

汉字点阵是一种描述汉字形状的方法,它将一个汉字分解为一个个的点阵,每个点可以表示字的笔画或部分笔画。通过将这些点阵在屏幕上显示可以还原出完整的汉字形状。使用汉字点阵可以实现字库的压缩和存储,也可以实现高效的字形转换。

OLED(Organic Light-Emitting Diode)屏幕则是一种显示技术。它由一系列有机物质构成的发光二极管组成,通过对这些二极管进行电流控制,可以实现点亮或熄灭来显示图像。OLED屏幕具有优秀的对比度、高色彩饱和度、快速响应和广视角等特点,被广泛应用于电子设备的显示屏上。

在应用中,汉字点阵和OLED屏幕可以结合使用,通过将汉字点阵数据转化为OLED点亮或熄灭的指令,可以在OLED屏幕上显示出汉字,从而实现汉字的显示。

spi接口。

SPI(Serial Peripheral Interface)是一种串行的外设接口,由微软的 Motorola 公司在1980年代初期开发。SPI 接口被广泛应用于数字设备之间的通信中,如 MCU(Micro Controller Unit,单片机)、传感器、存储器、无线模块、显示器等。

SPI 接口最常用的信号线包括四根:SCK(Serial ClocK,时钟)、MOSI(Master Out, Slave In,主设备输出,从设备输入)、MISO(Master In, Slave Out,主设备输入,从设备输出)和 SS(Slave Select,从设备选择)。主设备通过 SCK 时钟线为从设备提供时钟信号,通过 MOSI 发送数据给从设备,通过 MISO 接收从设备返回的数据。通过 SS 从设备选择线,主设备可以将多个从设备连接到同一总线上,并单独向其中一个从设备传输数据。

在这里插入图片描述
这里我们使用的是7针spi接口的oled屏幕
在这里插入图片描述

我们这边要实现将想要打入的汉字转化为点阵数据(十六进制),然后存入对应的oled函数,实现oled对于汉字的显示。

所以我们需要一个能够取模的软件实现汉字取模

这里使用 的PCtoLCD2002 网上自行下载
请添加图片描述
开始之前调试设置如下:
请添加图片描述
然后存入对应的oled库

请添加图片描述
想要投射出什么汉字,就存入什么数据就行了。
第一个是显示自己的姓名以及学号
首先我们需要下载oled提供的公共函数库
这里有链接:https://pan.baidu.com/s/1JKlv5KgJ1fvbh1GHeOX6dg?pwd=1606
提取码:1606
打开一个有stm32固件库的keil5环境,然后存入这些库函数。
方便我们后面进行操作。
首先在oledfont.h 中,我们存入我们提取到的需要写入的汉字字模。
如上图,这里就不重复给出了,注意存取的位置,是不是16x16的。旁边注释有标识。
首先是main.c主函数结构如下:

#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "gui.h"
#include "test.h"
int main(void)
{	
	delay_init();	    	       //延时函数初始化	  
	NVIC_Configuration(); 	   //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 	
	OLED_Init();			         //初始化OLED  
	OLED_Clear(0);             //清屏(全黑)
	while(1) 
	{	
		TEST_MainPage();         //主界面显示测试
		//明显我们使用的是这个函数,所以我们就需要修改这里面的显示函数
		//让他显示我们需要的汉字机器数字。
	}
}

相册我们进入到TEST_MainPage(); 函数中
它在test.c中
如下:

void TEST_MainPage(void)
{	
    //GUI_ShowString(28,0,"Oled_Test",16,1);
	GUI_ShowCHinese(28,20,16,"张三",1);//姓名
	//GUI_ShowString(40,32,"64X128",16,1);
	GUI_ShowString(4,48,"632103332201",16,1);学号
	//GUI_ShowString(4,48,"www.lcdwiki.com",16,1);
	delay_ms(1500);		
	delay_ms(1500);
}

接下来是硬件方面要进行接口

在这里插入图片描述
其实在一些oled的库函数里面就有关于连线的提示。

然后是使用flymcu烧录.hex文件进入stm32.
然后运行效果如下:
请添加图片描述

第二个是实现在oled上显示dht20上得到温湿度。

首先按照上面进行的
我们的思路是使用dht20的库函数初始化并且开始测量温湿度,然后我们通过串口得到dht20的温湿度,将这个数据发送给oled屏幕再使用oled的库函数显示出来。
下面是main.c函数

#include "delay.h"
#include "usart.h"
#include "bsp_i2c.h"
#include "sys.h"

#include "oled.h"
#include "gui.h"
#include "test.h"

int main(void)
{	
	delay_init();	    	       //延时函数初始化    	  
	uart_init(115200);	 
	IIC_Init();
		  
	NVIC_Configuration(); 	   //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 	
	OLED_Init();			         //初始化OLED  
	OLED_Clear(0); 
	while(1)
	{
		//printf("温度湿度显示");
		read_AHT20_once();这里是使用上次测试dht20的库函数,但是需要修改
		OLED_Clear(0); 
		delay_ms(1500);
  }
}

好下面是进入bsp_i2c.c 的库函数里面是dht20的信号传输。
可以看到read_AHT20_once();

void  read_AHT20_once(void)
{
	delay_ms(10);

	reset_AHT20();
	delay_ms(10);

	init_AHT20();
	delay_ms(10);

	startMeasure_AHT20();
	delay_ms(80);

	read_AHT20();//这个是最关键的,因为这是温湿度数据的流转设置
	delay_ms(5);
}

下面进入read_AHT20()函数.

void read_AHT20(void)
{
	uint8_t   i;
	for(i=0; i<6; i++)
	{
		readByte[i]=0;
	}

	//-------------
	I2C_Start();

	I2C_WriteByte(0x71);
	ack_status = Receive_ACK();
	readByte[0]= I2C_ReadByte();
	Send_ACK();

	readByte[1]= I2C_ReadByte();
	Send_ACK();

	readByte[2]= I2C_ReadByte();
	Send_ACK();

	readByte[3]= I2C_ReadByte();
	Send_ACK();

	readByte[4]= I2C_ReadByte();
	Send_ACK();

	readByte[5]= I2C_ReadByte();
	SendNot_Ack();
	//Send_ACK();

	I2C_Stop();

	//--------------
	if( (readByte[0] & 0x68) == 0x08 )
	{
		H1 = readByte[1];
		H1 = (H1<<8) | readByte[2];
		H1 = (H1<<8) | readByte[3];
		H1 = H1>>4;

		H1 = (H1*1000)/1024/1024;

		T1 = readByte[3];
		T1 = T1 & 0x0000000F;
		T1 = (T1<<8) | readByte[4];
		T1 = (T1<<8) | readByte[5];

		T1 = (T1*2000)/1024/1024 - 500;

		AHT20_OutData[0] = (H1>>8) & 0x000000FF;
		AHT20_OutData[1] = H1 & 0x000000FF;

		AHT20_OutData[2] = (T1>>8) & 0x000000FF;
		AHT20_OutData[3] = T1 & 0x000000FF;
	}
	else
	{
		AHT20_OutData[0] = 0xFF;
		AHT20_OutData[1] = 0xFF;

		AHT20_OutData[2] = 0xFF;
		AHT20_OutData[3] = 0xFF;
		printf("lyy");

	}
	//printf("\r\n");
	
	//printf("温度:%d%d.%d",T1/100,(T1/10)%10,T1%10);
	//printf("湿度:%d%d.%d",H1/100,(H1/10)%10,H1%10);
	//printf("\r\n");
	t=T1/10;
	t1=T1%10;
	a=(float)(t+t1*0.1);
	h=H1/10;
	h1=H1%10;
	b=(float)(h+h1*0.1);
	sprintf(strTemp,"%.1f",a);   //调用Sprintf函数把DHT11的温度数据格式化到字符串数组变量strTemp中  
    sprintf(strHumi,"%.1f",b);   //调用Sprintf函数把DHT11的湿度数据格式化到字符串数组变量strHumi中  
	//printf(strTemp);
	//printf("/r/n");
	GUI_ShowCHinese(16,00,16,"温湿度显示",1);//GUI库函数是直接显示在oled上面所以我们需要把温湿度数据传到这里来,使用两个字符串作为载体就行。
	
	GUI_ShowCHinese(16,20,16,"温度",1);
	GUI_ShowString(53,20,strTemp,16,1);
	GUI_ShowCHinese(16,38,16,"湿度",1);
	GUI_ShowString(53,38,strHumi,16,1);
	delay_ms(1500);		
	delay_ms(1500);
	delay_ms(1500);
	delay_ms(1500);
	
}

写入过后会出现很多报错,当然,我们还有很多变量都没有定义。
下面添加定义:

uint8_t   ack_status=0;
uint8_t   readByte[6];
uint8_t   AHT20_status=0;

uint32_t  H1=0;  //Humility
uint32_t  T1=0;  //Temperature

uint8_t t1,t2,t3,t4;
uint8_t h1,h2,h3,h4;

uint8_t  AHT20_OutData[4];
uint8_t  AHT20sendOutData[10] = {0xFA, 0x06, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF};
char strTemp[30];  //声明字符数组strTemp,初始化元素30  
char strHumi[30];  //声明字符数组strHumi,初始化元素30
int t;
int h;
float a;
float b;

放在最上面全局变量就行。
然后到了硬件部分,特别注意dht20的接法
在这里插入图片描述
vcc 和gnd不必多说,只要是SDA数据连接和SCL时钟连接
特别注意SDA连接PB7 SCL连接PB6
然后使用flymcu烧录程序。
运行效果如下:
请添加图片描述

第三个要显示滚动的长字段

接下来是进行滚动字段。
下面是main.c

	
#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "gui.h"
#include "test.h"
int main(void)
{	
	delay_init();	    	       //延时函数初始化	  
	NVIC_Configuration(); 	   //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 	
	OLED_Init();			         //初始化OLED  
	OLED_Clear(0);             //清屏(全黑)
	OLED_WR_Byte(0x2E,OLED_CMD);        //关闭滚动
    OLED_WR_Byte(0x27,OLED_CMD);        //水平向左或者右滚动 26/27
    OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节
	OLED_WR_Byte(0x00,OLED_CMD);        //起始页 0
	OLED_WR_Byte(0x07,OLED_CMD);        //滚动时间间隔
	OLED_WR_Byte(0x07,OLED_CMD);        //终止页 7
	OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节
	OLED_WR_Byte(0xFF,OLED_CMD);        //虚拟字节
	TEST_MainPage();  //这里是我们需要设置的字符
	OLED_WR_Byte(0x2F,OLED_CMD);        //开启滚动
	while(1) 
	{	
		
	}
}

下面打开test.c 的Main page

void TEST_MainPage(void)
{	

	GUI_ShowCHinese(10,20,16,"这里写入你想要的字符注意顺序",1);
	
	//GUI_ShowString(40,32,"64X128",16,1);
	//GUI_ShowString(4,48,"www.lcdwiki.com",16,1);*/
	delay_ms(500);		
	delay_ms(500);
}

还要把你需要的字符取模然后存入我们上面的oled库。
下面是硬件实验效果。
请添加图片描述
参考文献:

  • https://blog.csdn.net/qq_45237293/article/details/111712565
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值