BÀI 05: LẬP TRÌNH LED MATRIX VỚI 8051
I. Cấu tạo
Hình trên là nguyên lí và cấu tạo của một con led ma trận 8x8, với 8 hàng và 8 cột. Để làm sáng 1 LED, chúng ta cần cấp điện áp VCC và GND vào 2 chân theo nguyên lí bàn cờ vua - vì vậy tốn 2 chân của vi điều khiển để điều khiển một con LED. Với tổng cộng 16 chân của LED matrix , theo cách bình thường chúng ta chỉ điều khiển được 16/2=8 con LED. Mà LED matrix có tất cả 64 LED, cho nên người ta sử dụng phương pháp quét led - giống như đã áp dụng với led 7 đoạn.
II. Phương pháp quét led
Chúng ta sẽ điều khiển 8 led theo hàng 1 hoặc cột 1, sau đó đến hàng 2 hoặc cột 2,.. cứ thế cho đến hàng 8 hoặc cột 8. Vì tốc độ sáng tắt rất nhanh, nên do sự lưu ảnh ở mắt sẽ tạo thành 1 hình ảnh hoàn chỉnh.
Khoảng thời gian quét được gọi là 1 chu kì quét. Lấy nghịch đảo sẽ có được tần số quét, thông thường khoảng 60Hz là ổn, tuy nhiên khuyến khích 120 Hz.
Các loại màn hình cũng dùng phương pháp này, tần số quét được gọi là tần số làm tươi, reset frame. Màn hình có tần số làm tươi càng cao thì có khả năng thực hiện nhiều khung hình hơn, chuyển động mượt mà hơn.
III. Mạch nguyên lí
PORT 2 được dùng để điều khiển 8 hàng LED, PORT 3 dùng để điều khiển 8 cột LED. PORT 2 cấp giá trị theo chân, PORT 3 được dùng đẻ xuất dữ liệu ra LED. Đèn LED sẽ sáng khi chân tương ứng ở PORT 3 có giá trị bằng 0.
IV. Chương trình điều khiển LED Matrix 8x8
Ví dụ hiển thị chữ H (quét theo cột).
Đầu tiên các bạn cần lấy được 8 bit mã nhị phân tương úng với các trạng thái bật tắt của LED để tạo thành font chữ H, sau đó có thể đổi sang mã hex cho gọn. Phẫn mã font này xuất ra P2 và mình sẽ đưa vào 1 mảng dữ liệu như sau:
unsigned char code chuH[]={0x00,0x00,0xE7,0xE7,0xE7,0xE7,0x00,0x00};
Tiếp theo là hàm Delay để làm trễ, nếu không mắt sẽ không kịp nhìn thấy.
void Delay (unsigned int time)
{
while(time--);
}
Trong vòng lặp chính, xuất dữ liệu ra cổng P2, bật chân P3.0, sau đó delay cho mắt kịp nhìn, tắt P3.0.... cứ thế đến P3.7 là hết 1 chu kì quét.
#include<REGX52.H>
unsigned char code chuH[]={0x00,0x00,0xE7,0xE7,0xE7,0xE7,0x00,0x00};
void Delay (unsigned int Time);
void main (void)
{
unsigned char i;
while(1)
{
for (i=0; i<8; i++)
{
P2 = chuH[i];
P3 = 0x01<<i;
Delay(60);
P3 = 0x00;
}
}
void Delay (unsigned int time)
{
while(time--);
}
Các bạn có thể làm tương tự với các kí tự khác. Và mở rộng trên Led matrix có kích thước lớn hơn.