Bản chất của những biển quảng cáo với đủ màu sắc và nội dung cũng giống như LED matrix gồm 16 chân: 8 chân row và 8 chân column, có thể lập trình để tạo ra các hình ảnh.
LED matrix 2388ASR


Đây là LED matrix đơn sắc, chỉ có một màu đỏ. Tập hợp của 64 đèn LED được xếp theo hàng và cột. Với bố trí như vậy có thể hiển thị hình ảnh, văn bản như một màn hình.
Tivi LED cũng có thiết kế tương tự nhưng số lượng LED trên hàng và cột rất lớn như vậy sẽ tao được độ mịn cho hình ảnh.
Ưu điểm của những bảng LED matrix là có độ bền cao và khi để ngoài trời sáng vẫn thấy rõ rất phù hợp với ngành quảng cáo.
Cấu trúc

Với:
- c0 là cột 0, c1 là cột 1, c2 là cột 2, c3 là cột 3, c4 là cột 4, c5 là cột 5, c6 là cột 6, c7 là cột 7.
- r0 là dòng 0, r1 là dòng 1, r2 là dòng 2, r3 là dòng 3, r4 là dòng 4, r5 là dòng 5, r6 là dòng 6, r7 là dòng 7.
Dự án mẫu sử dụng LED matrix
Để điều khiển LED matrix, Arduino Uno sẽ không đủ chân nên trong sơ đồ sẽ sử dụng 2 IC 74HC595N. IC đầu tiên sẽ làm nhiệm vụ điều khiển các column của LED matrix. Các chân từ Q0 → Q7 của IC đầu tiên tương ứng với các chân col 0 → col 7 theo hình trên. Tương tự với IC thứ 2 sẽ điều khiển các chân row từ row 0 → row 7.

Nguyên lý
Trong lần dịch bit thứ nhất của IC điều khiển các chân row, sau khi dịch các dòng row đang có giá tri là 1. Những vị trí có số 1 trên đèn LED matrix sẽ là những ô sáng.
void translateTargetBuffer() { digitalWrite(MC_LATCH, LOW); shiftOut(MC_DATA, MC_CLOCK, MSBFIRST, B00000000); shiftOut(MC_DATA, MC_CLOCK, MSBFIRST, B00000001); digitalWrite(MC_LATCH, HIGH); delay(1); }
Hàm translateTargetBuffer
trên sẽ hiển thị những điểm sáng trên đèn tùy thuộc vào giá trị data đưa vào. Vòng lặp từ 0 → 7 là 8 dòng và 8 cột.
Do sử dụng 2 IC nên một lần dịch bit phải dịch bit shiftOut
của một giá trị 16 bit mà một IC chỉ có khả năng dịch tối da 8 bit nên trong hàm trên cần dịch bit 2 lần.
Ví dụ bật các LED trên 1 dòng
Bật sáng tất cả các đèn tại vị row 1

Đầu tiên sử dụng IC thứ nhất để truyền vào col giá trị là B00000000
, lúc này tất cả các col đều có giá trị là 0.

Sau đó ta truyền vào cho row giá trị B00000001
, toán tử giữa các bit là toán tử XOR.

Các ô có giá trị là 1 sẽ sáng lên.
Ví dụ bật các LED trên 1 dòng và 1 cột
Làm đèn sáng theo hình dạng sau.

Tạo một mảng row như sau:
int row[] = {1, 2, 4, 8, 16, 32, 64, 128};
và một mảng gồm 8 phần tử
byte symbol[MC_ROWS] = { 0xFF, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 };
các phần tử trong mảng symbol chỉ đơn giản là chuyển từ kiểu BIN sang HEX.
Mã nguồn đầy đủ
#define MC_CLOCK 10 #define MC_LATCH 11 #define MC_DATA 12 #define MC_ROWS 8 #define MC_COLS 8 byte symbol[MC_ROWS] = { 0xFF, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 }; void setup() { pinMode(MC_CLOCK,OUTPUT); pinMode(MC_LATCH,OUTPUT); pinMode(MC_DATA,OUTPUT); } void loop() { translateTargetBuffer(); } void translateTargetBuffer() { for (int i = 0; i < MC_ROWS; i++) { digitalWrite(MC_LATCH, LOW); shiftOut(MC_DATA, MC_CLOCK, MSBFIRST, ~symbol[i]); shiftOut(MC_DATA, MC_CLOCK, MSBFIRST, (1<<i)); digitalWrite(MC_LATCH, HIGH); delay(1); } }

Dòng shiftOut(MC_DATA, MC_CLOCK, MSBFIRST,~symbol[i])
phải đảo ngược các bit, vì nếu không đảo ngược thì 1 XOR 1 = 0
dẫn đến ô muốn sáng thì lại là ô bị tắt.
Ví dụ tạo hiệu ứng chạy chữ
LED matrix chạy chữ.

#define MC_CLOCK 10 #define MC_LATCH 11 #define MC_DATA 12 #define MC_ROWS 8 #define MC_COLS 8 #define STDIO_MAX_ELEMENTS 5 byte row[] = { 1, 2, 4, 8, 16, 32, 64, 128 }; byte characterList[STDIO_MAX_ELEMENTS][MC_ROWS] = { { 0x1C, 0x22, 0x30, 0x18, 0x0C, 0x46, 0x46, 0x3C }, //S { 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18 }, //T { 0x78, 0x64, 0x66, 0x66, 0x66, 0x66, 0x64, 0x78 }, //D { 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E }, //I { 0x3C, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C }, //O }; void setup() { pinMode(MC_CLOCK, OUTPUT); pinMode(MC_LATCH, OUTPUT); pinMode(MC_DATA, OUTPUT); } void loop() { for (int i = 0; i < 5; i++) { translateTargetBuffer(characterList[i]); } } void translateTargetBuffer(byte deviceContext[]) { for(int shift = 0; shift < 9; shift++) { for(int fps = 0; fps < 30; fps++) { for(int row_present = 0; row_present < 8; row_present++) { digitalWrite(MC_LATCH, 0); shiftOut(MC_DATA, MC_CLOCK, MSBFIRST, ~(deviceContext[row_present] << shift)); //col shiftOut(MC_DATA, MC_CLOCK, MSBFIRST, row[row_present]);//row digitalWrite(MC_LATCH, 1); delay(1); } } } }
Như vậy ta đã có được một bảng đèn LED chạy chữ như những biển quảng cáo thường thấy: