打算做个简单的按键密码门锁的,但是途中遇到不少问题,就比如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);
}
}
效果: