[Matrix LED] Bài 11: Tìm Hiểu Module LED Ma Trận P10 Full Color
Có thể bạn quan tâm
Hôm nay chúng ta sẽ làm quen với module led ma trận p10 full color và lập trình led ma trận p10 full color
Module led ma trận P10 Full color 32×16 gồm 32 led hàng ngang và 16 led hàng dọc, bản thân mỗi led bên trong có 3 led với 3 màu RGB, mỗi pixel cách nhau 1cm. Tổng số led RGB là 32×16=512 LED RGB



Chức năng của các chân
R1: Chân data cho màu đỏ của 8 hàng led bên trênR2: Chân data cho màu đỏ của 8 hàng led phía dướiG1: Chân data cho màu xanh lá của 8 hàng led bên trênG2: Chân data cho màu xanh lá của 8 hàng led phía dưới B1: Chân data cho màu xanh dương của 8 hàng led bên trênB2: Chân data cho màu xanh dương của 8 hàng led phía dưới CLK: Chân đẩy data vào ic ghi dịchLAT: Chân chốt data ( đẩy data lưu trong ic ghi dịch ra ngoài led)OE: Chân cho phép bảng led sáng ( OE=0 thì bảng led được phép sáng, OE=1 thì bảng led auto tắt)A,B,C: 3 chân của ic vào 3 ra 8, tức 3 chân dùng để quét led, cho phép hàng nào sáng. Với 3 chân ABC ta điều khiển đc 8 hàng độc lập, nhưng module P10 có tới 16 hàng => trong 1 thời điểm có 2 hàng cùng sáng => module này quét kiểu 2/16 = 1/8=> Trong 1 thời điểm số led RGB ta có thể điều khiển là 512 x 1/8 = 64 LED RGB
Chiều đi của data
Với P10 1 màu, data đi theo chiều zigzac, thì P10 FULL, data đi theo đường thẳng

Các bạn có thể thấy, module này chia ra làm 2 nửa theo chiều ngang, với dữ liệu của 8 hàng trên do RGB1 quyết định, còn 8 hàng dưới do RGB2 quyết định. Chân ABC sẽ quyết định hàng nào trong 8 hàng của cả 2 nửa được sáng.

