[Matrix LED] Hiệu ứng chạy chữ từ phải sáng trái led ma trận 8×32

Led Matrix

Chào các bạn! Trong bài viết này, chúng ta sẽ học cách tạo hiệu ứng chạy chữ từ phải sáng trái trên led ma trận 8×32. Đừng lo, chỉ cần vài dòng code từ bài 3, chúng ta đã có thể tạo ra hiệu ứng này rồi. Hãy cùng nhau khám phá nhé!

Mã nguồn đầy đủ

Để tiện lợi, bạn có thể tải file mã nguồn tại đây.

Bạn cũng có thể thử áp dụng hiệu ứng chạy chữ từ trên xuống, dưới lên, trái sang phải, hoặc xiên góc.

Xử lý xé màn hình

Nếu bạn để ý kỹ trong video trên, có thể thấy hình ảnh hiển thị trông hơi “nát nát”. Đó là do màn hình gặp hiện tượng xé màn hình.

“Screen tearing” là hiện tượng khi màn hình trông như bị vỡ, nát, xé toạc ra do thông tin giữa khung hình hiện tại và khung hình trước đó bị hiển thị không đồng bộ. Nguyên nhân là do tốc độ render dữ liệu để ghi vào Buffer display xảy ra chậm, dẫn đến bất đồng bộ giữa hàm ngắt hiển thị (đọc dữ liệu để xuất ra màn hình) và hàm main (xử lí dữ liệu).

Để khắc phục, chúng ta có thể sử dụng kỹ thuật “Multiple buffering” (hãy tham khảo các liên kết để biết thêm chi tiết).

Tuy nhiên, việc sử dụng thêm bộ đệm sẽ tốn tài nguyên RAM của vi điều khiển. Vì vậy, hãy cân nhắc khi chọn vi điều khiển cho phù hợp.

Giờ đây, chúng ta sẽ tạo thêm một Buffer nữa. Hàm main sẽ thực hiện thao tác trên Buffer_display, trong khi hàm ngắt timer sẽ thực hiện trên Buffer_display2.

Sau khi các hàm render dữ liệu trong hàm main hoàn thành nhiệm vụ, chúng ta sẽ COPY toàn bộ dữ liệu từ Buffer_display sang Buffer_display2. Đồng thời, sau khi dữ liệu được render, chúng ta sẽ gọi hàm update để copy dữ liệu. Ví dụ, hàm chạy chữ sẽ được sửa như sau:

void chaychu(){
  for(int i = 0; i < N; i++){
    for(int j = 0; j < ChieuDaiHienThi; j++){
      Buffer_display2[i][j] = Buffer_hien_thi[i][j];
    }
  }
}

Nhờ việc copy dữ liệu diễn ra nhanh chóng hơn các hàm render dữ liệu, hiệu ứng xé màn hình gần như biến mất. Tuy nhiên, chúng ta có thể khắc phục tốt hơn bằng kỹ thuật lật trang (được đề cập trong các liên kết trên).

Thay vì sử dụng một bộ đệm cho hàm main và một bộ đệm cho hàm ngắt hiển thị, trong phương pháp lật trang, cả hai bộ đệm sẽ được sử dụng đồng thời. Ban đầu, bộ đệm 1 được sử dụng để hiển thị, trong khi bộ đệm 2 được “vẽ”. Sau đó, khi cần update, chúng ta chỉ cần “đóng cầu dao” để đảo ngược nhiệm vụ của hai bộ đệm.

Rõ ràng việc “đóng cầu dao” nhanh hơn rất nhiều việc COPY dữ liệu từ bộ đệm này sang bộ đệm kia. Thậm chí có thể loại bỏ hoàn toàn hiện tượng xé màn hình nếu lật trang tại thời điểm “vàng” (Vertical blanking interval – thời điểm mà hàm ngắt hiển thị “nghỉ ngơi”).

Chúng ta sẽ tìm hiểu thêm về đồng hồ matrix 8×40 hiệu ứng lật trang đơn giản trong bài viết tiếp theo.

Stay tuned!