前言:

這個星期很開心的利用了國外 FORTH 同好的程式碼,搞定了 gFORTH 跟 wiringPi 在 RaspberryPi 樹莓派上 GPIO 的控制 (請點此篇部落格文),初步測試控制 LED 點滅是完全沒有問題的。所以可以開始來做更複雜的測試囉!來測試一下 SPI 介面的控制吧。

SPI 介面的最佳控制範例就是拿來跟 MAX 7219 溝通囉! MAX7219 是個 8x8 LED 陣列,或是8顆 7段LED顯示器的控制器。它透過SPI介面來跟外界溝通。去年用 Arduino UNO 來用這個做了一個 8x8 LED陣列的迷你跑馬燈(請點此篇部落格文)。今年來做個一模一樣的東西吧,只是這次我們選用的平台從 Arduino UNO + C++ 來改成 RaspberryPi ZeroW + gFORTH 吧!順便我們也可以測試一下 gFORTH 跟 wiringPi 搭配之下,進一步的控制能耐囉。

 

SPI 介面簡介

SPI介面的全名是 Serial Peripheral Interface (序列周邊介面),最早是由 Motorola 公司所推出的一種同步全雙工序列介面,它允許兩個裝置之間以同步,全雙工,序列的方式進行高速數據通信。且速度較其他兩個常用的 UART,I2C 介面的速度還要快,所以廣泛的被使用在各種重視傳輸速度的電子裝置上,例如 SD記憶卡,佳能 Canon 相機的 EF接環,數位/類比轉換IC,液晶顯示器,... etc.

SPI 通訊的主軸如下圖所示,其實關鍵是兩的環狀的頭尾相連的8位元位移暫存器,在一個時脈內,頭尾互相交換資料。總共需要四個通訊接腳,定義如下:

MOSI (Master Output Slave Input): 主機往周邊發送訊號的訊號線

MISO (Master Input Slave Output): 周邊往主機發送訊號的訊號線

SS (Slave Select or Chip Select - CS): 周邊通訊選擇 (SPI 可以支援多重周邊通訊),用來指定要連線的週邊設備,邏輯假(Low) 代表選取,邏輯真(High) 代表未選。

SCLK (Serial Clock): 主機跟周邊兩邊交換資料時兩邊的時脈基準

700px-SPI_single_slave.svg.png

SPI01.png

 

以上是單一周邊的連接方式,多周邊的連接方式如下 (這時候 Master 需要針對每個 Slave 都要有一個 SS 周邊選擇致能控制)

600px-SPI_three_slaves.svg.png

特點:

1. 透過主從的方式支援多重周邊通訊:一台主機可以跟多台周邊對談交換資料。主機藉由對不同周邊的 SS 周邊選擇訊號線的致能,選擇所欲交談的對象。

2. 採用同步的方式來傳輸交換數據:主機須於 SCK 訊號線提供兩周邊對談所需的同步時脈訊號。因為採用時脈來同步雙方數據交換,所以雙方通訊的速度由此時脈訊號的速度來決定,理論上最大傳輸速度沒有限制,實際上可以達到 20 Mbit/sec 的高資料傳輸速率。

3. 全雙工的方式主機跟周邊同時交換資料:在一個時脈週期內, MOSI/MISO 兩條線同時對周邊跟主機交換資料。

 

 

8x8 LED 陣列模組 (使用 MAX7219)

這個迷你跑馬燈,主角是一個 8x8 的 LED 陣列。 這個 LED 陣列總共有 8x8 = 64 個數量龐大的 LED,要控制這麼多的 LED習慣上會採用專門設計的IC來控制。MAX7219 就是這樣的一個控制IC,被設計來控制驅動 8x8 的 LED陣列,或是8個七段顯示器。然後它採用 SPI 介面來跟外界溝通。

所以市面上很容易買到現成已經用 MAX7219 跟 8x8 LED 陣列製作好的模組,透過現成的模組,很方便就可以組成我們的迷你跑馬燈。而控制這種 8x8 LED陣列的主軸,自然轉向如何透過 SPI 通訊介面來跟 MAX7219 溝通!

底下是實際買到的模組

HipstamaticPhoto-560651276.409329.png

HipstamaticPhoto-560651295.243959.png

 

實際硬體接線

