ทำป้ายตัวอักษรวิ่งด้วย LED Dot Matrix 16×16 โดยส่งข้อมูลผ่าน Serial Communication

ทำป้ายตัวอักษรวิ่งด้วย LED Dot Matrix 16×16 โดยส่งข้อมูลผ่าน Serial Communication 

01

   การควบคุมหลอดไฟ LED Matrix (Dot Matrix) ขนาดต่างๆ เช่น 8×8, 8×16, 8×32, 16×16, 16×32 เป็นต้น เป็นอีกหนึ่งอุปกรณ์ที่สามารถใช้ในการฝึกเขียนโปรแกรมไมโครคอนโทรลเลอร์ โดยปกติการเขียนโปรแกรมควบคุม LED Matrix 8×8 ต้องใช้ขาสัญญาณทั้งหมด 16 ขาด้วยกันแบ่งออกเป็น 8 ขาสัญญาณในแนวนอน (Rows) และ 8 ขาสัญญาณในแนวตั้ง (Columns) แต่ในปัจจุบันมีการพัฒนาโดยนำ IC เข้ามาต่อเพิ่ม เพื่อลดจำนวนขาที่ใช้ในการต่อหรือการควบคุมให้น้อยลงและเขียนโปรแกรมให้ง่ายขึ้น IC นี้คือ 74HC595 8-bit Shift Register จำนวน 2 ตัว เพื่อให้ได้ครบ 16 บิต

          ในบทความนี้เราจะใช้ 16×16 Dot Matrix Module (EFDV344) ซึ่งเป็นเบอร์ด LED Matrix ขนาด 16×16 ซึ่งโดยปกติจะใช้ขาสัญญาณในการควบคุมจำนวนมาก แต่บอร์ดนี้มาพร้อมกับ 74HC595 8-bit shift register จำนวน 2 ตัว ในการควบคุมแถวแนวตั้ง(Columns) และ 74HC138 3-8 line De-multiplexer จำนวน 2 ตัว ในการควบคุมแถวในแนวนอน (Rows) เพื่อลดจำนวนขาสัญญาณในการใช้งานลง เหลือเพียง 8 ขาสัญญาณ

          โมดูล 16×16 Dot Matrix Module (EFDV344) ประกอบด้วย 74HC595 2 ตัว 74HC138 2 ตัว และ LED Dot Matrix 8×84 ตัว ขนาด 65 x 107 x 10 มม. หลอด LED ขนาด 3 มม. ทั้งหมด 256 ดวง โมดูลใช้ไฟ 5VDC ควบคุมโดยการกำหนดค่าทางลอจิกให้แต่ละขา และเลื่อนบิตตามสัญญาณ CLK เข้าที่ละบิตจนครบตามจำนวนที่ต้องการ

02

รูปแสดงโมดูล 16×16 Dot Matrix Module (EFDV344)

03

จากรูปด้านบน DIN คือ Pin สำหรับเชื่อมต่อกับ MCU หรือโมดูลก่อนหน้า Data In (สัญญาณเข้า CN1-in), VIN คือ Pin สำหรับไฟ 5VDC และ GND ของโมดูล(CN4), DO คือ Pin สำหรับเชื่อมต่อไปยังโมดูลถัดไปในกรณีเชื่อมต่อหลายโมดูลเข้าด้วยกัน Data Out (สัญญาณออก CN2-out), VO สำหรับไฟออกให้กับโมดูลถัดไปในกรณีเชื่อมต่อหลายโมดูล

          การต่อใช้งานให้ต่อสัญญาณเข้าทางด้าน CN1-in และ +5VDC, GND โดยมีขาสัญญาณตามตารางดังนี้

04

หลักการทำงาน

          74HC595 เป็นตัวเลื่อนบิตขนาด 8 บิต (8-bit Shift Register) โดยรับข้อมูลเข้าและส่งออกที่ละบิต (Serial-In & Serial-Out) และมีเอาต์พุตแบบ 8 บิต (Parallel Data Output) ถ้าต้องการจะส่งข้อมูลไปกำหนดสถานะลอจิกให้ขาเอาต์พุตทั้ง 8 ขา (Q0…Q7) จะต้องใช้วิธีเลื่อนบิตทีละบิตเข้าทางอินพุต DS และสร้างสัญญาณ Clock ป้อนเข้าที่ขา SHCP เพื่อกำหนดจังหวะในการทำงานและสามารถเลือกใช้ความถี่ของสัญญาณอินพุต SHCP ได้เกินกว่า 10 MHz การเลื่อนบิตหนึ่งครั้ง ดังนั้นจึงต้องใช้ทั้งหมด 8 ไซเคิล ถ้าเลื่อนมากกว่า 8 ไซเคิล ข้อมูลในรีจิสเตอร์จะถูกส่งออกตามลำดับที่ขา Q7S

          การเลื่อนบิตเพื่อส่งข้อมูลจะส่งแบบ MSB First เมื่อข้อมูลถูกนำไปใส่ไว้ในรีจิสเตอร์ภายในจนครบ 8 บิตแล้ว และต้องการให้ขาเอาต์พุต Q0..Q7 มีสถานะลอจิกตรงตามข้อมูลในรีจิสเตอร์ จะต้องสร้างสัญญาณแบบ Pulse เข้าที่ขา STCP (Storage Clock Input) และต้องกำหนดขาอินพุตที่ขา OE (Output Enable) ให้เป็นลอจิก LOW ถ้าต้องการจะเคลียร์ข้อมูลในรีจิสเตอร์ ให้ป้อนอินพุตที่ขา MR (Master Reset) เป็น LOW แล้วจึงเปลี่ยนเป็น HIGH

05

รูปแสดงขาทั้งหมดของไอซี 74CH595

06

รูปแสดงตำแหน่งขาของ 74CH595 ตัวถังแบบ PDIP-16

ศึกษาข้อมูลเพิ่มเติม Datasheet 74CH595 

การเชื่อมต่อ LED Dot Matrix ร่วมกับ Arduino (Arduino Sketch)

08

          การส่งข้อมูลให้โมดูล 16×16 LED matrix driver จะใช้วิธีเลื่อนบิตซึ่งมีรูปแบบเหมือนการส่งข้อมูลผ่านบัสแบบ SPI และการกำหนดสถานะ “ติด” หรือ “ดับ” ของ LED จะทำทีละแถวแนวนอนเว้นระยะเวลาสั้นๆ โดยเลือกทีละแถวแนวนอน (row) ไปตามลำดับแล้ววนซ้ำให้เลือกแถวแนวนอนทีละแถว และส่งข้อมูล 8 บิต ไปยังไอซี 74HC595 ตัวแรก (มีเพียงบิตเดียวที่เป็น 1 ซึ่งตรงกับ row ในขณะนั้น) และกำหนดค่า 8 บิต สำหรับแถวแนวนอนที่ได้เลือกโดยส่งข้อมูลไปยังไอซี 74HC595 ตัวที่สอง ถ้าจะให้ LED ตรงคอลัมน์ใด “ติด” จะต้องใช้ไอซี 74HC138 กำหนดค่าโดยให้เป็น 0 (LOW) ไปยังแถวที่ต้องการให้ทำงาน 

