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最终版本》来取字模,参数设置请按照下面截图里的设置。 根据上面的步骤,我连了一个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);
}
替换的字模文件如下:
字模文件里的前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,
};
这是实际运行后的效果 手机拍照效果不好,其实背景灯不开效果更好。 5110其实很好用。。。只是有点不好看。。。一般diy绝对够用了! 非常不错,现在正在研究液晶屏 OLED应该也一样吧 努力微笑 发表于 2015-1-6 11:45 static/image/common/back.gif
OLED应该也一样吧
OLED估计要用U8GLIB,但那个库比较庞大,改起来要多花点精力。 yifabin023 发表于 2015-1-5 15:48 static/image/common/back.gif
5110其实很好用。。。只是有点不好看。。。一般diy绝对够用了!
5110宽度稍微小了点,用小字体每行才能显示14个字符,
不像1602虽然显示面积小,但一行16个字符视觉效果不错。
5110更适合显示调试信息什么的,比如GPS信息,3轴加速信息等。 楼主 为什么我替换后 他还是不能识别我定义的Hanzi12x16啊,而且我试了直接加进去和替换 都识别不了是怎么回事啊 楼主快告诉我把谢谢啊!!! 请问怎么改字体的宽*高? 本帖最后由 啊啦 于 2016-8-1 14:29 编辑
搞定了 谢谢大师!!!学习了 想学习中文显示,先顶上来。
页:
[1]
2