粤嵌stm32f407zet6开发板,初学者教程下的oled中文显示函数下数字显示修正

打算做个简单的按键密码门锁的,但是途中遇到不少问题,就比如oled显示屏的显示问题,由于课程时间原因老师也没有细讲,就自己琢磨了。用专用的数字显示函数显示,显示出来的数字太小了。因为是新手,就先不了解显示函数的基本原理了,先保证别人给的底层显示函数先会用的正确。

一、问题:在用老师给的底层显示函数的OLED_ShowCHinese()时,如果用它显示软件(PCtoLCD2002完美版)生成的数组,会发现头不对尾。

初次测试代码:(数字是用软件PCtoLCD2002生成的,无修改放进存放汉字数组Hzk里的)

#include "delay.h"
#include "oled.h"

int main(void)
{
	SysTick_Init(168);                //选择168MHz
	OLED_Init();					    // oled模块引脚初始化
	OLED_Clear(); 						// oled模块清屏(清全屏)
	while(1)
	{
//		OLED_ShowNum(0,0,0,1,0);
//		OLED_ShowNum(6,0,0,1,0);
		OLED_ShowCHinese(0,0,0);
		OLED_ShowCHinese(17,0,1);
		OLED_ShowCHinese(33,0,2);
		OLED_ShowCHinese(49,0,3);
        OLED_ShowCHinese(65,0,4);
	}
}

显示效果如下(有问题,显示不对,因为此时测试的数组是8*16规格的,当然不对,函数OLED_ShowCHinese的引用的汉字库单个字应该是16*16规格的):

问题发现、解决过程:

1、软件PCtoLCD2002的具体设置:

2、用pctolcd2002完美版生成的文本“-2-3-”如下

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x00},/*"-",0*/
/* (8 X 16 , 宋体 )*/

{0x00,0x70,0x08,0x08,0x08,0x08,0xF0,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00},/*"2",1*/
/* (8 X 16 , 宋体 )*/

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x00},/*"-",2*/
/* (8 X 16 , 宋体 )*/

{0x00,0x30,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x18,0x20,0x21,0x21,0x22,0x1C,0x00},/*"3",3*/
/* (8 X 16 , 宋体 )*/

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x00},/*"-",4*/
/* (8 X 16 , 宋体 )*/

3、生成的文本放到字库里:

4、此时main函数测试如下(就是开头的情况):

5、前面加8*16的0x00数组,凑成16*16

效果:

6、再次调整(只调整数字2的显示),测试

效果:

二、最终确定解决办法

①解决办法1:显示的数字想靠近左边就把原数组8*16的拆成两部分,然后新创建一个0x00的8*16数组在前面,前半部分和后半分别移到这两个8*16数组的前面;同理想靠近右边就放数组后面。

②解决办法2:网站https://www.23bei.com/tool/216.html

1、网站设置如下:

2、取出生成的数组放到汉字库Hzk[]里

网站生成的:

/* [字库]:[HZK1616宋体] [数据排列]:从左到右从上到下 [取模方式]:纵向8点下高位 [正负反色]:否 [去掉重复后]共2个字符
[总字符库]:"23"*/

/*-- ID:0,字符:"2",ASCII编码:A3B2,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/
0x00,0x00,0x00,0x00,0x30,0x38,0x0c,0x04,0x04,0x0c,0xf8,0xf0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x20,0x30,0x38,0x2c,0x26,0x23,0x21,0x38,0x00,0x00,0x00,0x00,

/*-- ID:1,字符:"3",ASCII编码:A3B3,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/
0x00,0x00,0x00,0x00,0x10,0x18,0x0c,0x84,0x84,0xcc,0x78,0x30,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x08,0x18,0x30,0x20,0x20,0x31,0x1f,0x0e,0x00,0x00,0x00,0x00

要放置的:

{0x00,0x00,0x00,0x00,0x30,0x38,0x0c,0x04,0x04,0x0c,0xf8,0xf0,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x20,0x30,0x38,0x2c,0x26,0x23,0x21,0x38,0x00,0x00,0x00,0x00},/*"2",2*/
/* (16 X 16 , 宋体 )*/

{0x00,0x00,0x00,0x00,0x10,0x18,0x0c,0x84,0x84,0xcc,0x78,0x30,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x08,0x18,0x30,0x20,0x20,0x31,0x1f,0x0e,0x00,0x00,0x00,0x00},/*"3",3*/
/* (16 X 16 , 宋体 )*/

放置如图(数组标号2和3,后面16*16的那两个就是方法2的网站的):

3、测试

#include "delay.h"
#include "oled.h"

int main(void)
{
	SysTick_Init(168);
	OLED_Init();						// oled模块引脚初始化
	OLED_Clear(); 						// oled模块清屏(清全屏)
	while(1)
	{
		OLED_ShowCHinese(0,0,0);
		OLED_ShowCHinese(17,0,1);
		OLED_ShowCHinese(33,0,2);
		OLED_ShowCHinese(49,0,3);
	}
}

效果:

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值