Click Download >> Example Code : LED Dot Matrix 16×16 

ตัวอย่างโค้ดโปรแกรม 

#include <Arduino.h>
#include <avr/pgmspace.h>

#include <SPI.h>
const byte STCP_PIN = 7;     // Latch
const byte DS_PIN   = 11;    // Data In
const byte SHCP_PIN = 13;    // CLK

#define LEDARRAY_D 2         // ขาที่ใช้ในการควบคุมแถวแนวนอน
#define LEDARRAY_C 3         // ขาที่ใช้ในการควบคุมแถวแนวนอน
#define LEDARRAY_B 4         // ขาที่ใช้ในการควบคุมแถวแนวนอน
#define LEDARRAY_A 5	     // ขาที่ใช้ในการควบคุมแถวแนวนอน
#define LEDARRAY_G 6	     // ขาที่ใช้ในการควบคุมการส่งข้อมูล ขา EN

#define runs 1000 // ยิ่งน้อย = Fast : ยิ่งมาก = Slow

#define Display_Num_Word 7 //จำนวนโมดูลที่ใช้นการต่อ
unsigned char Display_Buffer[Display_Num_Word*2];
unsigned char Display_Swap_Buffer[Display_Num_Word][32];
bool Shift_Bit = 0;
bool Flag_Shift = 0;
unsigned int Timer0_Count = 0;
unsigned char temp = 0x80;
unsigned int Shift_Count = 0;
unsigned int Display_Word_Count = 0;
unsigned char Message_index = 0;
unsigned char serial_pos[100] = {10,10,10,10,10}; //ข้อมูลเริ่มต้อนการทำงาน
unsigned char serial_index = 5;

view rawLED_Dot_Matrix_16x16.ino hosted with ❤ by GitHub

          ในส่วนแรกเป็นส่วนที่ใช้ในการกำหนดขาที่ใช้เชื่อมต่อ Arduino SPI และ Library ของ AVR PROGMEM ที่ใช้ในการเก็บข้อมูลจำนวนมากลงใน Memory เพราะ RAM ไม่พอในการเก็บข้อมูลจึงจำเป็นจะต้องเรียกใช้ Library ของ avr/pgmspace.h ในการใช้งาน

