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

Chỉ cần thêm vài dòng code từ bài 3 là có ngay hiệu ứng chạy chữ từ phải sang trái trên led ma trận 8×32. Gần như mọi thứ cần thiết ta đã học ở bài 3 rồi

FULL CODE

Hoặc tải file tại đây
Làm tương tự với hiệu ứng chạy từ trên xuống, dưới lên, trái sang phải, xiên góc nhé !

Xé màn hình

Nếu để ý kĩ clip trên, bạn sẽ có cảm giác hình ảnh hiển thị hơi “nát nát”. Đó chính là do màn hình đã dính phải hiện tượng xé màn hình.

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

Khắc phục: Cách khắc phục phổ biến là sử dụng nhiều bộ đệm hiển thị Multiple buffering (hãy click vào các liên kết wikipedia mình trích dẫn mà tham khảo nhé, rất hữu ích đó)

Việc sử dụng thêm bộ đệm đương nhiên sẽ làm hao phí thêm rất nhiều tài nguyên RAM của vi điều khiển, tùy vào lượng ram cần thiết hãy tính toán chọn vi điều khiển cho hợp lí nhé. Bây giờ mình sẽ tạo thêm 1 Buffer nữa

Bây giờ, hàm main sẽ thao tác lên Buffer_display còn hàm ngắt timer để hiển thị sẽ thao tác lên Buffer_display2

Do vậy hàm ngắt sẽ được viết lại như này

Sau khi các hàm render dữ liệu trong hàm main làm xong nhiệm vụ. Mình sẽ COPY toàn bộ dữ liệu trong Buffer_display sang Buffer_display2

Và giờ mỗi khi render dữ liệu xong mình sẽ cho gọi hàm update để copy data. Ví dụ hàm chạy chữ ở bên trên sẽ sửa thành thế này !

Do việc copy dữ liệu diễn ra rất nhanh, nhanh hơn các hàm render dữ liệu nhiều nên hiệu ứng xé màn hình gần như biến mất. Tuy nhiên có thể khắc phục triệt để hơn bằng kĩ thuật lật trang (trong link wiki mình trích bên trên có nói đó nhé)

Thay vì 1 bộ đệm dành cho hàm main, 1 bộ đệm dành cho hàm ngắt hiển thị, sau khi render xong thì copy sang. Thì ở phương pháp lật trang, cả 2 bộ đệm sẽ được sử dụng luôn phiên thay thế nhau. Đầu tiên bộ đệm 1 dùng để hiển thị, bộ đệm 2 được “vẽ”. Sau đó lúc cần update thì chỉ việc “đóng cầu dao” để đảo ngược nhiệm vụ của 2 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” )

Giới thiệu Đào Nguyện 19 bài viết
DIY,chế cháo, viết blog chia sẽ kiến thức về lập trình,điện tử - IoT. Rất mong được giao lưu, kết bạn với các bạn cùng đam mê. Địa chỉ Facebook: https://www.facebook.com/nguyendao207

Hãy bình luận đầu tiên

Để lại một phản hồi

Thư điện tử của bạn sẽ không được hiện thị công khai.