1. 程式人生 > >Arduino:UTFT LCD(220 * 176)使用自定義字型

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);


相關推薦

ArduinoUTFT LCD220 * 176使用定義字型

上次用四位數碼管做了個簡易的電子鐘,這次再用手頭的UTFT液晶屏試試看。顯示屏硬體是QDtech_2.2寸SPI串列埠176*220模組,主控為IL9225,使用了賣家提供的驅動。使用很簡單,理論上是可以直接插入Arduino UNO R3的,但因為這樣會佔用了A5、A4口(

ios開發之--仿微信定義表情鍵盤

lai signed avi 創建 不能 url div load mps 先附上demo:https://github.com/hgl753951/CusEmoji.git 效果圖如下: 先說下具體的實現功能: 1,本地加載了一些H5的代碼,直接使用webview的lo

SpringMVC十二定義異常處理器 HandlerExceptionResolver接口

pin org ota admin pack property framework ase exception 自定義異常處理器和系統異常處理器的提升版可以實現相同的功能,但是使用的方法不同,自定義異常處理器可以不用在配置文件中配置name多東西,只需要一個異常處理器就可以

Salesforce 開發整理十一 定義放大鏡查找效果

!= empty ole str 技術分享 ring sql value idp 有時候在自定義的visualforce頁面上,需要實現系統標準的查找樣式,當不能使用標準的style的時候,我們只能選擇自定義實現,下面分享一個demo,預覽效果如下: 實現代碼,Visua

C++語言學習二十——定義內存管理

single null allocated 析構函數 opera .get cat st2 argc C++語言學習(二十)——自定義內存管理 一、統計類對象中成員變量的訪問次數 mutable是為了突破const函數的限制而設計的,mutable修飾的成員變量將永遠處於可

SpringCloud二十定義eureka-client服務列表

當我們不需要從eureka等獲取服務列表時,可以自己指定服務列表。 ribbon: eureka: #禁用eureka ribbon enabled: false eureka-servi

ios多執行緒操作十二—— 定義NSOperation實現網路下載後回撥

- (void)main { @autoreleasepool { // 下載圖片的耗時操作 NSURL *url = [NSURL URLWithString:self.urlString]; NSData *data = [NSDa

angularJS學習之路十八---定義指令執行過程

angularJS中對指令的解析與執行過程是這樣的: ·      瀏覽器得到 HTML 字串內容,解析得到 DOM 結構。 ·      ng 引入,把 DOM 結構扔給 $compile 函式處理

angularJS學習之路三十---定義指令---templateUrl

第一種寫法: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title&

nginx-1.12.0版本編譯安裝-定義安裝路徑

nginx-1.12.0版本(編譯安裝)-自定義安裝路徑 安裝路徑:/application/nginx-1.12.0 1.前期準備 安裝編譯需要的gcc和gcc-c++ yum inst

二十定義資料庫連線池

目錄 使用資料庫連線池優化資料庫效能 之前我們對資料庫的操作,其實是有很大問題的; 因為我們是每次操作資料庫之前,都會問資料庫要一個連線,用完之後,就把這個連結還給了資料庫; 其實資料庫連線是重量級的東西,資料庫每次建立一個連接出來,都要花

SpringMVC系列十二定義攔截器

Spring MVC也可以使用攔截器對請求進行攔截處理,使用者可以自定義攔截器來實現特定的功能,自定義的攔截器必須實現HandlerInterceptor介面 – preHandle():這個方法在業務處理器處理請求之前被呼叫,在該方法中對使用者請求 request 進行處理

題目1004Medianqsort函數定義cmp函數

%d font com ron ring scan sort mat .com 題目鏈接:http://ac.jobdu.com/problem.php?pid=1004 詳解鏈接:https://github.com/zpfbuaa/JobduInCPlusPlus

分類算法決策樹C4.5(轉)

clas 依賴 1.5 -s clip win pan 定義 衡量 C4.5是機器學習算法中的另一個分類決策樹算法,它是基於ID3算法進行改進後的一種重要算法,相比於ID3算法,改進有如下幾個要點: 1)用信息增益率來選擇屬性。ID3選擇屬性用的是子樹的信息增益,這裏可

添磚加瓦設計模式總述

.cn 以及 行為 怎樣 src 工程 span 軟件 軟件設計模式   軟件設計模式是由GoF(Gang of Four)將模式的概念引入軟件工程領域後誕生的。軟件模式與具體的應用領域無關。   GoF提出的設計模式有23個,大體可分為三類:   (1)創建型模式:如何創

linux學習類目常見命令持續更新

基礎命令mkdir=make directorys=創建目錄例子: mkdir /data=在根/下創建data目錄ls=list=列表目錄文件例子: ls / =列根/目錄下的目錄和文件參數: -l(long)=長格式 -d(directorys)=查

FTP兩種工作模式主動模式Active FTP和被動模式

ftp 主動(port) 被動(pasv)模式在主動模式下,FTP客戶端隨機開啟一個大於1024的端口N向服務器的21號端口發起連接,然後開放N+1號端口進行監聽,並向服務器發出PORT N+1命令。服務器接收到命令後,會用其本地的FTP數據端口(通常是20)來連接客戶端指定的端口N+1,進行數據傳輸。在被

Spring Boot快速入門使用MyBatis註解形式進行數據庫操作

訪問 ins name ont clas assert xxx main apach 原文地址:https://lierabbit.cn/articles/7 添加依賴 新建項目選擇web,MyBatis,MySQL三個依賴 對於已存在的項目可以在bulid.gradle

python並發編程之多進程(二)互斥鎖同步鎖&進程其他屬性&進程間通信queue&生產者消費者模型

互斥 數據 socket pan copy src too 如果 搶票 一,互斥鎖,同步鎖 進程之間數據不共享,但是共享同一套文件系統,所以訪問同一個文件,或同一個打印終端,是沒有問題的, 競爭帶來的結果就是錯亂,如何控制,就是加鎖處理 part1:多個進程共享同

做題記錄P2024 食物鏈洛谷

節點 找到 find merge 如果 div clas spa blank P2024 食物鏈 /*思路:並查集,因為一開始我們並不知道每一只動物是哪一個種類的, 所以我們幹脆建立三倍於n的空間,1~n這三分之一用來存第i只動物是A 的情況,n+1~2n這三分之一用來存