#define Num_Of_Word 100 
PROGMEM const unsigned char Word[Num_Of_Word][32] =
{
    0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
    0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, //Spec
    0XFF,0XC3,0XC3,0XC3,0XC3,0XC3,0XE7,0XE7,0XE7,0XE7,0XE7,0XE7,0XFF,0XE7,0XE7,0XFF,
    0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, //!
    0XFF,0XCE,0XE7,0XF3,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
    0XFF,0X7F,0X3F,0X9F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, //"
    0XFF,0XF3,0XF3,0XC0,0XC0,0XF3,0XF3,0XF3,0XF3,0XF3,0XF3,0XC0,0XC0,0XF3,0XF3,0XFF,
    0XFF,0XCF,0XCF,0X03,0X03,0XCF,0XCF,0XCF,0XCF,0XCF,0XCF,0X03,0X03,0XCF,0XCF,0XFF, //#
    0XFF,0XFC,0XF0,0XE0,0XC4,0XCC,0XC4,0XE0,0XE0,0XFC,0XFC,0XCC,0XC0,0XE0,0XFC,0XFF,
    0XFF,0XFF,0X1F,0X0F,0XCF,0XFF,0XFF,0X1F,0X0F,0X8F,0XCF,0X8F,0X1F,0X3F,0XFF,0XFF, //$
    0XFF,0XFF,0XFF,0XF3,0XF3,0XFF,0XFE,0XFC,0XF8,0XF1,0XE3,0XC7,0XCF,0XDF,0XFF,0XFF,
    0XFF,0XF7,0XE7,0XC7,0X8F,0X1F,0X3F,0X7F,0XFF,0XCF,0XCF,0XFF,0XFF,0XFF,0XFF,0XFF, //%
    0XFF,0XF0,0XE7,0XEF,0XE7,0XF3,0XF8,0XF0,0XE0,0XC7,0XCF,0XCF,0XC7,0XC0,0XE0,0XFF,
    0XFF,0X3F,0X8F,0XCF,0X8F,0X9F,0X3F,0X7F,0X3B,0X93,0XC7,0XC7,0X93,0X3B,0X7F,0XFF, //&
    0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
    0XFF,0XCF,0XE7,0XF3,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, //'
    0XFF,0XF3,0XE7,0XCF,0X9F,0X9F,0X9F,0X9F,0X9F,0X9F,0X9F,0X9F,0XCF,0XE7,0XF3,0XFF,
    0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, //(
    0XFF,0XCF,0XE7,0XF3,0XF9,0XF9,0XF9,0XF9,0XF9,0XF9,0XF9,0XF9,0XF3,0XE7,0XCF,0XFF,
    0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, //)
    0XFF,0XDE,0XCE,0XE6,0XF2,0XF8,0XFC,0XC0,0XC0,0XFC,0XF8,0XF2,0XE6,0XCE,0XDE,0XFF,
    0XFF,0X7B,0X73,0X67,0X4F,0X1F,0X3F,0X03,0X03,0X3F,0X1F,0X4F,0X67,0X73,0X7B,0XFF, //*
    0XFF,0XFE,0XFE,0XFE,0XFE,0XFE,0XFE,0XC0,0XC0,0XFE,0XFE,0XFE,0XFE,0XFE,0XFE,0XFF,
    0XFF,0X7F,0X7F,0X7F,0X7F,0X7F,0X7F,0X03,0X03,0X7F,0X7F,0X7F,0X7F,0X7F,0X7F,0XFF, //+
    0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF9,0XF3,0XE7,0XFF,
    0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, //,
    0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0,0XC0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
    0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X03,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, //-
    0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0XFC,0XFC,0XFF,
    0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X3F,0X3F,0X3F,0XFF, //.
    0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
    0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, ///
    0XFF,0XF0,0XE0,0XE7,0XCF,0XCF,0XCF,0XCF,0XCF,0XCF,0XCF,0XCF,0XC7,0XE0,0XF0,0XFF,
    0XFF,0X7F,0X3F,0X3F,0X9F,0X9F,0X9F,0X9F,0X9F,0X9F,0X9F,0X9F,0X1F,0X3F,0X7F,0XFF, //0
    0XFF,0XFC,0XF8,0XF0,0XE4,0XCC,0XDC,0XFC,0XFC,0XFC,0XFC,0XFC,0XFC,0XFC,0XFC,0XFF,
    0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, //1
    0XFF,0XF0,0XE0,0XE7,0XCF,0XCF,0XFF,0XFF,0XFE,0XFC,0XF9,0XF3,0XE7,0XC0,0XC0,0XFF,
    0XFF,0X7F,0X3F,0X9F,0X9F,0X9F,0X9F,0X3F,0X7F,0XFF,0XFF,0XFF,0XFF,0X1F,0X1F,0XFF, //2
    0XFF,0XF0,0XE0,0XC7,0XCF,0XFF,0XF8,0XF8,0XFF,0XFF,0XFF,0XCF,0XC7,0XE0,0XF0,0XFF,
    0XFF,0X7F,0X3F,0X1F,0X9F,0X3F,0X7F,0X3F,0X1F,0X9F,0X9F,0X9F,0X1F,0X3F,0X7F,0XFF, //3
    0XFF,0XFF,0XFE,0XFC,0XF8,0XF1,0XE3,0XC7,0XCF,0XCF,0XC0,0XC0,0XFF,0XFF,0XFF,0XFF,
    0XFF,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X0F,0X0F,0X3F,0X3F,0X3F,0XFF, //4
    0XFF,0XC0,0XC0,0XCF,0XCF,0XCF,0XC0,0XC0,0XCF,0XFF,0XFF,0XCF,0XC7,0XE0,0XF0,0XFF,
    0XFF,0X1F,0X1F,0XFF,0XFF,0XFF,0X7F,0X3F,0X1F,0X9F,0X9F,0X9F,0X1F,0X3F,0X7F,0XFF, //5
    0XFF,0XF0,0XE0,0XC7,0XCF,0XCF,0XC8,0XC0,0XC7,0XCF,0XCF,0XCF,0XC7,0XE0,0XF0,0XFF,
    0XFF,0X7F,0X3F,0X1F,0X9F,0XFF,0X7F,0X3F,0X1F,0X9F,0X9F,0X9F,0X1F,0X3F,0X7F,0XFF, //6
    0XFF,0XC0,0XC0,0XFF,0XFE,0XFE,0XFC,0XFC,0XF9,0XF9,0XF3,0XF3,0XF3,0XF3,0XF3,0XFF,
    0XFF,0X1F,0X1F,0X3F,0X7F,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, //7
    0XFF,0XF0,0XE0,0XC7,0XCF,0XC7,0XE0,0XE0,0XC7,0XCF,0XCF,0XCF,0XC7,0XE0,0XF0,0XFF,
    0XFF,0X7F,0X3F,0X1F,0X9F,0X1F,0X3F,0X3F,0X1F,0X9F,0X9F,0X9F,0X1F,0X3F,0X7F,0XFF, //8
    0XFF,0XF0,0XE0,0XC7,0XCF,0XCF,0XCF,0XC7,0XE0,0XF0,0XFF,0XCF,0XC7,0XE0,0XF0,0XFF,
    0XFF,0X7F,0X3F,0X1F,0X9F,0X9F,0X9F,0X1F,0X1F,0X9F,0X9F,0X1F,0X3F,0X3F,0X7F,0XFF, //9
    0XFF,0XFC,0XFC,0XFC,0XFC,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0XFC,0XFC,0XFC,0XFF,
    0XFF,0X3F,0X3F,0X3F,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X3F,0X3F,0X3F,0X3F,0XFF, //:
    0XFF,0XFC,0XFC,0XFC,0XFC,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0XFC,0XFD,0XFF,
    0XFF,0X3F,0X3F,0X3F,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XBF,0X3F,0X7F,0XFF,0XFF,0XFF, //;
    0XFF,0XFF,0XFF,0XFF,0XFE,0XFC,0XF9,0XF3,0XF3,0XF9,0XFC,0XFE,0XFF,0XFF,0XFF,0XFF,
    0XFF,0XCF,0X9F,0X3F,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7F,0X3F,0X9F,0XCF,0XFF, //<
    0XFF,0XFF,0XFF,0XFF,0XF0,0XF0,0XFF,0XFF,0XFF,0XFF,0XF0,0XF0,0XFF,0XFF,0XFF,0XFF,
    0XFF,0XFF,0XFF,0XFF,0X07,0X07,0XFF,0XFF,0XFF,0XFF,0X07,0X07,0XFF,0XFF,0XFF,0XFF, //=
    0XFF,0XF3,0XF9,0XFC,0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0XFC,0XF9,0XF3,0XFF,
    0XFF,0XFF,0XFF,0XFF,0X7F,0X3F,0X9F,0XCF,0XCF,0X9F,0X3F,0X7F,0XFF,0XFF,0XFF,0XFF, //>
    0XFF,0XF0,0XE0,0XE3,0XE7,0XE3,0XF3,0XFF,0XFE,0XFE,0XFE,0XFE,0XFF,0XFE,0XFE,0XFF,
    0XFF,0X3F,0X1F,0X8F,0XCF,0XCF,0X8F,0X1F,0X3F,0X7F,0X7F,0X7F,0XFF,0X7F,0X7F,0XFF, //?
    0XF8,0XE0,0XC7,0X9F,0X38,0X30,0X23,0X27,0X27,0X27,0X23,0X20,0X30,0X1F,0X80,0XFF,
    0X1F,0X07,0XE1,0XFC,0X4C,0X0C,0X8C,0XCC,0XCC,0XCC,0X88,0X01,0X47,0XFF,0X07,0XFF, //@
    0XFF,0XFC,0XF8,0XF8,0XF1,0XF1,0XF3,0XE3,0XE0,0XE0,0XE0,0XE3,0XC7,0XC7,0XC7,0XFF,
    0XFF,0X3F,0X1F,0X1F,0X8F,0X8F,0XCF,0XC7,0X07,0X07,0X07,0XC7,0XE3,0XE3,0XE3,0XFF, //A
    0XFF,0XC0,0XC0,0XC0,0XC7,0XC7,0XC0,0XC0,0XC0,0XC0,0XC7,0XC7,0XC0,0XC0,0XC0,0XFF,
    0XFF,0X0F,0X07,0X03,0XE3,0XE3,0X07,0X0F,0X0F,0X07,0XE3,0XE3,0X03,0X07,0X0F,0XFF, //B
    0XFF,0XF8,0XF0,0XE0,0XE1,0XC3,0XC7,0XC7,0XC7,0XC7,0XC3,0XE1,0XE0,0XF0,0XF8,0XFF,
    0XFF,0X0F,0X07,0X03,0XC3,0XE3,0XFF,0XFF,0XFF,0XFF,0XE3,0XC3,0X03,0X07,0X0F,0XFF, //C
    0XFF,0XC0,0XC0,0XC0,0XC7,0XC7,0XC7,0XC7,0XC7,0XC7,0XC7,0XC7,0XC0,0XC0,0XC0,0XFF,
    0XFF,0X1F,0X0F,0X07,0XC7,0XE3,0XE3,0XE3,0XE3,0XE3,0XE3,0XC7,0X07,0X0F,0X1F,0XFF, //D
    0XFF,0XC0,0XC0,0XC0,0XC7,0XC7,0XC7,0XC0,0XC0,0XC0,0XC7,0XC7,0XC0,0XC0,0XC0,0XFF,
    0XFF,0X03,0X03,0X03,0XFF,0XFF,0XFF,0X07,0X07,0X07,0XFF,0XFF,0X03,0X03,0X03,0XFF, //E
    0XFF,0XC0,0XC0,0XC0,0XC7,0XC7,0XC7,0XC0,0XC0,0XC0,0XC7,0XC7,0XC7,0XC7,0XC7,0XFF,
    0XFF,0X03,0X03,0X03,0XFF,0XFF,0XFF,0X0F,0X0F,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, //F
    0XFF,0XFC,0XF0,0XE0,0XE3,0XC7,0XC7,0XC7,0XC7,0XC7,0XC7,0XE3,0XE0,0XF0,0XFC,0XFF,
    0XFF,0X0F,0X07,0X03,0XE3,0XFF,0XFF,0X03,0X03,0X03,0XE3,0XE3,0X03,0X07,0X0F,0XFF, //G
    0XFF,0XC7,0XC7,0XC7,0XC7,0XC7,0XC7,0XC0,0XC0,0XC0,0XC7,0XC7,0XC7,0XC7,0XC7,0XFF,
    0XFF,0XE3,0XE3,0XE3,0XE3,0XE3,0XE3,0X03,0X03,0X03,0XE3,0XE3,0XE3,0XE3,0XE3,0XFF, //H
    0XFF,0XC0,0XC0,0XC0,0XFC,0XFC,0XFC,0XFC,0XFC,0XFC,0XFC,0XFC,0XC0,0XC0,0XC0,0XFF,
    0XFF,0X03,0X03,0X03,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X03,0X03,0X03,0XFF, //I
    0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC7,0XC7,0XC3,0XE0,0XE0,0XF0,0XFF,
    0XFF,0XE3,0XE3,0XE3,0XE3,0XE3,0XE3,0XE3,0XE3,0XE3,0XC3,0X87,0X07,0X0F,0X1F,0XFF, //J
    0XFF,0XC7,0XC7,0XC7,0XC7,0XC6,0XC0,0XC0,0XC0,0XC0,0XC6,0XC7,0XC7,0XC7,0XC7,0XFF,
    0XFF,0XF3,0XE3,0XC7,0X8F,0X1F,0X3F,0X7F,0X7F,0X3F,0X1F,0X8F,0XC7,0XE3,0XF3,0XFF, //K
    0XFF,0XC7,0XC7,0XC7,0XC7,0XC7,0XC7,0XC7,0XC7,0XC7,0XC7,0XC7,0XC0,0XC0,0XC0,0XFF,
    0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X03,0X03,0X03,0XFF, //L
    0XFF,0XC7,0XC7,0XC7,0XC3,0XC3,0XC3,0XC1,0XC1,0XC1,0XC4,0XC4,0XC4,0XC6,0XC6,0XFF,
    0XFF,0XE3,0XE3,0XE3,0XC3,0XC3,0XC3,0X83,0X83,0X83,0X23,0X23,0X23,0X63,0X63,0XFF, //M
    0XFF,0XC7,0XC7,0XC3,0XC1,0XC0,0XC0,0XC0,0XC4,0XC6,0XC7,0XC7,0XC7,0XC7,0XC7,0XFF,
    0XFF,0XE3,0XE3,0XE3,0XE3,0XE3,0X63,0X23,0X03,0X03,0X03,0X83,0XC3,0XE3,0XE3,0XFF, //N
    0XFF,0XFC,0XF0,0XE0,0XE3,0XC7,0XC7,0XC7,0XC7,0XC7,0XC7,0XE3,0XE0,0XF0,0XFC,0XFF,
    0XFF,0X3F,0X0F,0X07,0XC7,0XE3,0XE3,0XE3,0XE3,0XE3,0XE3,0XC7,0X07,0X0F,0X3F,0XFF, //O
    0XFF,0XC0,0XC0,0XC0,0XC7,0XC7,0XC7,0XC0,0XC0,0XC0,0XC7,0XC7,0XC7,0XC7,0XC7,0XFF,
    0XFF,0X0F,0X07,0X03,0XE3,0XF3,0XE3,0X03,0X07,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, //P
    0XFF,0XFC,0XF0,0XE0,0XC3,0XC7,0XC7,0XC7,0XC7,0XC6,0XC7,0XE3,0XE0,0XF0,0XFC,0XFF,
    0XFF,0X3F,0X0F,0X07,0XC3,0XE3,0XE3,0XE3,0XE3,0X23,0X23,0X87,0X0F,0X03,0X33,0XFF, //Q
    0XFF,0XC0,0XC0,0XC0,0XC7,0XC7,0XC7,0XC0,0XC0,0XC0,0XC7,0XC7,0XC7,0XC7,0XC7,0XFF,
    0XFF,0X0F,0X07,0X03,0XC3,0XE3,0XC7,0X0F,0X1F,0X1F,0X8F,0X8F,0XC7,0XE3,0XF3,0XFF, //R
    0XFF,0XF8,0XE0,0XC0,0XC7,0XCF,0XC7,0XE0,0XF0,0XF8,0XCF,0XC7,0XC0,0XE0,0XF8,0XFF,
    0XFF,0X1F,0X07,0X03,0XE3,0XF3,0XFF,0X0F,0X07,0X03,0XF3,0XE3,0X03,0X07,0X1F,0XFF, //S
    0XFF,0XC0,0XC0,0XC0,0XFC,0XFC,0XFC,0XFC,0XFC,0XFC,0XFC,0XFC,0XFC,0XFC,0XFC,0XFF,
    0XFF,0X03,0X03,0X03,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0XFF, //T
    0XFF,0XC7,0XC7,0XC7,0XC7,0XC7,0XC7,0XC7,0XC7,0XC7,0XC7,0XC3,0XE0,0XF0,0XF8,0XFF,
    0XFF,0XE3,0XE3,0XE3,0XE3,0XE3,0XE3,0XE3,0XE3,0XE3,0XE3,0XC3,0X07,0X0F,0X1F,0XFF, //U
    0XFF,0XC7,0XC7,0XE3,0XE3,0XE3,0XF1,0XF1,0XF9,0XF9,0XF8,0XFC,0XFC,0XFC,0XFE,0XFF,
    0XFF,0XE3,0XE3,0XC7,0XC7,0XC7,0X8F,0X8F,0X9F,0X9F,0X1F,0X3F,0X3F,0X3F,0X7F,0XFF, //V
    0XFF,0XC6,0XC6,0XC6,0XC4,0XC4,0XC0,0XC0,0XC0,0XC1,0XC1,0XC3,0XC3,0XC7,0XC7,0XFF,
    0XFF,0X63,0X63,0X63,0X23,0X23,0X03,0X03,0X03,0X83,0X83,0XC3,0XC3,0XE3,0XE3,0XFF, //W
    0XFF,0XC7,0XC7,0XE3,0XE3,0XF1,0XF0,0XFC,0XFC,0XF1,0XF1,0XE3,0XE3,0XC7,0XC7,0XFF,
    0XFF,0XE3,0XE3,0XC7,0XC7,0X8F,0X0F,0X3F,0X3F,0X8F,0X8F,0XC7,0XC7,0XE3,0XE3,0XFF, //X
    0XFF,0XC7,0XC7,0XC7,0XE3,0XF1,0XF9,0XF8,0XFC,0XFC,0XFC,0XFC,0XFC,0XFC,0XFC,0XFF,
    0XFF,0XE3,0XE3,0XE3,0XC7,0X8F,0X9F,0X1F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0XFF, //Y
    0XFF,0XC0,0XC0,0XC0,0XFF,0XFF,0XFF,0XFE,0XFC,0XF8,0XF0,0XE1,0XC0,0XC0,0XC0,0XFF,
    0XFF,0X03,0X03,0X03,0XC3,0X87,0X0F,0X1F,0X3F,0X7F,0XFF,0XFF,0X03,0X03,0X03,0XFF, //Z
    0XFF,0XF0,0XF0,0XF3,0XF3,0XF3,0XF3,0XF3,0XF3,0XF3,0XF3,0XF3,0XF3,0XF0,0XF0,0XFF,
    0XFF,0X1F,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X1F,0X1F,0XFF, //[
    0XFF,0XDF,0XCF,0XE7,0XF3,0XF9,0XFC,0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
    0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7F,0X3F,0X9F,0XCF,0XE7,0XF3,0XFB,0XFF,0XFF, //\
    0XFF,0XF8,0XF8,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0XF8,0XFF,
    0XFF,0X0F,0X0F,0XCF,0XCF,0XCF,0XCF,0XCF,0XCF,0XCF,0XCF,0XCF,0XCF,0X0F,0X0F,0XFF, //]
    0XFF,0XFE,0XFC,0XF9,0XF3,0XE7,0XCF,0XDF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
    0XFF,0X7F,0X3F,0X9F,0XCF,0XE7,0XF3,0XFB,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, //^
    0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0,0XC0,0XFF,
    0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X03,0X03,0XFF, //_
    0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
    0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, //'
    0XFF,0XFF,0XFF,0XF8,0XF0,0XE0,0XE7,0XFF,0XF0,0XE0,0XE3,0XE3,0XE0,0XF0,0XF8,0XFF,
    0XFF,0XFF,0XFF,0X0F,0X07,0X07,0XC7,0XC7,0X07,0X47,0XC7,0X87,0X07,0X47,0X47,0XFF, //a
    0XFF,0XE3,0XE3,0XE0,0XE0,0XE0,0XE1,0XE3,0XE3,0XE3,0XE1,0XE0,0XE0,0XE4,0XE6,0XFF,
    0XFF,0XFF,0XFF,0X1F,0X0F,0X07,0XC3,0XE3,0XE3,0XE3,0XC3,0X07,0X0F,0X1F,0X3F,0XFF, //b
    0XFF,0XFF,0XFF,0XF8,0XF0,0XE0,0XE3,0XE7,0XE7,0XE7,0XE7,0XE3,0XF0,0XF8,0XFC,0XFF,
    0XFF,0XFF,0XFF,0X1F,0X0F,0X07,0XC7,0XE7,0XFF,0XFF,0XE7,0XC7,0X0F,0X1F,0X3F,0XFF, //c
    0XFF,0XFF,0XFF,0XF8,0XF0,0XE0,0XE1,0XE3,0XE3,0XE3,0XE3,0XE1,0XF0,0XF8,0XFC,0XFF,
    0XFF,0XC7,0XC7,0X47,0X07,0X07,0X87,0XC7,0XC7,0XC7,0XC7,0X87,0X07,0X47,0XC7,0XFF, //d
    0XFF,0XFF,0XFF,0XF8,0XF0,0XE0,0XE1,0XE3,0XE0,0XE0,0XE3,0XE3,0XE1,0XF0,0XF8,0XFF,
    0XFF,0XFF,0XFF,0X1F,0X0F,0X07,0XC7,0XE7,0X07,0X07,0XFF,0XE7,0XC7,0X0F,0X1F,0XFF, //e
    0XFF,0XFC,0XFC,0XFC,0XFC,0XFC,0XE0,0XE0,0XE0,0XFC,0XFC,0XFC,0XFC,0XFC,0XFC,0XFF,
    0XFF,0X07,0X07,0X07,0X3F,0X3F,0X07,0X07,0X07,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0XFF, //f
    0XFF,0XF0,0XE0,0XE1,0XE3,0XE3,0XE3,0XE1,0XE0,0XF0,0XF8,0XFF,0XE7,0XE0,0XF0,0XFF,
    0XFF,0X1F,0X0F,0X87,0XC7,0XC7,0XC7,0X87,0X07,0X07,0X47,0XC7,0X87,0X0F,0X1F,0XFF, //g
    0XFF,0XE3,0XE3,0XE2,0XE0,0XE0,0XE3,0XE3,0XE3,0XE3,0XE3,0XE3,0XE3,0XE3,0XE3,0XFF,
    0XFF,0XFF,0XFF,0X0F,0X07,0X07,0XC7,0XC7,0XC7,0XC7,0XC7,0XC7,0XC7,0XC7,0XC7,0XFF, //h
    0XFF,0XFC,0XFC,0XFC,0XFC,0XFF,0XFF,0XFC,0XFC,0XFC,0XFC,0XFC,0XFC,0XFC,0XFC,0XFF,
    0XFF,0X3F,0X3F,0X3F,0X3F,0XFF,0XFF,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0XFF, //i
    0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE3,0XE3,0XE1,0XE0,0XF0,0XF8,0XFF,
    0XFF,0XC7,0XC7,0XFF,0XFF,0XC7,0XC7,0XC7,0XC7,0XC7,0XC7,0X87,0X07,0X0F,0X1F,0XFF, //j
    0XFF,0XE3,0XE3,0XE3,0XE3,0XE2,0XE0,0XE0,0XE0,0XE0,0XE0,0XE2,0XE3,0XE3,0XE3,0XFF,
    0XFF,0XFF,0XFF,0XC7,0X8F,0X1F,0X3F,0XFF,0XFF,0XFF,0X7F,0X3F,0X1F,0X8F,0XC7,0XFF, //k
    0XFF,0XFC,0XFC,0XFC,0XFC,0XFC,0XFC,0XFC,0XFC,0XFC,0XFC,0XFC,0XFC,0XFC,0XFC,0XFF,
    0XFF,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0X3F,0XFF, //l
    0XFF,0XFF,0XFF,0X8C,0X88,0X80,0X80,0X84,0X8E,0X8E,0X8E,0X8E,0X8E,0X8E,0X8E,0XFF,
    0XFF,0XFF,0XFF,0XF3,0X61,0X00,0X00,0X10,0X38,0X38,0X38,0X38,0X38,0X38,0X38,0XFF, //m
    0XFF,0XFF,0XFF,0XE2,0XE0,0XE0,0XE1,0XE3,0XE3,0XE3,0XE3,0XE3,0XE3,0XE3,0XE3,0XFF,
    0XFF,0XFF,0XFF,0X1F,0X0F,0X07,0X87,0XC7,0XC7,0XC7,0XC7,0XC7,0XC7,0XC7,0XC7,0XFF, //n
    0XFF,0XFF,0XFF,0XF8,0XF0,0XE0,0XE1,0XE3,0XE3,0XE3,0XE3,0XE1,0XE0,0XF0,0XF8,0XFF,
    0XFF,0XFF,0XFF,0X1F,0X0F,0X07,0X87,0XC7,0XC7,0XC7,0XC7,0X87,0X07,0X0F,0X1F,0XFF, //o
    0XFF,0XFF,0XFF,0XE3,0XE2,0XE0,0XE0,0XE1,0XE0,0XE0,0XE2,0XE3,0XE3,0XE3,0XE3,0XFF,
    0XFF,0XFF,0XFF,0X1F,0X0F,0X07,0XC7,0XE7,0XC7,0X07,0X0F,0X1F,0XFF,0XFF,0XFF,0XFF, //p
    0XFF,0XFF,0XFF,0XF8,0XF0,0XE0,0XE3,0XE7,0XE3,0XE0,0XF0,0XF8,0XFF,0XFF,0XFF,0XFF,
    0XFF,0XFF,0XFF,0XC7,0X47,0X07,0X07,0X87,0X07,0X07,0X47,0XC7,0XC7,0XC7,0XC7,0XFF, //q
    0XFF,0XFF,0XFF,0XF1,0XF1,0XF0,0XF0,0XF0,0XF1,0XF1,0XF1,0XF1,0XF1,0XF1,0XF1,0XFF,
    0XFF,0XFF,0XFF,0XC7,0XC7,0X87,0X1F,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, //r
    0XFF,0XFF,0XFF,0XF8,0XF0,0XE3,0XE7,0XE3,0XE0,0XF8,0XFF,0XE7,0XE3,0XF0,0XF8,0XFF,
    0XFF,0XFF,0XFF,0X1F,0X0F,0XC7,0XE7,0XFF,0X0F,0X27,0XE7,0XE7,0XC7,0X0F,0X1F,0XFF, //s
    0XFF,0XFC,0XFC,0XFC,0XE0,0XE0,0XE0,0XFC,0XFC,0XFC,0XFC,0XFC,0XFC,0XFC,0XFC,0XFF,
    0XFF,0X3F,0X3F,0X3F,0X07,0X07,0X07,0X3F,0X3F,0X3F,0X3F,0X3F,0X07,0X07,0X07,0XFF, //t
    0XFF,0XFF,0XFF,0XE3,0XE3,0XE3,0XE3,0XE3,0XE3,0XE3,0XE3,0XE1,0XE0,0XF0,0XF8,0XFF,
    0XFF,0XFF,0XFF,0XC7,0XC7,0XC7,0XC7,0XC7,0XC7,0XC7,0XC7,0X87,0X07,0X47,0XC7,0XFF, //u
    0XFF,0XFF,0XFF,0XE3,0XE3,0XE3,0XE1,0XE1,0XF1,0XF1,0XF9,0XF8,0XF8,0XFC,0XFE,0XFF,
    0XFF,0XFF,0XFF,0XC7,0XC7,0XC7,0X87,0X87,0X8F,0X8F,0X9F,0X1F,0X1F,0X3F,0X7F,0XFF, //v
    0XFF,0XFF,0XFF,0X8E,0X8C,0X8C,0X84,0XC4,0XC0,0XE0,0XE1,0XE1,0XF1,0XF1,0XFB,0XFF,
    0XFF,0XFF,0XFF,0X71,0X31,0X31,0X21,0X23,0X03,0X07,0X87,0X87,0X8F,0X8F,0XDF,0XFF, //w
    0XFF,0XFF,0XFF,0XE3,0XE1,0XF0,0XF8,0XF8,0XFC,0XFC,0XF8,0XF8,0XF0,0XE1,0XE3,0XFF,
    0XFF,0XFF,0XFF,0XC7,0X87,0X0F,0X1F,0X1F,0X3F,0X3F,0X1F,0X1F,0X0F,0X87,0XC7,0XFF, //x
    0XFF,0XFF,0XFF,0XE3,0XE3,0XF1,0XF1,0XF8,0XFE,0XFE,0XFE,0XFC,0XF8,0XF1,0XE3,0XFF,
    0XFF,0XFF,0XFF,0XC7,0XC7,0X8F,0X8F,0X1F,0X3F,0X3F,0X3F,0X7F,0XFF,0XFF,0XFF,0XFF, //y
    0XFF,0XFF,0XFF,0XE0,0XE0,0XE0,0XFF,0XFF,0XFE,0XFC,0XF8,0XF1,0XE0,0XE0,0XE0,0XFF,
    0XFF,0XFF,0XFF,0X07,0X07,0X07,0X8F,0X1F,0X3F,0X7F,0XFF,0XFF,0X07,0X07,0X07,0XFF, //z
};

 ส่วนที่ 2 คือส่วนตารางฟอนต์ (Font) เป็นการกำหนดฟอนต์ที่ต้องการใช้งาน (สามารถศึกษาวิธีการทำเพิ่มเติมได้ท้ายบทความ) โดยวิธีการสร้างเป็นตารางเทียบกับตารางตัวอักษร ASCII เรียงตัวอักษรที่เราสร้างขึ้นมาให้ตรงตำแหน่งเดียวกับ ASCIITable เพื่อง่ายต่อการเรียกใช้เมื่อนำไปใช้งาน ในที่นี้เราใช้ตั้งแต่ตำแหน่งที่ 032 ถึงตำแหน่งที่ 122 เท่านั้น (นอกเหนือจากนี้ ผู้ใช้สามารถเพิ่มเติมได้เอง) ข้อมูลในส่วนนี้เป็นข้อมูลที่มีขนาดใหญ่เราจำต้องเก็บข้อมูลลงใน Memory ไม่สามารถเก็บไว้บน RAM ได้เนื่องจากพื้นที่ไม่พอ

