极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 35383|回复: 20

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

[复制链接]
发表于 2015-1-15 17:47:10 | 显示全部楼层 |阅读模式
    前几天逛淘宝时,发现有一块所谓秒杀NOKIA 5110的128×128TFT,
价格便宜,看针脚确实和5110一样,手一抖就入手一块。
插上电就傻眼了,手边所有的库没有一个能点亮的,店主送的程序也是51的,不能用。
研究半天,靠线路图里的芯片型号找到了国外一位大神,
他也是上当入了几块(ebay上这个TFT不便宜),一狠心自己写了驱动,拿来一用确实能点亮。

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

本帖子中包含更多资源

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

x
回复

使用道具 举报

 楼主| 发表于 2015-1-15 17:48:52 | 显示全部楼层
测试代码如下:
  1. #include <SPI.h>
  2. #include <Adafruit_GFX.h>
  3. #include <TFT_ILI9163C.h>

  4. extern uint8_t Hanzi16x16[];
  5. extern uint8_t Hanzi12x16[];
  6. #define __CS 10
  7. #define __DC 9
  8. #define __RST 8

  9. // Color definitions
  10. #define        BLACK   0x0000
  11. #define        BLUE    0x001F
  12. #define        RED     0xF800
  13. #define        GREEN   0x07E0
  14. #define CYAN    0x07FF
  15. #define MAGENTA 0xF81F
  16. #define YELLOW  0xFFE0  
  17. #define WHITE   0xFFFF

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

  19. void setup() {
  20.   tft.begin();
  21. }

  22. void loop(){
  23.   delay(100);
  24.   testText();
  25.   delay(5000);
  26. }


  27. unsigned long testText() {
  28.   tft.fillScreen();
  29.   unsigned long start = micros();
  30.   tft.setCursor(0, 0);
  31.   tft.setTextColor(WHITE);
  32.   tft.setTextSize(3);
  33.   tft.println("Hello World!");
  34.   tft.setTextColor(RED);   
  35.   tft.setTextSize(2);
  36.   tft.setFont(Hanzi16x16,16,16,'0');
  37.   tft.println("01234");
  38.   tft.setTextSize(1);
  39.   tft.setTextColor(YELLOW);
  40.   tft.setFont(Hanzi12x16,12,16,'0');
  41.   tft.println("01234");
  42.   tft.resetFont();
  43.   return micros() - start;
  44. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-15 17:51:02 | 显示全部楼层
取字模方法和5110显示汉字的一样,具体可以看这里:http://www.geek-workshop.com/thread-12299-1-1.html

取完的字模如下:
  1. #if defined(__AVR__)
  2.         #include <avr/pgmspace.h>
  3.         #define fontdatatype const uint8_t
  4. #elif defined(__PIC32MX__)
  5.         #define PROGMEM
  6.         #define fontdatatype const unsigned char
  7. #elif defined(__arm__)
  8.         #define PROGMEM
  9.         #define fontdatatype const unsigned char
  10. #endif

  11. fontdatatype Hanzi16x16[] PROGMEM =
  12. {
  13. /*--  文字:  白  --*/
  14. /*--  新宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  15. 0x00,0x00,0xF8,0x08,0x08,0x0C,0x0A,0x09,0x08,0x08,0x08,0x08,0xF8,0x00,0x00,0x00,
  16. 0x00,0x00,0xFF,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0xFF,0x00,0x00,0x00,
  17. /*--  文字:  日  --*/
  18. /*--  新宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  19. 0x00,0x00,0x00,0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE,0x00,0x00,0x00,0x00,
  20. 0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x00,0x00,0x00,0x00,
  21. /*--  文字:  依  --*/
  22. /*--  新宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  23. 0x00,0x80,0x60,0xF8,0x07,0x08,0x08,0xC8,0x39,0xCE,0x08,0x08,0x08,0x88,0x08,0x00,
  24. 0x01,0x00,0x00,0xFF,0x04,0x02,0x01,0xFF,0x40,0x21,0x06,0x0A,0x11,0x20,0x40,0x00,
  25. /*--  文字:  山  --*/
  26. /*--  新宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  27. 0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,
  28. 0x00,0x00,0x3F,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x7F,0x00,0x00,0x00,
  29. /*--  文字:  尽  --*/
  30. /*--  新宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  31. 0x00,0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0x22,0xE2,0x22,0x22,0x7E,0x00,0x00,0x00,
  32. 0x10,0x08,0x06,0x01,0x10,0x10,0x22,0x22,0x44,0x80,0x01,0x02,0x04,0x08,0x08,0x00,
  33. };

  34. fontdatatype Hanzi12x16[] PROGMEM =
  35. {
  36. /*--  文字:  黄  --*/
  37. /*--  新宋体9;  此字体下对应的点阵为:宽x高=12x12   --*/
  38. /*--  高度不是8的倍数,现调整为:宽度x高度=12x16  --*/
  39. 0x08,0xEA,0xAA,0xAF,0xAA,0xFA,0xAA,0xAF,0xAA,0xEA,0x08,0x00,0x00,0x0B,0x06,0x02,
  40. 0x02,0x03,0x02,0x02,0x06,0x0B,0x00,0x00,
  41. /*--  文字:  河  --*/
  42. /*--  新宋体9;  此字体下对应的点阵为:宽x高=12x12   --*/
  43. /*--  高度不是8的倍数,现调整为:宽度x高度=12x16  --*/
  44. 0x10,0x22,0x04,0x00,0xF2,0x12,0x12,0xF2,0x02,0xFE,0x02,0x00,0x04,0x02,0x01,0x00,
  45. 0x03,0x01,0x01,0x09,0x08,0x0F,0x00,0x00,
  46. /*--  文字:  入  --*/
  47. /*--  新宋体9;  此字体下对应的点阵为:宽x高=12x12   --*/
  48. /*--  高度不是8的倍数,现调整为:宽度x高度=12x16  --*/
  49. 0x00,0x00,0x01,0x81,0x72,0x0C,0x70,0x80,0x00,0x00,0x00,0x00,0x08,0x04,0x02,0x01,
  50. 0x00,0x00,0x00,0x01,0x02,0x04,0x08,0x00,
  51. /*--  文字:  海  --*/
  52. /*--  新宋体9;  此字体下对应的点阵为:宽x高=12x12   --*/
  53. /*--  高度不是8的倍数,现调整为:宽度x高度=12x16  --*/
  54. 0x11,0x22,0x48,0xC4,0x7B,0x4A,0x6A,0x4A,0x4A,0xFA,0x42,0x00,0x04,0x02,0x00,0x03,
  55. 0x02,0x02,0x03,0x0A,0x0A,0x07,0x02,0x00,
  56. /*--  文字:  流  --*/
  57. /*--  新宋体9;  此字体下对应的点阵为:宽x高=12x12   --*/
  58. /*--  高度不是8的倍数,现调整为:宽度x高度=12x16  --*/
  59. 0x22,0x44,0x00,0x24,0xB4,0x2C,0xA5,0x26,0xA4,0x34,0x64,0x00,0x04,0x02,0x08,0x04,
  60. 0x03,0x00,0x0F,0x00,0x07,0x08,0x0E,0x00,
  61. };
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-15 17:58:51 | 显示全部楼层
我主要加了2个函数,一个设字体,一个把字体设回原来5×7的字体:
  1.   tft.setFont(Hanzi12x16,12,16,'0');
  2.   tft.resetFont();
复制代码


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

回复 支持 反对

使用道具 举报

发表于 2015-1-15 18:01:01 | 显示全部楼层
虽我是新手!
虽我不明觉厉!
但楼主是好人啊!!
回复 支持 反对

使用道具 举报

发表于 2015-1-15 19:24:18 | 显示全部楼层
这个汉字显示的函数搞得不错~谢谢~
回复 支持 反对

使用道具 举报

发表于 2015-1-15 22:02:23 | 显示全部楼层
楼主不错嘛,有极客精神!赞一个
回复 支持 反对

使用道具 举报

发表于 2015-1-15 22:54:49 | 显示全部楼层
这才是【极客精神】,谢谢分享啦~~~~~~~~~~~
回复 支持 反对

使用道具 举报

发表于 2015-1-15 23:43:58 | 显示全部楼层
不错 不错
回复 支持 反对

使用道具 举报

发表于 2015-1-15 23:59:50 | 显示全部楼层
haha, I have a same one.  http://www.geek-workshop.com/thread-11898-1-1.html
回复 支持 反对

使用道具 举报

发表于 2015-1-16 09:19:56 | 显示全部楼层
好样的,赞一个
回复 支持 反对

使用道具 举报

发表于 2015-1-16 12:42:10 | 显示全部楼层
51移植arduino容易啊,我不喜欢用库,开发起来不够自由
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-16 13:58:59 | 显示全部楼层
lm4766 发表于 2015-1-16 12:42
51移植arduino容易啊,我不喜欢用库,开发起来不够自由

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

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2015-1-16 14:16:36 | 显示全部楼层
比较耗资源吧?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-16 14:18:28 | 显示全部楼层
5free 发表于 2015-1-15 23:59
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左右。

  1. Binary sketch size: 11,962 bytes (of a 32,256 byte maximum)
复制代码

  1. Sketch uses 7,190 bytes (22%) of program storage space. Maximum is 32,256 bytes.
  2. Global variables use 124 bytes (6%) of dynamic memory, leaving 1,924 bytes for local variables. Maximum is 2,048 bytes.
复制代码
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-4-20 16:38 , Processed in 0.046267 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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