Pyrrhus 发表于 2015-1-5 15:00:44

Nokia5110显示汉字的步骤

    前几天朋友给了几块Nokia5110屏,把玩了一段时间后觉得非常不错,所以分享一下研究所得。
Nokia5110有以下优点:

便宜,某宝上基本10元以下就能拿到,比1602都便宜。
容易驱动,是图形方式输出,所以显示汉字比较容易。
分辨率高,84×48显示12点阵的汉字都可以显示4×7个字,比1602要好很多。


    要想驱动这个屏幕请先去这里下库:http://www.henningkarlsen.com/electronics/library.php?id=44
那个网站有2个库:LCD5110_Basic和LCD5110_Graph,
两者的区别是前者功能弱一些,编译后尺寸小一点,速度快一点。
比如,同样显示字符,前者只能显示在Y轴8倍数的坐标上,而后者没有这个限制,
所以一般还是用LCD5110_Graph吧。

    下了库后只要照着里面的Example做就能显示文字了,而要想显示汉字的话其实只要替换掉字体就可以了。
我用了一个偷懒的方法:把库里的DefaultFonts.c拷出来换个名字另存,然后把中文字模替换进去。

    而取字模可以用附件的《字模软件2.2最终版本》来取字模,参数设置请按照下面截图里的设置。

Pyrrhus 发表于 2015-1-5 15:05:16

    根据上面的步骤,我连了一个HC-SR04超声波测距传感器做演示,代码如下:

#include <LCD5110_Graph.h>
#define TrigPin 2
#define EchoPin 3

LCD5110 myGLCD(8,9,10,11,12);
extern uint8_t SmallFont[];
extern uint8_t MediumNumbers[];
extern uint8_t Hanzi12x16[];
extern uint8_t Hanzi16x16[];
float Value_cm;

void setup()
{
Serial.begin(9600);
pinMode(TrigPin, OUTPUT);
pinMode(EchoPin, INPUT);
myGLCD.InitLCD(60);
myGLCD.invert(false);

}
void loop()
{
digitalWrite(TrigPin, LOW); //低高低电平发一个短时间脉冲去TrigPin
delayMicroseconds(2);
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);
Value_cm = float( pulseIn(EchoPin, HIGH) * 17 )/1000; //将回波时间换算成cm

myGLCD.clrScr();
myGLCD.setFont(SmallFont);
myGLCD.print("cm", 72, 40);
myGLCD.setFont(MediumNumbers);
myGLCD.printNumF(Value_cm,2, LEFT, 32,'.',6,';');
myGLCD.setFont(Hanzi12x16);
myGLCD.print("01234", 0, 0);
myGLCD.setFont(Hanzi16x16);
myGLCD.print("01234", 0, 12);
myGLCD.update();
delay(1000);
}

Pyrrhus 发表于 2015-1-5 15:13:00

    替换的字模文件如下:
字模文件里的前4字节:0x0c, 0x10, 0x30, 0x05,
前2个是字模大小,表示12×16的字体,
第3位是ASCII码,0x30是字符『0』,所以myGLCD.print("01234", 0, 0);显示『黄河入海流』。
第4位是字模数量,即使设错也影响不大。

#if defined(__AVR__)
        #include <avr/pgmspace.h>
        #define fontdatatype const uint8_t
#elif defined(__PIC32MX__)
        #define PROGMEM
        #define fontdatatype const unsigned char
#elif defined(__arm__)
        #define PROGMEM
        #define fontdatatype const unsigned char
#endif