如下圖所示,很簡單的啦!不過要注意喲,再次溫馨提醒,RaspberryPi 的邏輯系統用的是 3.3V 的,且 GPIO 都沒有內部電流保護,電流過高,錯接 5V,或任何短路,就會燒毀這片貴貴的板子囉!

raspberry for 8x8 LED Matrix.png

 

實際照片

HipstamaticPhoto-569603666.103991.JPG

HipstamaticPhoto-569513595.606335.jpg

 

程式解說

 

GPIO 的控制

啟始一下 wiringPi

wiringPiSetup drop   ( setup and adopt wPi numbering system for pin)

要注意,這裡用的是 wiringPiSetup 這個函式來啟始,所以 pin 腳的編號採用 wPi 的命名系統。 pin 腳定義如下

(如果用 wiringPiSetupGpio 式來啟始, pin 腳的編號會變成 BCM 的命名系統. )

12 constant DATA   ( SPI MOSI)
14 constant CLOCK  ( SPI SCLK)
10 constant CS     ( CE0 enable)

wPi 12 = BCM 10 = 物理接腳 pin 19 (MOSI)

wPi 14 = BCM 11 = 物理接腳 pin 23 (SCLK)

wPi 10 = BCM 7 = 物理接腳 pin 24 (CE0)

 

三個主要跟 GPIO 控制的指令

: ->HIGH    ( pin --)  HIGH digitalWrite ;
: ->LOW     ( pin --)  LOW  digitalWrite ;
: WaitTrans ( pin --)  digitalRead drop ;

->HIGH 指令會讓接腳訊號變成 HIGH,所以  DATA ->HIGH 會讓 wPi 12 號接腳的 I/O 輸出轉為 HIGH. 反之 DATA ->LOW 會讓 wPi 12 號接腳的 I/O 輸出轉為 LOW

WaitTrans 其實是讀取的指令,這裏利用它來做等待。讀完時剛好讓 clock 的時脈週期結束,下一個 Transition 開始。

 

 

SPI 的通訊

 

MAX7219 SPI 協定:

MAX7219 的封包每次 16位元 (2 bytes),前 8位元是資料,給暫存器用。後 8位元是暫存器位址,暫存器位址的高位元組4位元未使用。

真實傳送時,須從暫存器位址先傳送,再傳送8位元暫存器資料

 

兩個主要跟 SPI 通訊的指令

ByteSend ( data --) 將八位元的資料,透過 SPI 送出去。送的順序是從高位元往低位元逐 bit 逐 bit 送。

Send ( data register --) 配合 MAX7219, 連送兩個八位元的資料。第一個送出去的是暫存器的位址。第二個送出去的是給暫存器的資料。

 

: ByteSend ( data --)
   8 0                        用個 do-loop 把 1byte 拆成8bits,總共做8次
   do   dup MASK and          用個 B10000000 的遮罩,取出八位元最左邊的 bit
        if    DATA ->HIGH     假如這個bit=1的話,讓 Data pin(MOSI)輸出 HIGH
        else  DATA ->LOW then 假如這個bit=0的話,讓 Data pin(MOSI)輸出 LOW

        CLOCK ->HIGH          剛剛DATA pin資料準備好了,SCLK變成 HIGH 通知對方吧
        1 LSHIFT              把傳送資料往左移一位,準備下一 bit 的傳送

        CLOCK WaitTrans       等一下SCLK,確定都OK囉
        CLOCK ->LOW           將 SCLK 變成 LOW 通知對方吧
   loop drop
;

: Send ( data register --)
   CS ->LOW          CS = Chip Select,LOW 表示通知對方,要跟你做 SPI 傳送了
   ByteSend          將 1 byte 大小的 register編號代碼傳送出去
   ByteSend          將 1 byte 大小的 data 資料傳送出去
   CS ->HIGH         Chip Select 設成 LOW,結束全部 SPI 傳送
   
   CS    WaitTrans   等待一下,確定 CS 訊號已改變
   CLOCK WaitTrans   等待一下,確定 SCLK 訊號已改變
;

 

Max7219 的控制

有了上面那兩個SPI傳送指令後,剩下一切就很簡單了! init7219 除了先啟始一下 DATA, CLOCK, CS 傳送埠外,然後透過SPI傳送指令傳送一堆控制設定給給7129

 

MAX7219 內部一共有14個八位元的暫存器,解說如下