Demo điều khiển led ma trận P10 7 màu (màu 1bit)
Cũng giống như P10 mình sẽ tạo 1 mảng 2 chiều với 1bit là 1 led
C unsigned char Buffer_display[16][4];| 1 | unsignedcharBuffer_display[16][4]; |
Tuy nhiên mỗi led có tới 3 màu RGB nên mình sẽ thêm 1 chiều màu nữa
C unsigned char Buffer_display[3][16][4];| 1 | unsignedcharBuffer_display[3][16][4]; |
Chương trình truyền data có thể viết như sau:
C void chuyen(unsigned char byte_r1,unsigned char byte_g1,unsigned char byte_b1,unsigned char byte_r2,unsigned char byte_g2,unsigned char byte_b2) { unsigned char i,mask; for(i=0;i<8;i++) { mask=0x80>>i; R1 = byte_r1 & mask; G1 = byte_g1 & mask; B1 = byte_b1 & mask; R2 = byte_r2 & mask; G2 = byte_g2 & mask; B2 = byte_b2 & mask; clk = 0;clk = 1; // Tao xung dich du lieu } }| 123456789101112131415 | voidchuyen(unsignedcharbyte_r1,unsignedcharbyte_g1,unsignedcharbyte_b1,unsignedcharbyte_r2,unsignedcharbyte_g2,unsignedcharbyte_b2){unsignedchari,mask;for(i=0;i<8;i++){mask=0x80>>i;R1=byte_r1&mask;G1=byte_g1&mask;B1=byte_b1&mask;R2=byte_r2&mask;G2=byte_g2&mask;B2=byte_b2&mask;clk=0;clk=1;// Tao xung dich du lieu}} |
Chương trình chọn hàng cần sáng:
C void hang(unsigned char sohang) { switch(sohang) { case 0:{A=0;B=0;C=0;break;} case 1:{A=0;B=0;C=1;break;} case 2:{A=0;B=1;C=0;break;} case 3:{A=0;B=1;C=1;break;} case 4:{A=1;B=0;C=0;break;} case 5:{A=1;B=0;C=1;break;} case 6:{A=1;B=1;C=0;break;} case 7:{A=1;B=1;C=1;break;} } OE=0; //cho phép bảng led sáng }| 123456789101112131415 | voidhang(unsignedcharsohang){switch(sohang){case0:{A=0;B=0;C=0;break;}case1:{A=0;B=0;C=1;break;}case2:{A=0;B=1;C=0;break;}case3:{A=0;B=1;C=1;break;}case4:{A=1;B=0;C=0;break;}case5:{A=1;B=0;C=1;break;}case6:{A=1;B=1;C=0;break;}case7:{A=1;B=1;C=1;break;}}OE=0;//cho phép bảng led sáng} |
Chương trình bỏ trong ngắt timer
C void ngat_quet_led(void) { static unsigned char dem_hang; unsigned char i; OE=1; // tắt hết led trước khi truyền for(i=0;i<4;i++)chuyen(Buffer_display[0][dem_hang][i],Buffer_display[1][dem_hang][i],Buffer_display[2][dem_hang][i],Buffer_display[0][dem_hang+8][i],Buffer_display[1][dem_hang+8][i],Buffer_display[2][dem_hang+8][i]);//truyền data ra bảng led dem_hang++;if(dem_hang==8)dem_hang=0; }| 12345678 | voidngat_quet_led(void){staticunsignedchardem_hang;unsignedchari;OE=1;// tắt hết led trước khi truyềnfor(i=0;i<4;i++)chuyen(Buffer_display[0][dem_hang][i],Buffer_display[1][dem_hang][i],Buffer_display[2][dem_hang][i],Buffer_display[0][dem_hang+8][i],Buffer_display[1][dem_hang+8][i],Buffer_display[2][dem_hang+8][i]);//truyền data ra bảng leddem_hang++;if(dem_hang==8)dem_hang=0;} |
Công việc của bạn là xây dựng lại trên con vi điều khiển mà các bạn xài, thế là xong lớp dưới ! Bây giờ xây dựng 1 vài hàm graphic để thao tác lên buffer nhé
C // 0b0000.0BGR #define BLACK 0x00 #define WHITE 0x07 #define RED 0x01 #define GREEN 0x02 #define BLUE 0x04 #define MAGENTA 0x05 #define YELLOW 0x03 #define CYAN 0x06 //khai báo các byte mặt nạ để lấy ra từng thành phần màu #define R_MASK 0x01 #define G_MASK 0x02 #define B_MASK 0x04| 1234567891011121314 | // 0b0000.0BGR#define BLACK 0x00#define WHITE 0x07#define RED 0x01#define GREEN 0x02#define BLUE 0x04#define MAGENTA 0x05#define YELLOW 0x03#define CYAN 0x06 //khai báo các byte mặt nạ để lấy ra từng thành phần màu#define R_MASK 0x01#define G_MASK 0x02#define B_MASK 0x04 |
Vẫn là hàm set_px cơ bản
C void Matrix_setpx(int32_t x,int32_t y,unsigned char color) { if(x>Graphic_x || y>Graphic_y || x<0 || y < 0)return; if((color&R_MASK)!=0)buffer_display[0][y][x/8] |= (0x80 >> (x%8)); //set R else buffer_display[0][y][x/8] &= ~(0x80 >> (x%8)); //clear R if((color&G_MASK)!=0)buffer_display[1][y][x/8] |= (0x80 >> (x%8)); //set G else buffer_display[1][y][x/8] &= ~(0x80 >> (x%8)); //clear G if((color&B_MASK)!=0)buffer_display[2][y][x/8] |= (0x80 >> (x%8)); //set B else buffer_display[2][y][x/8] &= ~(0x80 >> (x%8)); //clear B }| 123456789101112 | voidMatrix_setpx(int32_tx,int32_ty,unsignedcharcolor){if(x>Graphic_x||y>Graphic_y||x<0||y<0)return;if((color&R_MASK)!=0)buffer_display[0][y][x/8]|=(0x80>>(x%8));//set Relsebuffer_display[0][y][x/8]&=~(0x80>>(x%8));//clear Rif((color&G_MASK)!=0)buffer_display[1][y][x/8]|=(0x80>>(x%8));//set Gelsebuffer_display[1][y][x/8]&=~(0x80>>(x%8));//clear Gif((color&B_MASK)!=0)buffer_display[2][y][x/8]|=(0x80>>(x%8));//set Belsebuffer_display[2][y][x/8]&=~(0x80>>(x%8));//clear B} |
Ví dụ gọi :
C Matrix_setpx(0,7,GREEN); //vẽ điểm ảnh tọa độ 0,7 màu xanh| 1 | Matrix_setpx(0,7,GREEN);//vẽ điểm ảnh tọa độ 0,7 màu xanh |

Hiển thị chữ
Trong bài viết số 4 mình đã tạo sẵn 1 bộ font và hàm để vẽ font ra led, bây giờ chúng ta sẽ sửa lại hàm này 1 chút là có thêm tham số color nữa nhé
C void Matrix_guikitu(unsigned char txt,unsigned char color) { int x,y; for(y=MatrixY;y<7+MatrixY;y++) { for(x=MatrixX;x<6+MatrixX;x++) { if ( (font[txt-32][y-MatrixY] & (0x80>>(x-MatrixX))) != 0)Matrix_setpx(x,y,color); else Matrix_setpx(x,y,0); } } MatrixX+=6; //sau khi in xong thi tang con tro vi tri len }| 12345678910111213 | voidMatrix_guikitu(unsignedchartxt,unsignedcharcolor){intx,y;for(y=MatrixY;y<7+MatrixY;y++){for(x=MatrixX;x<6+MatrixX;x++){if((font[txt-32][y-MatrixY]&(0x80>>(x-MatrixX)))!=0)Matrix_setpx(x,y,color);elseMatrix_setpx(x,y,0);}}MatrixX+=6;//sau khi in xong thi tang con tro vi tri len} |
Giờ hãy thử in chữ A ra màn hình
C Matrix_chonvitri(0,0); //chọn vị trí 0,0 Matrix_guikitu('A',CYAN); //in chữ A ra màn hình với màu CYAN (hơi xanh da trời 1 tí)| 12 | Matrix_chonvitri(0,0);//chọn vị trí 0,0Matrix_guikitu('A',CYAN);//in chữ A ra màn hình với màu CYAN (hơi xanh da trời 1 tí) |

Thử sửa lại thành màu hồng nhé
C Matrix_chonvitri(0,0); //chọn vị trí 0,0 Matrix_guikitu('A',MAGENTA); //in chữ A ra màn hình với màu hồng| 12 | Matrix_chonvitri(0,0);//chọn vị trí 0,0Matrix_guikitu('A',MAGENTA);//in chữ A ra màn hình với màu hồng |

Tiếp tục thêm hàm gửi cả chuỗi nữa:
C void Matrix_guichuoi(unsigned char *s,unsigned char color) { while(*s) { Matrix_guikitu(*s,color); s++; } }| 12345678 | voidMatrix_guichuoi(unsignedchar*s,unsignedcharcolor){while(*s){Matrix_guikitu(*s,color);s++;}} |
| 12 | Matrix_chonvitri(0,5);//chọn vị trí 0,5Matrix_guichuoi("IOT47",YELLOW);//in chữ A ra màn hình với màu vàng |

Tiếp tục, bây giờ mình muốn mỗi chữ in ra 1 màu khác nhau thì sao nhỉ ? Cách làm của mình là khi truyền vào chuỗi mình sẽ truyền thêm 1 mảng chứa màu chứ không phải 1 màu nữa !
C void Matrix_guichuoi_MAKE_COLOR(unsigned char *s,unsigned char *color) { while(*s) { Matrix_guikitu(*s,*color); s++;color++; } }| 12345678 | voidMatrix_guichuoi_MAKE_COLOR(unsignedchar*s,unsignedchar*color){while(*s){Matrix_guikitu(*s,*color);s++;color++;}} |
| 1 | Matrix_guichuoi_MAKE_COLOR((unsignedchar*)"IOT47",(unsignedchar[]){RED,GREEN,BLUE,MAGENTA,WHITE}); |

Thật tuyệt vời phải không :). Mình kiếm mãi mới được tấm P10 để demo cho các bạn xem, thấy hay thì tội gì không cho mình 1 like nhở 🙁
Xem đầy đủ chuỗi bài tutorial lập trình led ma trận full color tại đây
Tham khảo project sử dụng p10 làm đồng hồ led của mình tại đây !
Related posts:
[Matrix LED] Bài 2: Điều khiển lập trình led matrix 8x8 hiển thị kí tự[Matrix LED] Bài 17: Stream video trên module led matrix P5 64x32[Matrix LED] Bài 6: Đồng hồ matrix 8x40 hiệu ứng lật trang đơn giản[Matrix LED] Ngoại truyện #1: Làm sao để làm quen với 1 panel led matrix mới ?Từ khóa » Bảng Led Ma Trận P10 Full Color
-
LED MA TRẬN P10 FULL MÀU (Ngoài Trời)
-
Combo Led Ma Trận P10 Full Màu Ngoài Trời | Shopee Việt Nam
-
Biển Led P10 Full Màu Ngoài Trời 4 Tấm Module | Shopee Việt Nam
-
Bảng Led Ma Trận P10 Full Color
-
Module Ma Trận P10 Full Color Ngoài Trời - LED HIỆP TÂN
-
Nơi Bán Led Module P10 Full Color Giá Rẻ, Uy Tín, Chất Lượng Nhất
-
Bảng Tra Cứu Mạch điều Khiển Led Ma Trận P10
-
Biển Led Matrix, Led Ma Trận P10 Full Màu Ngoài Trời Từ 3 đến 18 Tấm
-
Hướng Dẫn Làm Biển LED FULL COLOR Trang Trí, Quảng Cáo
-
Module Led Ma Trận P10 Full Color Ngoài Trời Uy Tín
-
Combo Biển Led Ma Trận (KT 256*32cm) P10 Full Màu Ngoài Trời
-
Led Ma Trận P10 Full Color Outdoor - Showroom NAMLỰC
-
LED Ma Trận P10 Full Color Trong Nhà Chính Hãng YLR