Bài 2: Lập Trình Led Matrix 8x8 Hiện Thị Chữ - IoT47

Lập trình led matrix 8×8, tiếp nối bài trước, trong bài này mình sẽ hướng dẫn các bạn lập trình led matrix 8×8 hiển thị 1 kí tự bất kì như số hoặc chữ. Mình sẽ test với chữ A nhé.

1. Tạo font cho chữ A

mã led ma trận
Font chữ A lấy theo hàng ngang ! LED sáng = 1 LED tắt =0

Sau khi lấy được 8bit mã nhị phân tương ứng với các trạng thái bật tắt của LED. Mình đổi sang mã hex để viết cho gọn

2. Thiết kế mạch nguyên lí proteus

lập trình led ma trận 8x8

Do trong mô phỏng không cần sử dụng điện trở hay transistor để khuyếch đại công suất nên mình sẽ nối trực tiếp các chân IO của vi điều khiển vào tấm led ma trận 8×8 màu đỏ. Ở đây, 8 chân dương của led mình nối vào port P2, các chân dương sẽ điều khển 8 hàng ngang của tấm LED. 8 chân âm mình nối vào port P3, các chân âm này sẽ điều khiển 8 hàng dọc của biến LED. Lúc nãy mình đã lấy font theo hàng ngang, nên các mã led lấy được sẽ xuất ra port P2. Còn port P3 sẽ lo việc quét ( tức sẽ bật xong tắt, bật xong tắt các chân P3)

OK. Bây giờ viế chương trình nhé ! Đầu tiên mình sẽ tạo 1 hàm delay để làm chậm trễ, nếu không quét nhanh quá mắt mình lại chưa kịp nhìn !

C void delay(unsigned int t) //hàm delay { unsigned int x,y; for(x=0;x<t;x++) { for(y=0;y<123;y++); } }
12345678 voiddelay(unsignedintt)//hàm delay{unsignedintx,y;for(x=0;x<t;x++){for(y=0;y<123;y++);}}

Trong vòng lặp chính, mình sẽ tắt hết cổng P3, đưa mã font và cổng P2, bật chân P3_0 , delay 1 chút cho mắt kịp nhìn. Tiếp tục làm tương tự cho đến P3_7 là hết 1 chu kì quét.Nếu bạn để ý ở trên thì mình có nói nối 8 chân âm led vào P3, có nghĩa là port P3 tích cực âm. Nếu mình đưa các chân port P3 lên 1 thì chắc chắn led sẽ tắt. Do vậy để tắt hết led mình chỉ cần gọi P3=0xFF;

C #include <REGX52.H> void delay(unsigned int t) //hàm delay { unsigned int x,y; for(x=0;x<t;x++) { for(y=0;y<123;y++); } } void main() { while(1) { P3 = 0xFF; //tat toan bo LED P2 = 0x18; //xuat ma led dong 1 P3_0=0; //bat sang dong 1 delay(1); //---------Hien thi xong dong thu 1--------// P3 = 0xFF; //tat toan bo LED P2 = 0x3C; //xuat ma led dong 2 P3_1=0; //bat sang dong 2 delay(1); //---------Hien thi xong dong thu 2--------// P3 = 0xFF; //tat toan bo LED P2 = 0x66; //xuat ma led dong 3 P3_2=0; //bat sang dong 3 delay(1); //---------Hien thi xong dong thu 3--------// P3 = 0xFF; //tat toan bo LED P2 = 0x66; //xuat ma led dong 4 P3_3=0; //bat sang dong 4 delay(1); //---------Hien thi xong dong thu 4--------// P3 = 0xFF; //tat toan bo LED P2 = 0x7E; //xuat ma led dong 5 P3_4=0; //bat sang dong 5 delay(1); //---------Hien thi xong dong thu 5--------// P3 = 0xFF; //tat toan bo LED P2 = 0x7E; //xuat ma led dong 6 P3_5=0; //bat sang dong 6 delay(1); //---------Hien thi xong dong thu 6--------// P3 = 0xFF; //tat toan bo LED P2 = 0x66; //xuat ma led dong 7 P3_6=0; //bat sang dong 7 delay(1); //---------Hien thi xong dong thu 7--------// P3 = 0xFF; //tat toan bo LED P2 = 0x66; //xuat ma led dong 8 P3_7=0; //bat sang dong 8 delay(1); //---------Hien thi xong dong thu 8--------// } }
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 #include <REGX52.H>voiddelay(unsignedintt)//hàm delay{unsignedintx,y;for(x=0;x<t;x++){for(y=0;y<123;y++);}}voidmain(){while(1){P3=0xFF;//tat toan bo LEDP2=0x18;//xuat ma led dong 1P3_0=0;//bat sang dong 1delay(1);//---------Hien thi xong dong thu 1--------//P3=0xFF;//tat toan bo LEDP2=0x3C;//xuat ma led dong 2P3_1=0;//bat sang dong 2delay(1);//---------Hien thi xong dong thu 2--------//P3=0xFF;//tat toan bo LEDP2=0x66;//xuat ma led dong 3P3_2=0;//bat sang dong 3delay(1);//---------Hien thi xong dong thu 3--------//P3=0xFF;//tat toan bo LEDP2=0x66;//xuat ma led dong 4P3_3=0;//bat sang dong 4delay(1);//---------Hien thi xong dong thu 4--------//P3=0xFF;//tat toan bo LEDP2=0x7E;//xuat ma led dong 5P3_4=0;//bat sang dong 5delay(1);//---------Hien thi xong dong thu 5--------//P3=0xFF;//tat toan bo LEDP2=0x7E;//xuat ma led dong 6P3_5=0;//bat sang dong 6delay(1);//---------Hien thi xong dong thu 6--------//P3=0xFF;//tat toan bo LEDP2=0x66;//xuat ma led dong 7P3_6=0;//bat sang dong 7delay(1);//---------Hien thi xong dong thu 7--------//P3=0xFF;//tat toan bo LEDP2=0x66;//xuat ma led dong 8P3_7=0;//bat sang dong 8delay(1);//---------Hien thi xong dong thu 8--------//}}
lập trình led ma trận 8x8