MAX7219 暫存器
暫存器名稱 位址 (16進位) 用途
Digit 0 0x1 LED矩陣第1行內容
Digit 1 0x2 LED矩陣第2行內容
Digit 2 0x3 LED矩陣第3行內容
Digit 3 0x4 LED矩陣第4行內容
Digit 4 0x5 LED矩陣第5行內容
Digit 5 0x6 LED矩陣第6行內容
Digit 6 0x7 LED矩陣第7行內容
Digit 7 0x8 LED矩陣第8行內容
No-Op 0x0 未使用
Decode Mode 0x9 是否啟用BCD解碼 (七段顯示器 only)
Intensity 0xA LED 顯示亮度
Scan Limit 0xB 可顯示的 LED 陣列或七段顯示器的數目
Shutdown 0xC 關閉所有LED,但仍可接收資料
Display Test 0xF 顯示器測試模式開啟(讓所有LED全亮,目視測試誰壞了)

 

MAX7219 的運作方式很簡單,它會不斷的檢視這14個暫存器的內容,根據內容採取對應的控制動作。所以我們只要透過 SPI 介面,根據我們的需求,不斷更新這14個暫存器的內容就可以囉。

 

所以針對8x8 LED 螢幕更新部分,程式這邊定義了一個 8x8 大小的螢幕緩衝區 (8 bytes) ScreenBuffer 來跟 MAX7219 的 第1號到第8號 LED 點矩陣暫存器對應。 MAX7219 螢幕的顯示靠這8個暫存器。裡面有什麼值, 8x8 LED點矩陣就顯示什麼。

create ScreenBuffer 8 chars allot  

隨時呼叫 UpdateScreen 來維持 ScreenBuffer 內容對 MAX7219 的 第1號到第8號 LED 點矩陣暫存器內容的更新和同步。這樣,我們要的圖形就顯示出來囉

: UpdateScreen  \ update buffer data to 7219 
   8 0
   do  ScreenBuffer i chars + c@  準備 data 圖形資料
       i 1+                       準備 register 編號代碼 (1-8)
       Send                       透過 SPI 通訊送給 7219
   loop
;

 

螢幕捲動

螢幕捲動的邏輯很簡單, ScreenBuffer 螢幕緩衝區 (8 bytes) 裏頭的每一 byte 就是對應到8x8 LED點矩陣的一個垂直欄,所以把7個 bytes 往前搬,顯示的圖形就往左移一個垂直欄囉!最後一欄填入後面新加入的圖形資料,這樣就形成捲動的動作。

ScrollScreen 就是這樣捲動的指令,使用時需要跟它說,要捲動新的 8 bytes 的新的圖形資料放在哪個地方呢?然後它就拿這個資料捲進去 ScreenBuffer 囉!

 

: ScrollScreen ( P.addr --) \ P.addr is the address of your 8x8 picture
    8 0 
    do 
       利用 cmove 指令,將螢幕緩衝區的資料往左搬動(往左捲動)
       ScreenBuffer char+    ScreenBuffer   7   cmove
       
       螢幕緩衝區最後一個位置填入 P.addr 所指向的最新圖形資料直欄
       dup c@   ScreenBuffer 7 chars +     c!
         
       char+   將P.addr指向下一個圖形資料直欄
       
       UpdateScreen   PausedTime delay  透過SPI介面,更新給7219最新的圖形資料
       
    loop  drop        
;

 

字型表

就很簡單,create 一個 fonts 詞頭後,用 c, 依序 8 bytes 一組,照 asc code 的順序將字型編入記憶體。所以透過  asc-code * 8 chars + fonts-addr  的公式就可以存取到對應字型的開頭。

 

跟 FORTH 語言的串接

FORTH 有標準的螢幕輸出指令,例如 emit 來輸出一個字元,type 來輸出一個字串, ." 來編譯印出一串以引號定義出來的文字。

這裡仿效一樣的做法, ScrollChar 輸出捲動一個字元,Scrolling 來輸出捲動一個字串,Scrolling" 來編譯輸出捲動一串以引號定義出來的文字。這樣整個就可以跟 FORTH 語言緊密的結合在一起,不只是一個捲動程式而已,而是更有威力,解決問題,成為一個完整問題導向的語言。

 

捲動一個字元,為了彈性利用 'font 指標變數指向字型表的起始位置