fontdatatype Hanzi16x16[] PROGMEM =
{
0x10, 0x10, 0x30, 0x05,
/*--文字:白--*/
/*--新宋体12;此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0xF8,0x08,0x08,0x0C,0x0A,0x09,0x08,0x08,0x08,0x08,0xF8,0x00,0x00,0x00,
0x00,0x00,0xFF,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0xFF,0x00,0x00,0x00,
/*--文字:日--*/
/*--新宋体12;此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0x00,0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x00,0x00,0x00,0x00,
/*--文字:依--*/
/*--新宋体12;此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x80,0x60,0xF8,0x07,0x08,0x08,0xC8,0x39,0xCE,0x08,0x08,0x08,0x88,0x08,0x00,
0x01,0x00,0x00,0xFF,0x04,0x02,0x01,0xFF,0x40,0x21,0x06,0x0A,0x11,0x20,0x40,0x00,
/*--文字:山--*/
/*--新宋体12;此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,
0x00,0x00,0x3F,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x7F,0x00,0x00,0x00,
/*--文字:尽--*/
/*--新宋体12;此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0x22,0xE2,0x22,0x22,0x7E,0x00,0x00,0x00,
0x10,0x08,0x06,0x01,0x10,0x10,0x22,0x22,0x44,0x80,0x01,0x02,0x04,0x08,0x08,0x00,
};

fontdatatype Hanzi12x16[] PROGMEM =
{
0x0c, 0x10, 0x30, 0x05,
/*--文字:黄--*/
/*--新宋体9;此字体下对应的点阵为:宽x高=12x12   --*/
/*--高度不是8的倍数,现调整为:宽度x高度=12x16--*/
0x08,0xEA,0xAA,0xAF,0xAA,0xFA,0xAA,0xAF,0xAA,0xEA,0x08,0x00,0x00,0x0B,0x06,0x02,
0x02,0x03,0x02,0x02,0x06,0x0B,0x00,0x00,
/*--文字:河--*/
/*--新宋体9;此字体下对应的点阵为:宽x高=12x12   --*/
/*--高度不是8的倍数,现调整为:宽度x高度=12x16--*/
0x10,0x22,0x04,0x00,0xF2,0x12,0x12,0xF2,0x02,0xFE,0x02,0x00,0x04,0x02,0x01,0x00,
0x03,0x01,0x01,0x09,0x08,0x0F,0x00,0x00,
/*--文字:入--*/
/*--新宋体9;此字体下对应的点阵为:宽x高=12x12   --*/
/*--高度不是8的倍数,现调整为:宽度x高度=12x16--*/
0x00,0x00,0x01,0x81,0x72,0x0C,0x70,0x80,0x00,0x00,0x00,0x00,0x08,0x04,0x02,0x01,
0x00,0x00,0x00,0x01,0x02,0x04,0x08,0x00,
/*--文字:海--*/
/*--新宋体9;此字体下对应的点阵为:宽x高=12x12   --*/
/*--高度不是8的倍数,现调整为:宽度x高度=12x16--*/
0x11,0x22,0x48,0xC4,0x7B,0x4A,0x6A,0x4A,0x4A,0xFA,0x42,0x00,0x04,0x02,0x00,0x03,
0x02,0x02,0x03,0x0A,0x0A,0x07,0x02,0x00,
/*--文字:流--*/
/*--新宋体9;此字体下对应的点阵为:宽x高=12x12   --*/
/*--高度不是8的倍数,现调整为:宽度x高度=12x16--*/
0x22,0x44,0x00,0x24,0xB4,0x2C,0xA5,0x26,0xA4,0x34,0x64,0x00,0x04,0x02,0x08,0x04,
0x03,0x00,0x0F,0x00,0x07,0x08,0x0E,0x00,
};

Pyrrhus 发表于 2015-1-5 15:14:29

    这是实际运行后的效果

Pyrrhus 发表于 2015-1-5 15:18:26

手机拍照效果不好,其实背景灯不开效果更好。

yifabin023 发表于 2015-1-5 15:48:51

5110其实很好用。。。只是有点不好看。。。一般diy绝对够用了!

dingoslove 发表于 2015-1-6 10:42:09

非常不错,现在正在研究液晶屏

努力微笑 发表于 2015-1-6 11:45:35

OLED应该也一样吧

Pyrrhus 发表于 2015-1-6 15:00:57

努力微笑 发表于 2015-1-6 11:45 static/image/common/back.gif
OLED应该也一样吧

OLED估计要用U8GLIB,但那个库比较庞大,改起来要多花点精力。

Pyrrhus 发表于 2015-1-6 15:07:50

yifabin023 发表于 2015-1-5 15:48 static/image/common/back.gif
5110其实很好用。。。只是有点不好看。。。一般diy绝对够用了!

5110宽度稍微小了点,用小字体每行才能显示14个字符,
不像1602虽然显示面积小,但一行16个字符视觉效果不错。

5110更适合显示调试信息什么的,比如GPS信息,3轴加速信息等。

刘云峰 发表于 2015-5-8 17:27:14

楼主 为什么我替换后 他还是不能识别我定义的Hanzi12x16啊,而且我试了直接加进去和替换 都识别不了是怎么回事啊

刘云峰 发表于 2015-5-8 17:52:19

楼主快告诉我把谢谢啊!!!

梦之澜657 发表于 2015-10-20 08:38:52

请问怎么改字体的宽*高?

啊啦 发表于 2016-8-1 13:37:00

本帖最后由 啊啦 于 2016-8-1 14:29 编辑

搞定了 谢谢大师!!!学习了

最帅的老饼 发表于 2017-10-9 22:28:24

想学习中文显示,先顶上来。
页: [1] 2
查看完整版本: Nokia5110显示汉字的步骤