Như vậy là đã hiện được chữ A lên LED matrix. Khá đơn giản phải không ! Bây giờ chúng ta hay tìm cách rút gọn đoạn code trên cho đơn giản, ngắn gọn hơn nhé. Phần mã font xuất ra port P2 mình sẽ đưa vào 1 mảng dữ liệu như sau:

C unsigned char code maled[8]={0x18,0x3C,0x66,0x66,0x7E,0x7E,0x66,0x66};
1 unsignedcharcode maled[8]={0x18,0x3C,0x66,0x66,0x7E,0x7E,0x66,0x66};

Phần mã font xuất ra port 3 mình sẽ đưa vào 1 mảng dữ liệu như sau, mã này thực chất là xuất cả byte ra cổng P3 thay vì xuất từng chân như code trên, miễn sao cho chỉ có 1 chân sáng trong 1 thời điểm !

C unsigned char code maquet[8]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
1 unsignedcharcode maquet[8]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};

Bây giờ chỉ việc tạo 1 vòng lặp for chạy từ 0 đến 7 là đây dữ liệu trong các mảng ra PORT là xong. Đoạn code rất ngắn gọn !

C #include <REGX52.H> unsigned char code maled[8]={0x18,0x3C,0x66,0x66,0x7E,0x7E,0x66,0x66}; unsigned char code maquet[8]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; void delay(unsigned int t) //hàm delay { unsigned int x,y; for(x=0;x<t;x++) { for(y=0;y<123;y++); } } void main() { int i; while(1) { for(i=0;i<8;i++) { P3 = 0xFF; //tat toan bo LED P2 = maled[i]; //xuat ma led dong i P3 = maquet[i]; //bat sang dong i delay(1); //delay de mat kip nhin } } }
123456789101112131415161718192021222324252627 #include <REGX52.H> unsignedcharcode maled[8]={0x18,0x3C,0x66,0x66,0x7E,0x7E,0x66,0x66};unsignedcharcode maquet[8]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; voiddelay(unsignedintt)//hàm delay{unsignedintx,y;for(x=0;x<t;x++){for(y=0;y<123;y++);}}voidmain(){inti;while(1){for(i=0;i<8;i++){P3=0xFF;//tat toan bo LEDP2=maled[i];//xuat ma led dong iP3=maquet[i];//bat sang dong idelay(1);//delay de mat kip nhin}}}

Kết quả vẫn thế 🙂

led matrix 8x8

Bài tiếp theo trong chuỗi tutorial lập trình led matrix 8×8

Related posts:

[Matrix LED] Bài 3: Led ma trận 8x8 đếm từ 0 đến 9[Matrix LED] Bài 9: Kĩ thuật PWM - hiệu ứng led sao băng[Matrix LED] Bài 15: Điều chế độ rộng xung trên LED ma trận FULL[Matrix LED] Bài 1: Làm quen với LED ma trận và phương pháp quét LED

Từ khóa » điều Khiển Led Ma Trận 8x8