ทำป้ายตัวอักษรวิ่งด้วย LED Dot Matrix 16×16 โดยส่งข้อมูลผ่าน Serial Communication
![01](https://blog.thaieasyelec.com/wp-content/uploads/2020/07/86_01.jpg)
การควบคุมหลอดไฟ 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](https://blog.thaieasyelec.com/wp-content/uploads/2020/07/86_02.png)
รูปแสดงโมดูล 16×16 Dot Matrix Module (EFDV344)
![03](https://blog.thaieasyelec.com/wp-content/uploads/2020/07/86_03.png)
จากรูปด้านบน DIN คือ Pin สำหรับเชื่อมต่อกับ MCU หรือโมดูลก่อนหน้า Data In (สัญญาณเข้า CN1-in), VIN คือ Pin สำหรับไฟ 5VDC และ GND ของโมดูล(CN4), DO คือ Pin สำหรับเชื่อมต่อไปยังโมดูลถัดไปในกรณีเชื่อมต่อหลายโมดูลเข้าด้วยกัน Data Out (สัญญาณออก CN2-out), VO สำหรับไฟออกให้กับโมดูลถัดไปในกรณีเชื่อมต่อหลายโมดูล
การต่อใช้งานให้ต่อสัญญาณเข้าทางด้าน CN1-in และ +5VDC, GND โดยมีขาสัญญาณตามตารางดังนี้
![04](https://blog.thaieasyelec.com/wp-content/uploads/2020/07/86_04.png)
หลักการทำงาน
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](https://blog.thaieasyelec.com/wp-content/uploads/2020/07/86_05.png)
รูปแสดงขาทั้งหมดของไอซี 74CH595
![06](https://blog.thaieasyelec.com/wp-content/uploads/2020/07/86_06.png)
รูปแสดงตำแหน่งขาของ 74CH595 ตัวถังแบบ PDIP-16
ศึกษาข้อมูลเพิ่มเติม Datasheet 74CH595
การเชื่อมต่อ LED Dot Matrix ร่วมกับ Arduino (Arduino Sketch)
![](https://blog.thaieasyelec.com/wp-content/uploads/2020/07/86_07-1-1024x611.png)
![08](https://blog.thaieasyelec.com/wp-content/uploads/2020/07/86_08.png)
การส่งข้อมูลให้โมดูล 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 ได้เนื่องจากพื้นที่ไม่พอ
![](https://blog.thaieasyelec.com/wp-content/uploads/2020/07/86_09-1-1024x742.gif)
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 ตัว คือ
- Fast_LCD (ไม่ได้แจกครับเป็นโปรแกรมลิขสิทธิ์)
- Image2Lcd (ไม่ได้แจกครับเป็นโปรแกรมลิขสิทธิ์)
ขั้นตอนในการทำมีดังนี้
1. ใช้โปรแกรมที่ 1 ดึงไฟล์ภาพ ฟอนต์ หรือวาดเองลงไปบนตารางก็ได้ โดยกำหนดขนาดของช่องตารางให้ตรงกับ Dot Matrixที่ใช้งานยกตัวอย่างเช่น 16×16 วิธีกำหนดดูได้จากรูปด้านล่าง โดยคลิกที่ Grid Size และกำหนด Image Size เป็น 16×16 ส่วนของ Grid Size เป็น 8×8 เพราะ ในโมดูล 16×16 จะมี Dot Matrix 8×8 ต่อรวมกันอยู่ 4 ตัว
![](https://blog.thaieasyelec.com/wp-content/uploads/2020/07/86_10.png)
![](https://blog.thaieasyelec.com/wp-content/uploads/2020/07/86_11.png)
2. หลังจากกำหนดขนาดเรียบร้อยแล้วให้ใช้เครื่องมือ “เทสีดำ” ลงไปก่อนวาดดังรูป
![12](https://blog.thaieasyelec.com/wp-content/uploads/2020/07/86_12.png)
3. เมื่อเทสีดำลงไปเรียบร้อยแล้ว ให้เลือกเครื่งมือในการวาด แล้วคลิกขวาตรงจุดที่ต้องการวาดลงไป ดังรูปด้านล่าง
![13](https://blog.thaieasyelec.com/wp-content/uploads/2020/07/86_13.png)
4. หลังจากวาดหรือพลอตเสร็จแล้วให้ save โดยกำหนดเป็น ”ชือไฟล์ที่ต้องการ.BMP” ดังรูปด้านล่าง
![14](https://blog.thaieasyelec.com/wp-content/uploads/2020/07/86_14.png)
![15](https://blog.thaieasyelec.com/wp-content/uploads/2020/07/86_15.png)
5. เมื่อ save เรียบร้อยแล้วให้เปิดโปรแกรม Image2Lcd ขึ้นมา และตั้งค่า 1-4 ดังรูปด้านล่าง
![16](https://blog.thaieasyelec.com/wp-content/uploads/2020/07/86_16.png)
6. หลังจากตั้งค่าโปรแกรมเรียบร้อยแล้วให้ Open ไฟล์รูป .BMP ที่ Save ไว้ก่อนหน้านี้จากข้อ 4 แล้วกดที่เมนู Batch ดังรู
![17](https://blog.thaieasyelec.com/wp-content/uploads/2020/07/86_17.png)
7. หลังจากเลือก Batch แล้วเราจะได้โฟล์เดอร์ batch ขึ้นมาอยู่ในไดร์ที่เก็บไฟล์รูปไว้ตอนต้น
![18](https://blog.thaieasyelec.com/wp-content/uploads/2020/07/86_18.png)
8. เปิดโฟล์เดอร์ batch จะเห็นไฟล์ชื่อเดียวกับไฟล์รูปที่เราตั้งไว้ก่อนหน้าแต่นามสกุลเปลี่ยนเป็น .c ให้ทำการ copy ข้อมูลด้านในดังรูปด้านล่าง ทั้งหมด 32Byte ไปใส่ยังโค้ด Arduino ต่อไป
![19](https://blog.thaieasyelec.com/wp-content/uploads/2020/07/86_19.png)
วิธีการใช้งานกับ Serial Communications
ในรูปแบบของการสือสารผ่าน Serial ต้องกำหนดรูปแบบในการสื่อสารหรือ Protocol ขึ้นมาก่อน ยกตัวอย่างในบทความนี้กำหนดการสื่อสารแบบง่ายๆ โดยกำหนดเองว่าให้เริ่มต้นด้วย “;” แล้วตามด้วยตัวอักษรที่ต้องการส่งไปแสดงผล สามารถส่งไปได้ถึง 99 ตัวอักษร รวม Start Bit จะได้ 100 ตัวอักษรพอดี โปรแกรมที่ใช้ในการส่งข้องมูลในบทความนี้จะเป็นโปรแกรมที่พัฒนาขึ้นเอง ผู้ใช้สามารถใช้โปรแกรมอื่นนอกเหนือจากนี้ได้ แต่ต้องส่งข้อมูลในรูปแบบเดียวกันตัวอย่างเช่น ;TEST
โปรแกรมด้านล่างใส่ Start Bit มาให้แล้วผู้ใช้ไม่จำเป็นต้องใส่เครื่องหมาย “;” ตอนส่งข้อความ
![20](https://blog.thaieasyelec.com/wp-content/uploads/2020/07/86_20.png)
ดาวน์โหลดโปรแกรม Send Serial
ขั้นตอนการใช้งาน
- เสียบสาย USB-to-Serial
- เลือก COM Port ให้ตรงกับที่อยู่ในเครื่อง
- กดปุ่ม Open Serial เพื่อเปิดพอร์ต (เมื่อเลิกใช้กดปุ่ม Close Serial เพื่อปิดพอร์ต)
- พิมพ์ข้อความตามต้องการไม่เกิน 100 ตัวอักษร แล้วกดปุ่ม Send Text
![21](https://blog.thaieasyelec.com/wp-content/uploads/2020/07/86_21.jpg)