void setup()
{
    SPI.begin();  //ประกาศการใช้งาน SPI
    SPI.setBitOrder( LSBFIRST );  //ใช้งานในโหมด Least Significant Bit First
    SPI.setClockDivider( SPI_CLOCK_DIV2 );// 16MHz/16 -> 1MHz SCK frequency
    SPI.setDataMode( SPI_MODE0 ); // use SPI mode 0
    pinMode(LEDARRAY_D, OUTPUT);  //กำหนด Pin  ให้อยู่ในโหมด Output
    pinMode(LEDARRAY_C, OUTPUT);  //กำหนด Pin  ให้อยู่ในโหมด Output
    pinMode(LEDARRAY_B, OUTPUT);  //กำหนด Pin  ให้อยู่ในโหมด Output
    pinMode(LEDARRAY_A, OUTPUT);  //กำหนด Pin  ให้อยู่ในโหมด Output
    pinMode(LEDARRAY_G, OUTPUT);  //กำหนด Pin  ให้อยู่ในโหมด Output
    pinMode(STCP_PIN, OUTPUT);    //กำหนด Pin  ให้อยู่ในโหมด Output
    Clear_Display();              //เคลียร์หน้าจอ
    Serial.begin (9600);          //ประกาศการใช้งาน Serial และกำหนดความเร้วในการสื่อสารข้อมูล
}

