极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 32394|回复: 16

Nokia5110显示汉字的步骤

[复制链接]
发表于 2015-1-5 15:00:44 | 显示全部楼层 |阅读模式
    前几天朋友给了几块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最终版本》来取字模,参数设置请按照下面截图里的设置。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

 楼主| 发表于 2015-1-5 15:05:16 | 显示全部楼层
    根据上面的步骤,我连了一个HC-SR04超声波测距传感器做演示,代码如下:

[pre lang="arduino" line="1" file="HC-SR04.ino"]#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);
}
[/code]
回复 支持 反对

使用道具 举报

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

[pre lang="arduino" line="1" file="myFonts.c"]#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,
};
[/code]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-5 15:14:29 | 显示全部楼层
    这是实际运行后的效果

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-5 15:18:26 | 显示全部楼层
手机拍照效果不好,其实背景灯不开效果更好。
回复 支持 反对

使用道具 举报

发表于 2015-1-5 15:48:51 | 显示全部楼层
5110其实很好用。。。只是有点不好看。。。一般diy绝对够用了!
回复 支持 反对

使用道具 举报

发表于 2015-1-6 10:42:09 | 显示全部楼层
非常不错,现在正在研究液晶屏
回复 支持 反对

使用道具 举报

发表于 2015-1-6 11:45:35 | 显示全部楼层
OLED应该也一样吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-6 15:00:57 | 显示全部楼层
努力微笑 发表于 2015-1-6 11:45
OLED应该也一样吧

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

使用道具 举报

 楼主| 发表于 2015-1-6 15:07:50 | 显示全部楼层
yifabin023 发表于 2015-1-5 15:48
5110其实很好用。。。只是有点不好看。。。一般diy绝对够用了!

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

5110更适合显示调试信息什么的,比如GPS信息,3轴加速信息等。
回复 支持 反对

使用道具 举报

发表于 2015-5-8 17:27:14 | 显示全部楼层
楼主 为什么我替换后 他还是不能识别我定义的Hanzi12x16啊,而且我试了直接加进去和替换 都识别不了是怎么回事啊
回复 支持 反对

使用道具 举报

发表于 2015-5-8 17:52:19 | 显示全部楼层
楼主快告诉我把谢谢啊!!!
回复 支持 反对

使用道具 举报

发表于 2015-10-20 08:38:52 | 显示全部楼层
请问怎么改字体的宽*高?
回复 支持 反对

使用道具 举报

发表于 2016-8-1 13:37:00 | 显示全部楼层
本帖最后由 啊啦 于 2016-8-1 14:29 编辑

搞定了 谢谢大师!!!学习了
回复 支持 反对

使用道具 举报

发表于 2017-10-9 22:28:24 | 显示全部楼层
想学习中文显示,先顶上来。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-26 16:50 , Processed in 0.045092 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表