: ScrollChar ( char --)   給 asc-code, 捲動對應字體
    0 max 127 min         限制一下,必須在 0-127之間
    8 chars *  'fonts  +  計算一下字型圖形資料在記憶體的位置
    ScrollScreen          捲動這 8 bytes 圖形資料的圖形
;

 

捲動一個 counted 字串,字串起始位址 addr,長度 n

: Scrolling ( addr n --)              字串位址,跟字串長度
    0 do dup i chars + c@ ScrollChar  用個do-loop取出字串裡面每個字元丟給ScrollChar去捲動
      loop drop
;

 

捲動一個 “ 引號所框定的文字

這個對 FORTH 初學者會比較複雜難懂些,因為要了解並控制改變 FORTH 編譯器的編譯過程。

: Scrolling"  ( " --)
   [char] " parse   先從字串緩衝區,掃瞄出"所分隔出的字串的位址跟長度
      
   state @  ( compile time?) 現在是在編譯狀態嗎?

   是的話就用 sliteral 把這個字串編譯進去,接續編譯Scrolling字串捲動指令
   if   postpone sliteral  postpone Scrolling

   不是的話就是在翻譯狀態,立刻執行Scrolling字串捲動指令
   else Scrolling then

; immediate  當然,要改變編譯器的編譯動作,所以這是立即詞(編譯器指令)

 

執行實況

簡單的一句 FORTH 執行碼美聲天后,海莉 Hayley Westenra 妹妹生日快樂!

: GO
   init7219
   begin    Scrolling" Happy Birthday Hayley Westenra"   again
;

 

 

這個影片犯了小小的低級錯誤!程式裡面利用變數 PausedTime 來控制捲動的速度,一般而言設定為 100 (100 millisecond, 0.1 sec) 捲動的速度最剛好!可是這個影片裡面感覺捲動的速度跑起來慢很多,覺得很納悶,感覺不像是 0.1秒的樣子。實際利用 FORTH 的交談性, dump 出變數內容後大吃一驚,奇怪怎麼是 256這個數字 (0.256 秒) ?難怪慢那麼多! (可是明明程式裡面的設定設的是 100 啊!) 

就這樣, Trouble-Shooting 了好久,最後終於發現,對厚,不是已經用 hex 改成 16進制了嗎,所以這個 0x100 = 256 囉! 應該設成 0x64 = 100 才對啦!  (暈...)

 

 

最後,完整原始程式列表

 

\
\  8x8 LED Matrix Scrolling Test
\
\   2019.1.19  Frank Lin
\


include wiringPi.fs


\ setup wiringPi

wiringPiSetup drop   ( setup and adopt wPi numbering system for pin)


\ digital I/O

: ->HIGH    ( pin --)  HIGH digitalWrite ;
: ->LOW     ( pin --)  LOW  digitalWrite ;
: WaitTrans ( pin --)  digitalRead drop ;


\
\ SPI communication
\

\ pin assignment

12 constant DATA   ( SPI MOSI)
14 constant CLOCK  ( SPI SCLK)
10 constant CS     ( CE0 enable)


hex

80 constant MASK

: ByteSend ( data --)
   8 0
   do   dup MASK and
        if    DATA ->HIGH
        else  DATA ->LOW   then

        CLOCK ->HIGH
        1 LSHIFT

        CLOCK WaitTrans
        CLOCK ->LOW
   loop drop
;

: Send ( data register --)
   CS ->LOW
   ByteSend
   ByteSend
   CS ->HIGH
   
   CS    WaitTrans
   CLOCK WaitTrans
;


\
\ MAX 7219 control
\

 

\ MAX 7219 registers


0 constant NO_OP
9 constant DECODE_MODE
A constant INTENSITY
B constant SCAN_LIMIT
C constant SHUTDOWN
F constant DISPLAY_TEST


: init7219
   DATA   OUTPUT pinMode
   CLOCK  OUTPUT pinMode
   CS     OUTPUT pinMode

   DATA  ->LOW
   CLOCK ->LOW
   CS    ->HIGH

   0      NO_OP        Send
   1      SHUTDOWN     Send
   0      DISPLAY_TEST Send
   1      INTENSITY    Send
   7      SCAN_LIMIT   Send
   0      DECODE_MODE  Send
;


\ screen buffer mapped to 7219 registers of 8x8 LED matrix

create ScreenBuffer 8 chars allot  

 64 value   PausedTime    \ control the speed of scrolling
  0 value  'fonts         \ pointer pointed to the address of the font data
  

