Arduino:UTFT LCD(220 * 176)使用自定义字体

上次用四位数码管做了个简易的电子钟,这次再用手头的UTFT液晶屏试试看。


显示屏硬件是QDtech_2.2寸SPI串口176*220模块,主控为IL9225,使用了卖家提供的驱动。

使用很简单,理论上是可以直接插入Arduino UNO R3的,但因为这样会占用了A5、A4口(SCL、SDA),从而导致I2C的DS3231模块不能正常工作,所以我用了一块自制的最小系统板,并将A5、A4脚改接到3、4号引脚(物理引脚PIN5、PIN6)上。对应的,Arduino代码的构造函数也改成:
UTFT lcd(QD220A, A2, A1, 3, 4, A3);

驱动安装成功后可以试着运行实例,很有意思。唯一的问题是,自带的字体只有大、小、仿七段LED数字这三种。

那么如何使用自己喜欢的字体,甚至显示中文呢?

如果不想折腾,也不需要中文,那么不妨看下这个网站:http://rinkydinkelectronics.com/r_fonts.php,选一种字体,将C代码追加或替换驱动自带的DefaultFonts.c即可。

进一步分析驱动c源码,结合以上字体文件内容,我是这么实现的:
以hallfetica_normal为例,
fontdatatype hallfetica_normal[3044] PROGMEM={
0x10,0x10,0x20,0x5F,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  // <space>
0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,  // !
。。。。。

注意第一行的0x10,0x10,0x20,0x5F,其含义是:宽度,高度,首字符的ASCII,字符总数。翻译成十进制的人话就是:这套字符集中,每个字符宽16像素,高16像素,首字符ASCII代码32(即空格),总共95个字符。所以数组大小应该是16*16*95/8 + 4 = 3044(那四个附加信息也得算)。

紧接着的字模代码当然就决定了字符显示起来会是什么样子。所以再下载个取字模的软件就能“自制”喜欢的字体了。我用的是PC2LCD2002,很好用。取模选项为:阴码、逐行式、顺向。

由于这次是要做个时钟,所以不牵涉英文字符和标点符号(冒号除外)。那就正好,冒号以后的字符都可以删掉节省宝贵的存储空间,只保留最初的27个即可(当然要重新计算数组大小);空格之后(当然空格你也可以挪作他用,只是我喜欢留着那一串0x00)、字符“0”之前的那些个标点符号,取上中文模。

举例而言,我取的27个字模分别是:
 星期年月日一二三四五六七八九零0123456789:

对应原始代码中的:
 !"#$%&'()*+,-./0123456789:

这样,显示“星期几”这三个汉字,本质上显示对应的原始ASCII字符即可:
  String wk = "!\""; // 对应“星期”
  switch (now.dayOfWeek())
  {
    case 0:
      wk += "%"; //对应“日”
      break;
    case 1:
      wk += "&"; //对应“一”
      break;
    case 2:
      wk += "'"; //对应“二”
      break;
    case 3:
      wk += "("; //对应“三”
      break;
    case 4:
      wk += ")"; //对应“四”
      break;
    case 5:
      wk += "*"; //对应“五”
      break;
    case 6:
      wk += "+"; //对应“六”
      break;


    default:
      break;
  }

  lcd.print(wk, 86, 52, 0);


猜你喜欢

转载自blog.csdn.net/ki1381/article/details/80418466