รูปภาพแสดง ASCII Table

ในส่วนของ Setup เป็นส่วนเริ่มต้นโปรแกรมใช้ตั้งค่า Pin ให้ทำงานใน Mode ต่างๆ รวมไปถึงการเปิดใช้งาน SPI และ Serial Communications ด้วย

void loop()
{
    Display(Display_Swap_Buffer);  //ฟังก์ชั่นในการเลื่อนตัวอักษร
    Calc_Shift(Display_Num_Word);  //ฟังก์ชั่นในการคำณวนการเลือนของตัวอักษร						
    Shift_Count++;		     //เพิ่มจำนวนการนับที่ใช้ในการเลื่อนบิตที่ละ 1
    if(Shift_Count%16 == 0)        //ตรวจสอบเลื่อนบิตเมื่อครบ 16 ครั้ง
    {   
        Message_index++;           //เพิ่มตำแหน่งข้อความที่ละ 1
    }
    if(Message_index > (serial_index - 1)) //ตรวจสอบจำนวนข้อความเทียบกับข้อความที่รับเข้ามา
    {
        Message_index = 0;         //ตั้งให้ตำแหน่งข้อความเริ่มต้นใหม่
    }	        	
}

ในส่วนของ Loop เป็นส่วนในการทำงานวนซ้ำแบบไม่รู้จบ เราเขียนโปรแกรมในส่วนที่ต้องการทำงานวนซ้ำไว้ในส่วนนี้หรือเรียกว่าส่วน Main ของโปรแกรมก็ว่าได้ จากโปรแกรมนี้จะทำการเลื่อนข้อความที่แสดงบนหน้าจอไปจนกว่าจะครบข้อความที่รับเข้ามาทาง Serial Port แล้ววนแสดงข้อความเดิมซ้ำๆ จนกว่าจะได้ข้อความใหม่

void Clear_Display()
{
    unsigned char n,j;
    for(j = 0 ; j < Display_Num_Word; j++)
    {
        for(n = 0 ; n < 32 ;n++)
	{
            Display_Swap_Buffer[j][n] = 0xFF; 	
	}
    }
}

 ในส่วนของฟังก์ชั่น Clear Display เป็นส่วนที่ทำหน้าที่ในการเคลียร์หน้าจอแสดงผล

 ในส่วนของฟังก์ชั่น Calc_Shift เป็นส่วนในการคำณวนการเลื่อนข้อความและการดึงข้อมูลจาก Memory ขึ้นมาก่อนการแสดงผล

void Display(const unsigned char dat[][32])					
{
    unsigned char n;
    for( n = 0 ; n < 16 ; n++ )
    {
        for(int j = 0 ; j < Display_Num_Word ; j++)
        {
            digitalWrite(LEDARRAY_G, HIGH);
            int sum = j*2;
            Display_Buffer[sum] = dat[j][n];		
            Display_Buffer[sum+1] = dat[j][n+16];
        }
        for(int j = (Display_Num_Word*2)-1 ; j >=0 ; j--)
        {
            shiftOutSPI(Display_Buffer[j]);
        }
        Scan_Line(i);						
        digitalWrite(LEDARRAY_G, LOW);
        delayMicroseconds(runs);						
    }	
}