: UpdateScreen  \ update buffer data to 7219 
   8 0
   do  ScreenBuffer i chars + c@
       i 1+
       Send
   loop
;


\ scrolling data inside screen buffer

: ScrollScreen ( P.addr --) \ P.addr is the address of your 8x8 picture
    8 0 
    do   ( P.addr)
       ( move one line forward inside screen buffer)
       ScreenBuffer char+    ScreenBuffer   7   cmove
       
       ( supply new data from P.addr to the end of screen buffer)
       dup c@   ScreenBuffer 7 chars +     c!
         
       char+  ( step P.addr)
       
       UpdateScreen   PausedTime delay  ( refresh 8x8 LED Matrix)
       
    loop  drop        
;


\ scroll a character

: ScrollChar ( char --)
    0 max 127 min         ( range check)
    8 chars *  'fonts  +  ( calc actual address of font)
    ScrollScreen
;


\
\  Syntax Examples:
\
\  S" Happy Birthday Hayley Westenra" Scrolling
\  Scrolling" Happy Birthday Hayley Westenra!"
\


\ scroll a counted string

: Scrolling ( addr n --)
    0 do dup i chars + c@ ScrollChar
      loop drop
;


\ scroll a string delimited by "

: Scrolling"  ( " --)
   [char] " parse 
      
   state @  ( compile time?)
   if   postpone sliteral  postpone Scrolling
   else Scrolling then
; immediate

 

\ Let's have some funs

: GO
   init7219
   begin    Scrolling" Happy Birthday Hayley Westenra"
   again
;

 

: p  1000 delay ;

: Hana
   init7219
   begin  
      S" Hana - Hayley Westenra "                Scrolling   p
      S" I see the river in the daylight "       Scrolling   p
      S" Glistening as it flows its way "        Scrolling   p
      S" I see the people travelling "           Scrolling   p
      S" Through the night and through the day " Scrolling   p
      S" I see their paths colliding "           Scrolling   p
      S" Water drops and golden rays "           Scrolling   p
      S" Flowers bloom, oh, flowers bloom "      Scrolling   p
      S" On this blessed day "                   Scrolling   p
      S" Let the tears fall back "               Scrolling   p
      S" Let the laughter through "              Scrolling   p
      S" One day, oh, one day "                  Scrolling   p
      S" The Flowers will reach full bloom "     Scrolling   p 
      p p p
   again
;

 

\ 127 fonts data for 8x8 LED Matrix
\ the order is as in ascii code

