坑爹的所谓秒杀NOKIA 5110的128×128TFT上显示汉字的方法
前几天逛淘宝时,发现有一块所谓秒杀NOKIA 5110的128×128TFT,价格便宜,看针脚确实和5110一样,手一抖就入手一块。
插上电就傻眼了,手边所有的库没有一个能点亮的,店主送的程序也是51的,不能用。
研究半天,靠线路图里的芯片型号找到了国外一位大神,
他也是上当入了几块(ebay上这个TFT不便宜),一狠心自己写了驱动,拿来一用确实能点亮。
不过这个库只能显示5×7的英文数字,还好他用了Adafruit-GFX-Library(很多OLED/TFT都用这个库),
抱着试一试的心情,扩展了一下显示字符的函数,居然真的可以显示汉字。
事实上,我只改了Adafruit-GFX-Library,理论上其他用这个库的OLED/TFT都可以用这个方法显示汉字。
效果如下:
测试代码如下:
#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;
}
取字模方法和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,
};
我主要加了2个函数,一个设字体,一个把字体设回原来5×7的字体:
tft.setFont(Hanzi12x16,12,16,'0');
tft.resetFont();
设字体函数里,
第一个参数是字体数组,
第二个参数是字体宽度,
第三个参数是字体高度,必须是8的倍数,
第四个参数是显示字体的偏移量,设成'0'后print("0")就会显示第一个汉字,以此类推。
虽我是新手!
虽我不明觉厉!
但楼主是好人啊!! 这个汉字显示的函数搞得不错~谢谢~ 楼主不错嘛,有极客精神!赞一个 这才是【极客精神】,谢谢分享啦~~~~~~~~~~~ 不错 不错 haha, I have a same one.http://www.geek-workshop.com/thread-11898-1-1.html 好样的,赞一个 51移植arduino容易啊,我不喜欢用库,开发起来不够自由 lm4766 发表于 2015-1-16 12:42 static/image/common/back.gif
51移植arduino容易啊,我不喜欢用库,开发起来不够自由
我不会51,附件是店主给的程序,如果有兴趣可以帮忙移植一下。 比较耗资源吧? 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