ในส่วนของฟังก์ชั่น Display เป็นส่วนที่ใช้ในการสั่งงานจอแสดงผล จากหลักการทำงานของไอซี 74CH595 จะต้องเลื่อนข้อมูลเข้าไปพร้อมการกำหนดจังหวะในการส่งข้อมูลหลังจากนั้นสั่งงานขา LAT หรือ STCP ดูได้จากการทำงานของไอซี และสุดท้ายจะต้องสั่งงานขา Enable เพื่อส่งข้อมูลออกไปแสดงผล

void Scan_Line( unsigned char m)
{	
    switch(m)
    {
        case 0:			
            digitalWrite(LEDARRAY_D, LOW);digitalWrite(LEDARRAY_C, LOW);digitalWrite(LEDARRAY_B, LOW);digitalWrite(LEDARRAY_A, LOW); 					
	break;
	case 1:					
	    digitalWrite(LEDARRAY_D, LOW);digitalWrite(LEDARRAY_C, LOW);digitalWrite(LEDARRAY_B, LOW);digitalWrite(LEDARRAY_A, HIGH); 		
	break;
	case 2:					
	    digitalWrite(LEDARRAY_D, LOW);digitalWrite(LEDARRAY_C, LOW);digitalWrite(LEDARRAY_B, HIGH);digitalWrite(LEDARRAY_A, LOW); 		
	break;
	case 3:					
	    digitalWrite(LEDARRAY_D, LOW);digitalWrite(LEDARRAY_C, LOW);digitalWrite(LEDARRAY_B, HIGH);digitalWrite(LEDARRAY_A, HIGH); 		
	break;
      case 4:
	    digitalWrite(LEDARRAY_D, LOW);digitalWrite(LEDARRAY_C, HIGH);digitalWrite(LEDARRAY_B, LOW);digitalWrite(LEDARRAY_A, LOW); 		
      break;
	case 5:
	    digitalWrite(LEDARRAY_D, LOW);digitalWrite(LEDARRAY_C, HIGH);digitalWrite(LEDARRAY_B, LOW);digitalWrite(LEDARRAY_A, HIGH); 		
	break;
	case 6:
	    digitalWrite(LEDARRAY_D, LOW);digitalWrite(LEDARRAY_C, HIGH);digitalWrite(LEDARRAY_B, HIGH);digitalWrite(LEDARRAY_A, LOW); 		
	break;
	case 7:
	    digitalWrite(LEDARRAY_D, LOW);digitalWrite(LEDARRAY_C, HIGH);digitalWrite(LEDARRAY_B, HIGH);digitalWrite(LEDARRAY_A, HIGH); 		
	break;
        case 8:
	    digitalWrite(LEDARRAY_D, HIGH);digitalWrite(LEDARRAY_C, LOW);digitalWrite(LEDARRAY_B, LOW);digitalWrite(LEDARRAY_A, LOW); 		
	break;
	case 9:
	    digitalWrite(LEDARRAY_D, HIGH);digitalWrite(LEDARRAY_C, LOW);digitalWrite(LEDARRAY_B, LOW);digitalWrite(LEDARRAY_A, HIGH); 		
	break;	
	case 10:
	    digitalWrite(LEDARRAY_D, HIGH);digitalWrite(LEDARRAY_C, LOW);digitalWrite(LEDARRAY_B, HIGH);digitalWrite(LEDARRAY_A, LOW); 		
	break;
	case 11:
	    digitalWrite(LEDARRAY_D, HIGH);digitalWrite(LEDARRAY_C, LOW);digitalWrite(LEDARRAY_B, HIGH);digitalWrite(LEDARRAY_A, HIGH); 		
	break;
	case 12:
            digitalWrite(LEDARRAY_D, HIGH);digitalWrite(LEDARRAY_C, HIGH);digitalWrite(LEDARRAY_B, LOW);digitalWrite(LEDARRAY_A, LOW); 		
	break;
	case 13:
	    digitalWrite(LEDARRAY_D, HIGH);digitalWrite(LEDARRAY_C, HIGH);digitalWrite(LEDARRAY_B, LOW);digitalWrite(LEDARRAY_A, HIGH); 		
	break;
	case 14:
	    digitalWrite(LEDARRAY_D, HIGH);digitalWrite(LEDARRAY_C, HIGH);digitalWrite(LEDARRAY_B, HIGH);digitalWrite(LEDARRAY_A, LOW); 		
	break;
	case 15:
	    digitalWrite(LEDARRAY_D, HIGH);digitalWrite(LEDARRAY_C, HIGH);digitalWrite(LEDARRAY_B, HIGH);digitalWrite(LEDARRAY_A, HIGH); 		
	break;
	default : break;	
    }            
}

