Nội dung bài viết
Đăng ký học lập trình C++
Tại STDIO bạn được dạy nền tảng lập trình tốt nhất.
Đăng ký học
Chúng ta thướng thấy rất nhiếu biển quảng cáo đèn LED với đủ màu sắc và nội dung, bản chất của những biển quảng cáo đó cũng giống như LED matrix. Một chiếc LED matrix có 16 chân, 8 chân row và 8 chân column. Trong bài này tôi sẽ hướng dẫn lập trình trên LED matrix 2388ASR.

Giới thiệu

Chúng ta thướng thấy rất nhiếu biển quảng cáo đèn LED với đủ màu sắc và nội dung, bản chất của những biển quảng cáo đó cũng giống như LED matrix. Một chiếc LED matrix có 16 chân, 8 chân row và 8 chân column. Trong bài này tôi sẽ hướng dẫn lập trình trên LED matrix 2388ASR.

Tiền đề bài viết

Việc điều khiển LED matrix sử dụng 2 IC 74HC595N Bạn có thể tham khảo thêm về IC tại bài viết IC 74HC595N. Bài viết này là một phần nâng cao trong việc sử dụng hiểu và sử dụng IC.

Đối tượng hướng đến

Những bạn đang làm quen lập trình điện tử căn bản cùng với bộ KIT của STDIO.

Giới thiệu LED Matrix

led_matrix_mat_truocled_matrix_mat_sau

Đây là một chiếc LED matrix đơn sắc, nó chỉ có một màu đỏ. Nó là tập hợp của 64 chiếc đèn LED được xếp theo hàng và cột. Với bộ trí như vậy ta có thể hiển thị hình ảnh, văn bản như một màn hình TV. Chiếc TV 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

stdio_led_matrix_8x8
*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.

Như tôi nói ở trên, trong bài này tôi 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.

ss_4

Nguyên lý

Trong lần dịch bit thứ nhất của IC lần dịch bit này sẽ điều khiển các chân row vậy 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 chính là 8 dòng và 8 cột. Vì tôi sử dụng 2 IC nên một lần dịch bit tôi phải dịch bit của một giá trị 16 byte, tuy nhiên một IC chỉ có khả năng dịch tối da 8 bit nên trong hàm trên tôi dịch bit 2 lần.

Ví dụ bật các LED trên 1 dòng

Tôi muốn bật sáng tất cả các đèn tại vị row 1

ss_5

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

ss_6

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

ss_7

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.

ss_8

Chúng ra sẽ 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);
  }
}

ss_9

Nhưng tại phần shiftOut(MC_DATA, MC_CLOCK, MSBFIRST,~symbol[i]); tôi sẽ dảo ngược các bit với lý do vì nếu ko đảo ngược là 1 XOR 1 = 0 nên tại ô mình muốn sáng thì lại là ô đèn bị tắt.

Ví dụ tạo hiệu ứng chạy chữ

LED matrix chạy chữ.

ss_10

#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 mà bạn thường thấy trong đời sống.

THẢO LUẬN