create fonts
   00 c, 00 c, 00 c, 00 c, 00 c, 00 c, 00 c, 00 c, \ 00
   7E c, 81 c, 95 c, B1 c, B1 c, 95 c, 81 c, 7E c, \ 01
   7E c, FF c, EB c, CF c, CF c, EB c, FF c, 7E c, \ 02
   0E c, 1F c, 3F c, 7E c, 3F c, 1F c, 0E c, 00 c, \ 03
   08 c, 1C c, 3E c, 7F c, 3E c, 1C c, 08 c, 00 c, \ 04
   18 c, BA c, FF c, FF c, FF c, BA c, 18 c, 00 c, \ 05
   10 c, B8 c, FC c, FF c, FC c, B8 c, 10 c, 00 c, \ 06
   00 c, 00 c, 18 c, 3C c, 3C c, 18 c, 00 c, 00 c, \ 07
   FF c, FF c, E7 c, C3 c, C3 c, E7 c, FF c, FF c, \ 08
   00 c, 3C c, 66 c, 42 c, 42 c, 66 c, 3C c, 00 c, \ 09
   FF c, C3 c, 99 c, BD c, BD c, 99 c, C3 c, FF c, \ 0A
   70 c, F8 c, 88 c, 88 c, FD c, 7F c, 07 c, 0F c, \ 0B
   00 c, 4E c, 5F c, F1 c, F1 c, 5F c, 4E c, 00 c, \ 0C
   C0 c, E0 c, FF c, 7F c, 05 c, 05 c, 07 c, 07 c, \ 0D
   C0 c, FF c, 7F c, 05 c, 05 c, 65 c, 7F c, 3F c, \ 0E
   99 c, 5A c, 3C c, E7 c, E7 c, 3C c, 5A c, 99 c, \ 0F
   7F c, 3E c, 3E c, 1C c, 1C c, 08 c, 08 c, 00 c, \ 10
   08 c, 08 c, 1C c, 1C c, 3E c, 3E c, 7F c, 00 c, \ 11
   00 c, 24 c, 66 c, FF c, FF c, 66 c, 24 c, 00 c, \ 12
   00 c, 5F c, 5F c, 00 c, 00 c, 5F c, 5F c, 00 c, \ 13
   06 c, 0F c, 09 c, 7F c, 7F c, 01 c, 7F c, 7F c, \ 14
   40 c, DA c, BF c, A5 c, FD c, 59 c, 03 c, 02 c, \ 15
   00 c, 70 c, 70 c, 70 c, 70 c, 70 c, 70 c, 00 c, \ 16
   80 c, 94 c, B6 c, FF c, FF c, B6 c, 94 c, 80 c, \ 17
   00 c, 04 c, 06 c, 7F c, 7F c, 06 c, 04 c, 00 c, \ 18
   00 c, 10 c, 30 c, 7F c, 7F c, 30 c, 10 c, 00 c, \ 19
   08 c, 08 c, 08 c, 2A c, 3E c, 1C c, 08 c, 00 c, \ 1A
   08 c, 1C c, 3E c, 2A c, 08 c, 08 c, 08 c, 00 c, \ 1B
   3C c, 3C c, 20 c, 20 c, 20 c, 20 c, 20 c, 00 c, \ 1C
   08 c, 1C c, 3E c, 08 c, 08 c, 3E c, 1C c, 08 c, \ 1D
   30 c, 38 c, 3C c, 3E c, 3E c, 3C c, 38 c, 30 c, \ 1E
   06 c, 0E c, 1E c, 3E c, 3E c, 1E c, 0E c, 06 c, \ 1F
   00 c, 00 c, 00 c, 00 c, 00 c, 00 c, 00 c, 00 c, \ ' '
   00 c, 06 c, 5F c, 5F c, 06 c, 00 c, 00 c, 00 c, \ '!'
   00 c, 07 c, 07 c, 00 c, 07 c, 07 c, 00 c, 00 c, \ '"'
   14 c, 7F c, 7F c, 14 c, 7F c, 7F c, 14 c, 00 c, \ '#'
   24 c, 2E c, 6B c, 6B c, 3A c, 12 c, 00 c, 00 c, \ '$'
   46 c, 66 c, 30 c, 18 c, 0C c, 66 c, 62 c, 00 c, \ '%'
   30 c, 7A c, 4F c, 5D c, 37 c, 7A c, 48 c, 00 c, \ '&'
   04 c, 07 c, 03 c, 00 c, 00 c, 00 c, 00 c, 00 c, \ '''
   00 c, 1C c, 3E c, 63 c, 41 c, 00 c, 00 c, 00 c, \ '('
   00 c, 41 c, 63 c, 3E c, 1C c, 00 c, 00 c, 00 c, \ ')'
   08 c, 2A c, 3E c, 1C c, 1C c, 3E c, 2A c, 08 c, \ '*'
   08 c, 08 c, 3E c, 3E c, 08 c, 08 c, 00 c, 00 c, \ '+'
   00 c, 80 c, E0 c, 60 c, 00 c, 00 c, 00 c, 00 c, \ ' c,'
   08 c, 08 c, 08 c, 08 c, 08 c, 08 c, 00 c, 00 c, \ '-'
   00 c, 00 c, 60 c, 60 c, 00 c, 00 c, 00 c, 00 c, \ '.'
   60 c, 30 c, 18 c, 0C c, 06 c, 03 c, 01 c, 00 c, \ '/'
   3E c, 7F c, 71 c, 59 c, 4D c, 7F c, 3E c, 00 c, \ '0'
   40 c, 42 c, 7F c, 7F c, 40 c, 40 c, 00 c, 00 c, \ '1'
   62 c, 73 c, 59 c, 49 c, 6F c, 66 c, 00 c, 00 c, \ '2'
   22 c, 63 c, 49 c, 49 c, 7F c, 36 c, 00 c, 00 c, \ '3'
   18 c, 1C c, 16 c, 53 c, 7F c, 7F c, 50 c, 00 c, \ '4'
   27 c, 67 c, 45 c, 45 c, 7D c, 39 c, 00 c, 00 c, \ '5'
   3C c, 7E c, 4B c, 49 c, 79 c, 30 c, 00 c, 00 c, \ '6'
   03 c, 03 c, 71 c, 79 c, 0F c, 07 c, 00 c, 00 c, \ '7'
   36 c, 7F c, 49 c, 49 c, 7F c, 36 c, 00 c, 00 c, \ '8'
   06 c, 4F c, 49 c, 69 c, 3F c, 1E c, 00 c, 00 c, \ '9'
   00 c, 00 c, 66 c, 66 c, 00 c, 00 c, 00 c, 00 c, \ ':'
   00 c, 80 c, E6 c, 66 c, 00 c, 00 c, 00 c, 00 c, \ ';'
   08 c, 1C c, 36 c, 63 c, 41 c, 00 c, 00 c, 00 c, \ '<'
   24 c, 24 c, 24 c, 24 c, 24 c, 24 c, 00 c, 00 c, \ '='
   00 c, 41 c, 63 c, 36 c, 1C c, 08 c, 00 c, 00 c, \ '>'
   02 c, 03 c, 51 c, 59 c, 0F c, 06 c, 00 c, 00 c, \ '?'
   3E c, 7F c, 41 c, 5D c, 5D c, 1F c, 1E c, 00 c, \ '@'
   7C c, 7E c, 13 c, 13 c, 7E c, 7C c, 00 c, 00 c, \ 'A'
   41 c, 7F c, 7F c, 49 c, 49 c, 7F c, 36 c, 00 c, \ 'B'
   1C c, 3E c, 63 c, 41 c, 41 c, 63 c, 22 c, 00 c, \ 'C'
   41 c, 7F c, 7F c, 41 c, 63 c, 3E c, 1C c, 00 c, \ 'D'
   41 c, 7F c, 7F c, 49 c, 5D c, 41 c, 63 c, 00 c, \ 'E'
   41 c, 7F c, 7F c, 49 c, 1D c, 01 c, 03 c, 00 c, \ 'F'
   1C c, 3E c, 63 c, 41 c, 51 c, 73 c, 72 c, 00 c, \ 'G'
   7F c, 7F c, 08 c, 08 c, 7F c, 7F c, 00 c, 00 c, \ 'H'
   00 c, 41 c, 7F c, 7F c, 41 c, 00 c, 00 c, 00 c, \ 'I'
   30 c, 70 c, 40 c, 41 c, 7F c, 3F c, 01 c, 00 c, \ 'J'
   41 c, 7F c, 7F c, 08 c, 1C c, 77 c, 63 c, 00 c, \ 'K'
   41 c, 7F c, 7F c, 41 c, 40 c, 60 c, 70 c, 00 c, \ 'L'
   7F c, 7F c, 0E c, 1C c, 0E c, 7F c, 7F c, 00 c, \ 'M'
   7F c, 7F c, 06 c, 0C c, 18 c, 7F c, 7F c, 00 c, \ 'N'
   1C c, 3E c, 63 c, 41 c, 63 c, 3E c, 1C c, 00 c, \ 'O'
   41 c, 7F c, 7F c, 49 c, 09 c, 0F c, 06 c, 00 c, \ 'P'
   1E c, 3F c, 21 c, 71 c, 7F c, 5E c, 00 c, 00 c, \ 'Q'
   41 c, 7F c, 7F c, 09 c, 19 c, 7F c, 66 c, 00 c, \ 'R'
   26 c, 6F c, 4D c, 59 c, 73 c, 32 c, 00 c, 00 c, \ 'S'
   03 c, 41 c, 7F c, 7F c, 41 c, 03 c, 00 c, 00 c, \ 'T'
   7F c, 7F c, 40 c, 40 c, 7F c, 7F c, 00 c, 00 c, \ 'U'
   1F c, 3F c, 60 c, 60 c, 3F c, 1F c, 00 c, 00 c, \ 'V'
   7F c, 7F c, 30 c, 18 c, 30 c, 7F c, 7F c, 00 c, \ 'W'
   43 c, 67 c, 3C c, 18 c, 3C c, 67 c, 43 c, 00 c, \ 'X'
   07 c, 4F c, 78 c, 78 c, 4F c, 07 c, 00 c, 00 c, \ 'Y'
   47 c, 63 c, 71 c, 59 c, 4D c, 67 c, 73 c, 00 c, \ 'Z'
   00 c, 7F c, 7F c, 41 c, 41 c, 00 c, 00 c, 00 c, \ '['
   01 c, 03 c, 06 c, 0C c, 18 c, 30 c, 60 c, 00 c, \ backslash
   00 c, 41 c, 41 c, 7F c, 7F c, 00 c, 00 c, 00 c, \ ']'
   08 c, 0C c, 06 c, 03 c, 06 c, 0C c, 08 c, 00 c, \ '^'
   80 c, 80 c, 80 c, 80 c, 80 c, 80 c, 80 c, 80 c, \ '_'
   00 c, 00 c, 03 c, 07 c, 04 c, 00 c, 00 c, 00 c, \ '`'
   20 c, 74 c, 54 c, 54 c, 3C c, 78 c, 40 c, 00 c, \ 'a'
   41 c, 7F c, 3F c, 48 c, 48 c, 78 c, 30 c, 00 c, \ 'b'
   38 c, 7C c, 44 c, 44 c, 6C c, 28 c, 00 c, 00 c, \ 'c'
   30 c, 78 c, 48 c, 49 c, 3F c, 7F c, 40 c, 00 c, \ 'd'
   38 c, 7C c, 54 c, 54 c, 5C c, 18 c, 00 c, 00 c, \ 'e'
   48 c, 7E c, 7F c, 49 c, 03 c, 02 c, 00 c, 00 c, \ 'f'
   98 c, BC c, A4 c, A4 c, F8 c, 7C c, 04 c, 00 c, \ 'g'
   41 c, 7F c, 7F c, 08 c, 04 c, 7C c, 78 c, 00 c, \ 'h'
   00 c, 44 c, 7D c, 7D c, 40 c, 00 c, 00 c, 00 c, \ 'i'
   60 c, E0 c, 80 c, 80 c, FD c, 7D c, 00 c, 00 c, \ 'j'
   41 c, 7F c, 7F c, 10 c, 38 c, 6C c, 44 c, 00 c, \ 'k'
   00 c, 41 c, 7F c, 7F c, 40 c, 00 c, 00 c, 00 c, \ 'l'
   7C c, 7C c, 18 c, 38 c, 1C c, 7C c, 78 c, 00 c, \ 'm'
   7C c, 7C c, 04 c, 04 c, 7C c, 78 c, 00 c, 00 c, \ 'n'
   38 c, 7C c, 44 c, 44 c, 7C c, 38 c, 00 c, 00 c, \ 'o'
   84 c, FC c, F8 c, A4 c, 24 c, 3C c, 18 c, 00 c, \ 'p'
   18 c, 3C c, 24 c, A4 c, F8 c, FC c, 84 c, 00 c, \ 'q'
   44 c, 7C c, 78 c, 4C c, 04 c, 1C c, 18 c, 00 c, \ 'r'
   48 c, 5C c, 54 c, 54 c, 74 c, 24 c, 00 c, 00 c, \ 's'
   00 c, 04 c, 3E c, 7F c, 44 c, 24 c, 00 c, 00 c, \ 't'
   3C c, 7C c, 40 c, 40 c, 3C c, 7C c, 40 c, 00 c, \ 'u'
   1C c, 3C c, 60 c, 60 c, 3C c, 1C c, 00 c, 00 c, \ 'v'
   3C c, 7C c, 70 c, 38 c, 70 c, 7C c, 3C c, 00 c, \ 'w'
   44 c, 6C c, 38 c, 10 c, 38 c, 6C c, 44 c, 00 c, \ 'x'
   9C c, BC c, A0 c, A0 c, FC c, 7C c, 00 c, 00 c, \ 'y'
   4C c, 64 c, 74 c, 5C c, 4C c, 64 c, 00 c, 00 c, \ 'z'
   08 c, 08 c, 3E c, 77 c, 41 c, 41 c, 00 c, 00 c, \ ''
   00 c, 00 c, 00 c, 77 c, 77 c, 00 c, 00 c, 00 c, \ '|'
   41 c, 41 c, 77 c, 3E c, 08 c, 08 c, 00 c, 00 c, \ ''
   02 c, 03 c, 01 c, 03 c, 02 c, 03 c, 01 c, 00 c, \ '~'

fonts to 'fonts

 

decimal

 

xxx

 

arrow
arrow
    創作者介紹
    創作者 ohiyooo2 的頭像
    ohiyooo2

    早安,苦命工程師的胡言亂語

    ohiyooo2 發表在 痞客邦 留言(0) 人氣()