ในส่วนของฟังก์ชั่น Scan_Line เป็นฟังก์ชั่นในการตรวจสอบและสั่งงานบรรทัดที่ต้องการแสดงผลโดยอาศัยการทำงานของไอซี 74CH138 De-multiplexer เข้ามาช่วยในการควบคุมการแสดงผลในแถวแนวนอน

void shiftOutSPI( unsigned char dat ) 
{
   digitalWrite( STCP_PIN, LOW);
   digitalWrite( STCP_PIN, LOW );
   SPI.transfer(dat);
   digitalWrite( STCP_PIN, HIGH );
   digitalWrite( STCP_PIN, LOW );
}

ในส่วนของฟังก์ชั่น shiftOutSPI เป็นฟังก์ชั่นในการสั่งงาน Hardware SPI ในการส่งข้อมูลและแสดงผล

void serialEvent()
{
    byte buff;
    if(Serial.available())
    {
       buff = Serial.read();
       if(buff == 59)
       {
           serial_index = 0;
       }
       else
       {
           serial_pos[serial_index] = buff - 32;
           serial_index++;
        }
    }
}

ในส่วนของฟังก์ชั่น serialEvent เป็นฟังก์ชั่นในการรับข้อมูลจาก Serial Port โดยเรียกใช้งาน Serial interrupt เมื่อมีข้อมูลเข้ามาให้ทำการวนเก็บค่าทันทีและทำการเทียบกับตัวอักษรที่ทำไว้ในตาราง ASCII ก่อนหน้านี้

การเตรียมข้อมูลหรือการสร้างตัวอักษร

          ในการเตรียมข้อมูลหรือการทำตัวอักษร หรือภาพที่ต้องการนำมาแสดงผลบนหน้าจอ Dot Matrix มีหลายวิธีด้วยกัน แต่ในบทความนี้เราจะใช้โปรแกรมช่วยทำข้อมูลเพื่อความสะดวกรวดเร็ว โปรแกรมที่ใช้งานมี 2 ตัว คือ 

  1. Fast_LCD (ไม่ได้แจกครับเป็นโปรแกรมลิขสิทธิ์)
  2. Image2Lcd (ไม่ได้แจกครับเป็นโปรแกรมลิขสิทธิ์)

ขั้นตอนในการทำมีดังนี้

1. ใช้โปรแกรมที่ 1 ดึงไฟล์ภาพ ฟอนต์ หรือวาดเองลงไปบนตารางก็ได้ โดยกำหนดขนาดของช่องตารางให้ตรงกับ Dot Matrixที่ใช้งานยกตัวอย่างเช่น 16×16 วิธีกำหนดดูได้จากรูปด้านล่าง โดยคลิกที่ Grid Size และกำหนด Image Size เป็น 16×16 ส่วนของ Grid Size เป็น 8×8 เพราะ ในโมดูล 16×16 จะมี Dot Matrix 8×8 ต่อรวมกันอยู่ 4 ตัว

2. หลังจากกำหนดขนาดเรียบร้อยแล้วให้ใช้เครื่องมือ “เทสีดำ” ลงไปก่อนวาดดังรูป

12

3. เมื่อเทสีดำลงไปเรียบร้อยแล้ว ให้เลือกเครื่งมือในการวาด แล้วคลิกขวาตรงจุดที่ต้องการวาดลงไป ดังรูปด้านล่าง

13

4. หลังจากวาดหรือพลอตเสร็จแล้วให้ save โดยกำหนดเป็น ”ชือไฟล์ที่ต้องการ.BMP” ดังรูปด้านล่าง

14
15

5. เมื่อ save เรียบร้อยแล้วให้เปิดโปรแกรม Image2Lcd ขึ้นมา และตั้งค่า 1-4 ดังรูปด้านล่าง

16

6. หลังจากตั้งค่าโปรแกรมเรียบร้อยแล้วให้ Open ไฟล์รูป .BMP ที่ Save ไว้ก่อนหน้านี้จากข้อ 4 แล้วกดที่เมนู Batch ดังรู

17

7. หลังจากเลือก Batch แล้วเราจะได้โฟล์เดอร์ batch ขึ้นมาอยู่ในไดร์ที่เก็บไฟล์รูปไว้ตอนต้น

18

8. เปิดโฟล์เดอร์ batch จะเห็นไฟล์ชื่อเดียวกับไฟล์รูปที่เราตั้งไว้ก่อนหน้าแต่นามสกุลเปลี่ยนเป็น .c ให้ทำการ copy ข้อมูลด้านในดังรูปด้านล่าง ทั้งหมด 32Byte ไปใส่ยังโค้ด Arduino ต่อไป

19

วิธีการใช้งานกับ Serial Communications

          ในรูปแบบของการสือสารผ่าน Serial ต้องกำหนดรูปแบบในการสื่อสารหรือ Protocol ขึ้นมาก่อน ยกตัวอย่างในบทความนี้กำหนดการสื่อสารแบบง่ายๆ โดยกำหนดเองว่าให้เริ่มต้นด้วย “;” แล้วตามด้วยตัวอักษรที่ต้องการส่งไปแสดงผล สามารถส่งไปได้ถึง 99 ตัวอักษร รวม Start Bit จะได้ 100 ตัวอักษรพอดี โปรแกรมที่ใช้ในการส่งข้องมูลในบทความนี้จะเป็นโปรแกรมที่พัฒนาขึ้นเอง ผู้ใช้สามารถใช้โปรแกรมอื่นนอกเหนือจากนี้ได้ แต่ต้องส่งข้อมูลในรูปแบบเดียวกันตัวอย่างเช่น ;TEST 

โปรแกรมด้านล่างใส่ Start Bit มาให้แล้วผู้ใช้ไม่จำเป็นต้องใส่เครื่องหมาย “;” ตอนส่งข้อความ

20

ดาวน์โหลดโปรแกรม Send Serial

ขั้นตอนการใช้งาน

  1. เสียบสาย USB-to-Serial
  2. เลือก COM Port ให้ตรงกับที่อยู่ในเครื่อง
  3. กดปุ่ม Open Serial เพื่อเปิดพอร์ต (เมื่อเลิกใช้กดปุ่ม Close Serial เพื่อปิดพอร์ต)
  4. พิมพ์ข้อความตามต้องการไม่เกิน 100 ตัวอักษร แล้วกดปุ่ม Send Text
21