前言:

ESP32 MCU 本身,本來就內建硬體 SPI (Serial Peripheral Interface) 介面的,要測試 SPI 硬體,最簡單就是拿來控制 MAX7219 配合上8x8的 LED陣列,來做個迷你跑馬燈的。

所以本來要這樣來弄一篇 ESP32FORTH 對 ESP32 的 SPI 硬體介面的使用範例的。但是不知道什麼原因,找了半天,我很驚訝 ESP32FORTH 官方並沒有把 SPI 的硬體控制指令給黏進來。這樣我們就無法直接很快的使用 ESP32 的 SPI 硬體囉。

不過,對於以 C 撰寫的 ESP32FORTH ,真的要黏其實是不困難。就 ESP32FORTH 的 Sketch 草稿檔,手動再加指令,再重新編譯過整個系統就可以囉。

但是,這篇暫時還不打算這樣用。其實 SPI 協定就是 Master 發出 Clock 訊號來控制雙方的位移暫存器的硬體來傳送資料的。在速度沒有說特別快的狀況下,例如控制 MAX7219 這個晶片的情況下,是可以直接用軟體發出 SPI 的訊號,來達到硬體SPI的功能的!

所以來一篇軟體 SPI Master 的實作吧,順便進一步熟悉跟測試 ESP32 GPIO 的能耐。我們來寫個間單的軟體 SPI 控制 MAX7219 上的 8x8 LED 矩陣,做個很簡單且療癒可愛的迷你跑馬燈。

 

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

 

實際硬體接線

如下圖所示,很簡單的啦!採用 3V3 3.3V 的電源供應。

不過要注意喲,再次溫馨提醒, 5V 旁邊那個腳位叫做 CMD,可不是 GND 哦!

錯接 GND 到這裡,可是會很精彩的喲!

 

IMG_0070.jpg

 

實際照片

IMG_9150.png

IMG_9152.png

IMG_9149.png

 

 

程式解說

 

GPIO 的控制

我們這個是 Software SPI,所以任何腳位都可以是 MOSI, SCLK 跟 Enable,基本上沒有限制。

這裡選 Pin32 當 MOSI, Pin33 當 CS, Pin25 當 CLOCK,是筆者隨機選的,沒有特別考量。

 

32 constant DATA   ( SPI MOSI)
33 constant CS     ( SPI Enable)
25 constant CLOCK  ( SPI SCLK)

 

三個主要跟 GPIO 控制的指令

改寫一下 digitalWrite 指令,沒特別考量,只是筆者比較習慣 ->High, ->Low 這樣的形式

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

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

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

 

 

Software SPI 的通訊實作

 

MAX7219 SPI 協定:

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

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

 

兩個主要跟 Software 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 來輸出捲動一個字串。

 

捲動一個字元,為了彈性利用 '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
;

 

 

執行實況

鍵入 Hana,迷你跑馬燈就開始運作囉。

開始捲動筆者最喜歡的紐西蘭歌手,海莉,的 Hana (花心) 歌詞。放在書房,看海莉的歌詞捲阿捲的,非常的療癒。

 

 

 

原始程式碼列表

\
\  ESP32FORTH mini Banner 
\    Frank Lin 2022.07.03
\


: chars    ; immediate
: char+ 1+ ;
: delay ms ;

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

32 constant DATA   ( SPI MOSI)
33 constant CS     ( SPI Enable)
25 constant CLOCK  ( SPI SCLK)

 

\
\ software SPI
\

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"
\


\ scrolling a counted string

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


\ scrolling a text

: Scrolling" ( "text" --)
    state @
    if    postpone S"  postpone Scrolling
    else  [char] " parse Scrolling    then
; immediate

 

\ Let's have some funs


: 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 發表在 痞客邦 留言(0) 人氣()