Pyrrhus 发表于 2015-1-15 17:47:10

坑爹的所谓秒杀NOKIA 5110的128×128TFT上显示汉字的方法

    前几天逛淘宝时,发现有一块所谓秒杀NOKIA 5110的128×128TFT,
价格便宜,看针脚确实和5110一样,手一抖就入手一块。
插上电就傻眼了,手边所有的库没有一个能点亮的,店主送的程序也是51的,不能用。
研究半天,靠线路图里的芯片型号找到了国外一位大神,
他也是上当入了几块(ebay上这个TFT不便宜),一狠心自己写了驱动,拿来一用确实能点亮。

不过这个库只能显示5×7的英文数字,还好他用了Adafruit-GFX-Library(很多OLED/TFT都用这个库),
抱着试一试的心情,扩展了一下显示字符的函数,居然真的可以显示汉字。
事实上,我只改了Adafruit-GFX-Library,理论上其他用这个库的OLED/TFT都可以用这个方法显示汉字。
效果如下:

Pyrrhus 发表于 2015-1-15 17:48:52

测试代码如下:
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <TFT_ILI9163C.h>

extern uint8_t Hanzi16x16[];
extern uint8_t Hanzi12x16[];
#define __CS 10
#define __DC 9
#define __RST 8

// Color definitions
#define        BLACK   0x0000
#define        BLUE    0x001F
#define        RED   0xF800
#define        GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW0xFFE0
#define WHITE   0xFFFF

TFT_ILI9163C tft = TFT_ILI9163C(__CS, __DC, __RST);

void setup() {
tft.begin();
}

void loop(){
delay(100);
testText();
delay(5000);
}


unsigned long testText() {
tft.fillScreen();
unsigned long start = micros();
tft.setCursor(0, 0);
tft.setTextColor(WHITE);
tft.setTextSize(3);
tft.println("Hello World!");
tft.setTextColor(RED);   
tft.setTextSize(2);
tft.setFont(Hanzi16x16,16,16,'0');
tft.println("01234");
tft.setTextSize(1);
tft.setTextColor(YELLOW);
tft.setFont(Hanzi12x16,12,16,'0');
tft.println("01234");
tft.resetFont();
return micros() - start;
}

Pyrrhus 发表于 2015-1-15 17:51:02

取字模方法和5110显示汉字的一样,具体可以看这里:http://www.geek-workshop.com/thread-12299-1-1.html

取完的字模如下:
#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 =
{
/*--文字:白--*/
/*--新宋体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 =
{
/*--文字:黄--*/
/*--新宋体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-15 17:58:51

我主要加了2个函数,一个设字体,一个把字体设回原来5×7的字体:
tft.setFont(Hanzi12x16,12,16,'0');
tft.resetFont();


设字体函数里,
第一个参数是字体数组,
第二个参数是字体宽度,
第三个参数是字体高度,必须是8的倍数,
第四个参数是显示字体的偏移量,设成'0'后print("0")就会显示第一个汉字,以此类推。

kerr 发表于 2015-1-15 18:01:01

虽我是新手!
虽我不明觉厉!
但楼主是好人啊!!

maxims 发表于 2015-1-15 19:24:18

这个汉字显示的函数搞得不错~谢谢~

潇洒哥 发表于 2015-1-15 22:02:23

楼主不错嘛,有极客精神!赞一个

xinhoujue 发表于 2015-1-15 22:54:49

这才是【极客精神】,谢谢分享啦~~~~~~~~~~~

zoologist 发表于 2015-1-15 23:43:58

不错 不错

5free 发表于 2015-1-15 23:59:50

haha, I have a same one.http://www.geek-workshop.com/thread-11898-1-1.html

Hackerpro 发表于 2015-1-16 09:19:56

好样的,赞一个

lm4766 发表于 2015-1-16 12:42:10

51移植arduino容易啊,我不喜欢用库,开发起来不够自由

Pyrrhus 发表于 2015-1-16 13:58:59

lm4766 发表于 2015-1-16 12:42 static/image/common/back.gif
51移植arduino容易啊,我不喜欢用库,开发起来不够自由

我不会51,附件是店主给的程序,如果有兴趣可以帮忙移植一下。

老胖熊 发表于 2015-1-16 14:16:36

比较耗资源吧?

Pyrrhus 发表于 2015-1-16 14:18:28

5free 发表于 2015-1-15 23:59 static/image/common/back.gif
haha, I have a same one.http://www.geek-workshop.com/thread-11898-1-1.html

关于程序大小的问题我一并在这里回答吧。

你可以试试用IDE 1.5.8编译,1.0.6编译出来12k,但1.5.8编译出来只有7k左右。

Binary sketch size: 11,962 bytes (of a 32,256 byte maximum)


Sketch uses 7,190 bytes (22%) of program storage space. Maximum is 32,256 bytes.
Global variables use 124 bytes (6%) of dynamic memory, leaving 1,924 bytes for local variables. Maximum is 2,048 bytes.
页: [1] 2
查看完整版本: 坑爹的所谓秒杀NOKIA 5110的128×128TFT上显示汉字的方法