You are on page 1of 16

TỰ HỌC IOT, LẬP TRÌNH NHÚNG

BLOG CHIA SẺ KIẾN THỨC IOT, LẬP TRÌNH VI ĐIỀU KHIỂN, THIẾT KẾ MẠCH ĐIỆN TỬ

TRANG CHỦ IOT  LẬP TRÌNH NHÚNG LED MA TRẬN LCD VÀ GUI

VI ĐIỀU KHIỂN  SẢN PHẨM DIY DONATE

[Matrix LED] Bài 4: Hiển thị TÌM KIẾM …

chữ trên led ma trận 8×32


TƯ VẤN – THIẾT KẾ DỰ ÁN
 11 Tháng Tám, 2019  Đào Nguyện  Ma trận LED  16 ĐIỆN TỬ, LẬP TRÌNH
NHÚNG

QS Tech là công ty chuyên cung


cấp giải pháp công nghệ, mô
hình tự động hóa, dây chuyền
sản xuất, hệ thông IOT, smart
home … Với đội ngũ kĩ thuật
viên chuyên sâu, nhiều kinh
nghiệm sẽ giúp bạn hoàn thành
mục tiêu với chi phí rẻ nhất, thời
gian nhanh nhất với chất lượng
Trong bài này mình sẽ hướng dẫn các bạn làm việc với nhiều led tốt nhất
ma trận hơn để hiển thị chữ cái mình muốn lên màn hình led ma
trận.Cụ thể, chúng ta sẽ làm việc với 4 tấm matrix led 8×8, tức là led
ma trận 8×32

Giới thiệu IC mở rộng ngõ ra


74hc595
Do dùng tới 4 tấm nên 32 chân của 89s52 không thể đủ để điều
khiển. Mình sẽ cần tới sự hỗ trợ của ic mở rộng ngõ ra 74hc595,
hay còn gọi là thanh ghi dịch 8 bit
BÀI VIẾT MỚI

[LCD và GUI] Bài 4: Tìm hiểu về


GUI

[LCD và GUI] Bài 3: Hiển thị văn


bản và tiếng Việt
[IoT] Bài 11: Cập nhật thông tin
wifi từ xa cho esp8266

[LCD và GUI] Bài 2: Tìm hiểu


màn hình LCD TFT 1.8 inch
ST7735 ( phần 1)
Bit Band trên STM32
[IoT] Bài 10: Cập nhật chương
trình cho esp8266 từ xa qua
internet (FOTA)

Bài 0: Làm quen và cài đặt


proteus và KeilC 4.0 để lập trình
cho các dòng chip 8051

Giao tiếp USB HID trên stm32


với c# window form
Còn ic này cũng thuộc vào dòng kinh điển rồi, trên mạng cũng rất Nhúng và phát âm thanh trên
nhiều bài viết nói về ic này nên mình không nói lại nữa. Các bạn STM32 với DMA và PWM
chưa biết có thể tham khảo tại đây:
Giao tiếp với module thẻ từ RFID
https://codientu.org/threads/74hc595-su-thong-dung-va- RC522
cach-dung.196/
http://arduino.vn/bai-viet/113-dieu-khien-8-den-led-sang- CHUYÊN MỤC
nhap-nhay-theo-y-muon-cua-ban-de-hay-kho
http://www.payitforward.edu.vn/forum/threads/1406/ 8051
Chưa được phân loại
Với ic mở rộng ngõ ra 74hc595. Chỉ với 3 chân của vi điều khiển,
chúng ta có thể mở rộng ra vô cực chân theo ý thích. Nhưng nhược Ethernet
điểm của nó là làm chậm tốc độ của vi điều khiển đi do dữ liệu
IoT tutorial
được chuyển tự dạng song song sang nối tiếp. Hãy tượng tượng
như kiểu dữ liệu của bạn phải xếp hàng để đẩy đi lần lượt từng bit Lập trình nhúng
một thay vì tất cả đi cùng nhau đến đích vậy.
LCD và GUI
Do vậy, hãy tính toán số lượng chân mở rộng cho hợp lí với tốc độ Ma trận LED
của MCU, nếu không bạn sẽ phải giảm tần số quét xuống dẫn tới
Sản phẩm
hình ảnh hiển thị không được đẹp. Nếu cố tình tăng tần số quét lên
thì MCU dành hết tài nguyên cho việc quét led, sẽ không thể làm Vi điều khiển
được việc khác.
WIFI-ESP8266
Project này. Mình sẽ sử dụng 1 Port của 89s52 để quét led và 4 con
74hc595 mắc nối tiếp để mở rộng ngõ ra. Như vậy, tổng số chân PHẢN HỒI GẦN ĐÂY
cần dùng chỉ là 11 chân.
Khách trong [IoT] Bài 10: Cập
Sơ đồ nguyên lí nhật chương trình cho esp8266
từ xa qua internet (FOTA)
Khách trong [Matrix LED] Bài 4:
Hiển thị chữ trên led ma trận
8×32
NK trong [Matrix LED] Bài 15:
Điều chế độ rộng xung trên LED
ma trận FULL
Khách trong [Matrix LED] Bài 11:
Tìm hiểu module LED ma trận
P10 Full Color – lập trình led
matrix full color
Khách trong [ENC28J60] Bài 7:
3 chân mở rộng ngõ ra sẽ được nối vào IC74hc595 và 32 đầu ra nối
Giao thức ARP ( phần 2)
vào 32 cột LED
8 chân âm quét hàng sẽ được nối vào PORT P2 để quét hàng. Do Khách trong [Matrix LED] Bài 6:
vậy phương pháp quét vẫn là 1/8 Đồng hồ matrix 8×40 hiệu ứng
Thạch anh mình sử dụng sẽ là 24Mhz để đảm bảo tốc độ nhanh lật trang đơn giản
nhất có thể
Khách trong [Matrix LED] Bài 6:
Đồng hồ matrix 8×40 hiệu ứng
Xây dựng bộ font ASCII lật trang đơn giản

Mình sẽ lại dùng phần mềm LCD font maker để tạo font Khách trong [Matrix LED] Bài 6:
Các bạn để ý sẽ thấy các chân có trọng số cao ( Q7 -> Q0 ) nối với Đồng hồ matrix 8×40 hiệu ứng
các led từ trái sang phải. Do vậy led bên trái sẽ có trọng số cao hơn lật trang đơn giản
bên phải. Hãy setup ở phần mềm LCD font maker sao cho pixel bên Khách trong [Matrix LED] Bài 4:
trái là bit cao hơn Hiển thị chữ trên led ma trận
8×32
Hoàng Dũng trong [Matrix LED]
Bài 12: Thay đổi kích thước font
chữ

Chọn dòng 1 nhé

Giờ hãy tạo bộ font theo đúng thứ tự của mã ASCII, bắt đầu từ kí tự
Space. Đây là bộ font mình đã lấy sẵn
1 unsigned char code font[][8]=
2 {
3 0x00,0x00,0x00,0x00,0x00,0x00,0x00, //  32
4 0x10,0x38,0x38,0x10,0x10,0x00,0x10, //! 33
5 0x6C,0x6C,0x48,0x00,0x00,0x00,0x00, //" 34
6 0x00,0x28,0x7C,0x28,0x28,0x7C,0x28, //# 35
7 0x20,0x38,0x40,0x30,0x08,0x70,0x10, //$ 36
8 0x64,0x64,0x08,0x10,0x20,0x4C,0x4C, //% 37
9 0x20,0x50,0x50,0x20,0x54,0x48,0x34, //& 38
10 0x30,0x30,0x20,0x00,0x00,0x00,0x00, //' 39
11 0x10,0x20,0x20,0x20,0x20,0x20,0x10, //( 40
12 0x20,0x10,0x10,0x10,0x10,0x10,0x20, //) 41
13 0x00,0x28,0x38,0x7C,0x38,0x28,0x00, //* 42
14 0x00,0x10,0x10,0x7C,0x10,0x10,0x00, //+ 43
15 0x00,0x00,0x00,0x00,0x00,0x30,0x30, //, 44
16 0x00,0x00,0x00,0x7C,0x00,0x00,0x00, //- 45
17 0x00,0x00,0x00,0x00,0x00,0x30,0x30, //. 46
18 0x00,0x04,0x08,0x10,0x20,0x40,0x00, /// 47
19 0x38,0x44,0x4C,0x54,0x64,0x44,0x38, //0 48
20 0x00,0x04,0x08,0x10,0x20,0x40,0x00, //1 49
21 0x38,0x44,0x04,0x18,0x20,0x40,0x7C, //2 50
22 0x38,0x44,0x04,0x38,0x04,0x44,0x38, //3 51
23 0x08,0x18,0x28,0x48,0x7C,0x08,0x08, //4 52
24 0x7C,0x40,0x40,0x78,0x04,0x44,0x38, //5 53
25 0x18,0x20,0x40,0x78,0x44,0x44,0x38, //6 54
26 0x7C,0x04,0x08,0x10,0x20,0x20,0x20, //7 55
27 0x38,0x44,0x44,0x38,0x44,0x44,0x38, //8 56
28 0x38,0x44,0x44,0x3C,0x04,0x08,0x30, //9 57
29 0x00,0x00,0x30,0x30,0x00,0x30,0x30, //: 58
30 0x00,0x00,0x30,0x30,0x00,0x30,0x30, //; 59
31 0x08,0x10,0x20,0x40,0x20,0x10,0x08, //< 60
32 0x00,0x00,0x7C,0x00,0x00,0x7C,0x00, //= 61
33 0x20,0x10,0x08,0x04,0x08,0x10,0x20, //> 62
34 0x38 0x44 0x04 0x18 0x10 0x00 0x10 //? 63

Xây dựng module ngắt hiện thị dữ


liệu từ bộ đệm
Do có 8×32 con LED nên sẽ cần 8×32 bit dữ liệu cho bộ đệm. Mà cứ
8 bit là 1 byte nên ta cần 32byte cho bộ đệm. Có 2 cách để thiết lập
bộ đệm như sau:

1. unsigned char Buffer_display[32];


2. unsigned char Buffer_display[8][4];

Với cách 1: bộ đệm sẽ là mảng 1 chiều, còn cách 2 thì là mảng 2


chiều. Mình sẽ khởi tạo mảng với 2 chiều để việc thao tác với mảng
dễ dàng thuận tiện hơn
Mối quan hệ giữa bộ đệm và LED thật

Bây giờ xây dựng hàm ngắt để đẩy data ra. Có thể nói hàm ngắt y
chang như ở bài 3, chỉ khác 1 chút ở chỗ đẩy dữ liệu ra IO thôi. Mà
IO ở đây là 4 con ic74hc595 nối tiếp nên trước tiên dựng 1 hàm đẩy
dữ liệu ra HC595 nhé

C
1 #define DAT P2_1
2 #define LAT P2_2
3 #define SCK P2_3
4 void hc595_out(unsigned char byte)
5 {
6 int i;
7 for(i=0;i<8;i++)
8 {
9 DAT = byte & (0x80>>i);
10 SCK=0;SCK=1;
11 }
12 }

Hàm ngắt Timer1 bắn dự liệu trong bộ đệm ra


1 void T1_ISR() interrupt 3 // Dung timer 1 de quet led C
mat
2 {
3 static unsigned char z ; // Bien dem
4 P3=0xFF;              //tat het LED
5 hc595_out(Buffer_display[z][0]); //lay du lieu trong bo
6 hc595_out(Buffer_display[z][1]); //lay du lieu trong bo
7 hc595_out(Buffer_display[z][2]); //lay du lieu trong bo
8 hc595_out(Buffer_display[z][3]); //lay du lieu trong bo
9 LAT=0;LAT=1; //chot du lieu
10 P3=maquet[z];         //cho phep LED sang
11 z++;if(z==8)z=0;
12 TH1=0xFC; // Nap gia tri cho TH1
13 TL1=0x17; // Nap gia tri cho TL1
14 }

Vậy là xong, công việc hiển thị đã có ngắt lo. Bây giờ chúng ta chỉ
việc xây dựng các hàm để bắn dữ liệu vào bộ đệm.

C
1 void Matrix_guikitu(unsigned char txt)
2 {
3 int i;
4 for(i=0;i<7;i++)
5 {
6 Buffer_display[i][0] = font[txt-32][i];
7 }
8 }

Hãy thử gọi hàm này trong main để in ra chữ ‘A’ nhé !

Matrix_guikitu(‘A’);

Giải thích

Hàm này yêu cầu nạp vào biến txt chính là kí tự mà ta muốn in ra.
Vòng lặp for tới 7 vì mỗi kí tự được tạo với font gồm 7 byte data.
Chúng ta phải trừ txt đi 32 vì mảng font của ta bắt đầu từ 0 nhưng
mã ascii lại bắt đầu từ 32. Do vậy phải trừ đi để 2 font này trùng
khớp nhau.
Giờ hãy để ý số 0 trong bộ đệm Buffer_display, nó đại diện cho tấm
matrix thứ 1 ngoài cùng bên trái. Nếu ta điền vô đó là 1 thì nó sẽ in
ra tấm matrix thứ 2. Tương tự …

Do vậy, mình sẽ chỉnh thêm 1 chút đó là thêm 1 biến vị trí được nạp
vào hàm để chọn tấm matrix ta sẽ in ra

C
1 void Matrix_guikitu(int vitri,unsigned char txt)
2 {
3 int i;
4 for(i=0;i<7;i++)
5 {
6 Buffer_display[i][vitri] = font[txt-32][i];
7 }
8 }

Gọi lệnh
Matrix_guikitu(2,’A’)
;
Giờ thi chữ ‘A’ đã
được in ở tấm thứ 3
Tiếp tục, mình sẽ xây dựng 1 hàm gửi chuỗi kí tự

C
1 void Matrix_guichuoi(unsigned char *s)
2 {
3 int vitri=0;
4 while(*s)
5 {
6 Matrix_guikitu(vitri++,*s);
7 if(vitri==4)return;
8 s++;
9 }
10 }

Hàm này thực chất chỉ là gọi lại hàm Matrix_guikitu nhiều lần. Vòng
lặp while sẽ lặp cho tới khi gặp NULL để thoát. Mỗi lần in sẽ tăng
biến vitri lên 1 tấm. Do chỉ có 4 tấm matrix lên mình chỉ in đc có 4 kí
tự. Vậy nên mình để thêm 1 dòng lệnh kiểm tra nếu đã in đủ 4 kí tự
thì thoát

Giờ test thử hàm này nhé

Matrix_guichuoi(“A
BCD”);

FULL code
C
12 0x10,0x38,0x38,0x10,0x10,0x00,0x10, //! 33
13 0x6C,0x6C,0x48,0x00,0x00,0x00,0x00, //" 34
14 0x00,0x28,0x7C,0x28,0x28,0x7C,0x28, //# 35
15 0x20,0x38,0x40,0x30,0x08,0x70,0x10, //$ 36
16 0x64,0x64,0x08,0x10,0x20,0x4C,0x4C, //% 37
17 0x20,0x50,0x50,0x20,0x54,0x48,0x34, //& 38
18 0x30,0x30,0x20,0x00,0x00,0x00,0x00, //' 39
19 0x10,0x20,0x20,0x20,0x20,0x20,0x10, //( 40
20 0x20,0x10,0x10,0x10,0x10,0x10,0x20, //) 41
21 0x00,0x28,0x38,0x7C,0x38,0x28,0x00, //* 42
22 0x00,0x10,0x10,0x7C,0x10,0x10,0x00, //+ 43
23 0x00,0x00,0x00,0x00,0x00,0x30,0x30, //, 44
24 0x00,0x00,0x00,0x7C,0x00,0x00,0x00, //- 45
25 0x00,0x00,0x00,0x00,0x00,0x30,0x30, //. 46
26 0x00,0x04,0x08,0x10,0x20,0x40,0x00, /// 47
27 0x38 0x44 0x4C 0x54 0x64 0x44 0x38 //0 48
27 0x38,0x44,0x4C,0x54,0x64,0x44,0x38, //0 48
28 0x00,0x04,0x08,0x10,0x20,0x40,0x00, //1 49
29 0x38,0x44,0x04,0x18,0x20,0x40,0x7C, //2 50
30 0x38,0x44,0x04,0x38,0x04,0x44,0x38, //3 51
31 0x08,0x18,0x28,0x48,0x7C,0x08,0x08, //4 52
32 0x7C,0x40,0x40,0x78,0x04,0x44,0x38, //5 53
33 0x18,0x20,0x40,0x78,0x44,0x44,0x38, //6 54
34 0x7C,0x04,0x08,0x10,0x20,0x20,0x20, //7 55
35 0x38,0x44,0x44,0x38,0x44,0x44,0x38, //8 56
36 0x38,0x44,0x44,0x3C,0x04,0x08,0x30, //9 57
37 0x00,0x00,0x30,0x30,0x00,0x30,0x30, //: 58
38 0x00,0x00,0x30,0x30,0x00,0x30,0x30, //; 59
39 0x08,0x10,0x20,0x40,0x20,0x10,0x08, //< 60
40 0x00,0x00,0x7C,0x00,0x00,0x7C,0x00, //= 61
41 0x20,0x10,0x08,0x04,0x08,0x10,0x20, //> 62
42 0x38,0x44,0x04,0x18,0x10,0x00,0x10, //? 63
43 0x38,0x44,0x5C,0x54,0x5C,0x40,0x38, //@ 64
44 0x38,0x44,0x44,0x44,0x7C,0x44,0x44, //A 65
45 0 78 0 44 0 44 0 78 0 44 0 44 0 78 //B 66

Đến đây cũng có thể nói là xong rồi. Nhưng hãy để ý các chữ của
chúng ta cách nhau khá xa. Hãy tùy biến hàm gửi kí tự lại 1 chút để
nhìn chữ đẹp hơn và có thêm không gian để hiện đc nhiều kí tự
hơn nhé ! Chúng ta cũng thể hiện thị chữ thoải mái ở bất kì vị trí
nào trên màn hình

Các bạn nên hiểu kĩ code bên trên trước khi đọc tiếp

Điều khiển matrix bằng tọa độ pixel


Đầu tiên mình khai báo hai biến toàn cục
MatrixX, MatrixY

C
1 int MatrixX,MatrixY;

Viết 1 hàm để set vị trí con trỏ màn hình

C
1 void Matrix_chonvitri(int x,int y)
2 {
3 MatrixX=x;
4 MatrixY=y;
5 }

Hàm Set pixel, hàm này có nhiệm vụ làm sáng hoặc tắt 1 con LED ở
tọa độ nào đó trên màn hình

C
1 void Matrix_setpx(int x,int y,char color)
2 {
3         if(x>31 || y>7 || x<0 || y < 0)return;
4 if(color)Buffer_display[y][x/8] |= (0x80 >> (x%8));  /
5 else Buffer_display[y][x/8] &= ~(0x80 >> (x%8));     /
6 }

Tham số đầu tiền là tọa độ x, tiếp theo là tọa độ y, cuối cùng là


trạng thái bật hay tắt
color = 0 là tắt
color = 1 là bật
Mình có thêm 1 lệnh kiểm tra if(x>31 || y>7 || x<0 || y < 0)return;
có nghĩa là nếu tọa độ cần set vọt lố ra ngoài chiều dài tối đa và
chiều rộng tối của tấm LED thì sẽ thoát luôn !
Nhắc tới tọa độ lại phải nhắc tới hệ tọa độ và gốc tọa độ. Mình đã
chọn gốc tọa độ ở trên cùng phía bên trái của màn hình LED

Gốc tọa độ bắt đầu từ 0. Do đó con led trên cùng bên trái sẽ có tọa độ
(0,0)

Matrix_setpx(0,0,1);

Khi chạy hàm này thì con


led ở tọa độ 0,0 đã sáng

Giờ thì viết lại hàm Matrix_guikitu nhé !

C
1 void Matrix_guikitu(unsigned char txt)
2 {
3 int x,y;
4 for(y=MatrixY;y<7+MatrixY;y++)
5 {
6 for(x=MatrixX;x<6+MatrixX;x++)
7 {
8 Matrix_setpx(x,y,1);
9 }
10 }
11 }

Thử test hàm này nào

Matrix_chonvitri(0,0);
Matrix_guikitu(‘A’);

Các bạn có thể thấy vùng không gian mà chữ ‘A’ chiếm chỗ bắt đầu
từ tọa độ (0,0) do mình set vị trí con trỏ hiên tại là (0,0). Các bạn hãy
thử test vị trí chỗ khác xem nhé !

Nhưng tại sao chữ A chưa hiện. Vì code trên mình chỉ gọi hàm
Matrix_setpx(x,y,1); làm cho led sáng hết. Giờ phải quyết định xem
led nào sáng , led nào tắt bằng cách đọc từ bộ font ra

C
void Matrix_guikitu(unsigned char txt)
{
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-Matri
else Matrix_setpx(x,y,0);
}
}
MatrixX+=6; //sau khi in xong thi tang con tro vi tri l
}

Matrix_chonvitri(0,0
);
Matrix_guikitu(‘A’);

Nếu thấy đoạn code trên khó hiểu, hãy thử thay giá trị của các
biến, xóa biến này biến kia đi và quan sát sự thay đổi. Các bạn
sẽ tự hiểu ngay thôi !

Matrix_chonvitri(-3,
0);
Matrix_guikitu(‘A’);
Các bạn có thể chọn ví trí âm thoải mái nhé ! Lúc đó chữ sẽ bị cắt
bớt đi 1 phần và lọt ra ngoài không gian hiển thị

OK, giờ viết lại hàm gửi chuỗi kí tự nào

C
1 void Matrix_guichuoi(unsigned char *s)
2 {
3 while(*s)
4 {
5 Matrix_guikitu(*s);
6 s++;
7 }
8 }

Hàm này thực chất cũng chỉ là gọi lại hàm Matrix_guikitu nhiều lần

Matrix_chonvitri(0,1);
Matrix_guichuoi(“IoT47”);
FULL CODE
C
54 0x38,0x10,0x10,0x10,0x10,0x10,0x38, //I 73
55 0x04,0x04,0x04,0x04,0x44,0x44,0x38, //J 74
56 0x44,0x48,0x50,0x60,0x50,0x48,0x44, //K 75
57 0x40,0x40,0x40,0x40,0x40,0x40,0x7C, //L 76
58 0x44,0x6C,0x54,0x44,0x44,0x44,0x44, //M 77
59 0x44,0x64,0x54,0x4C,0x44,0x44,0x44, //N 78
60 0x38,0x44,0x44,0x44,0x44,0x44,0x38, //O 79
61 0x78,0x44,0x44,0x78,0x40,0x40,0x40, //P 80
62 0x38,0x44,0x44,0x44,0x54,0x48,0x34, //Q 81
63 0x78,0x44,0x44,0x78,0x48,0x44,0x44, //R 82
64 0x38,0x44,0x40,0x38,0x04,0x44,0x38, //S 83

65 0x7C,0x10,0x10,0x10,0x10,0x10,0x10, //T 84
66 0x44,0x44,0x44,0x44,0x44,0x44,0x38, //U 85
67 0x44,0x44,0x44,0x44,0x44,0x28,0x10, //V 86
68 0x44,0x44,0x54,0x54,0x54,0x54,0x28, //W 87
69 0x44,0x44,0x28,0x10,0x28,0x44,0x44, //X 88
70 0x44,0x44,0x44,0x28,0x10,0x10,0x10, //Y 89
71 0x78,0x08,0x10,0x20,0x40,0x40,0x78, //Z 90
72 0x38,0x20,0x20,0x20,0x20,0x20,0x38, //[ 91
73 0x00,0x40,0x20,0x10,0x08,0x04,0x00, //\ 92
74 0x38,0x08,0x08,0x08,0x08,0x08,0x38, //] 93
75 0x10,0x28,0x44,0x00,0x00,0x00,0x00, //^ 94
76 0x00,0x00,0x00,0x00,0x00,0x00,0x7C, //_ 95
77 0x30,0x30,0x10,0x00,0x00,0x00,0x00, //` 96
78 0x00,0x00,0x38,0x04,0x3C,0x44,0x3C, //a 97
79 0x40,0x40,0x78,0x44,0x44,0x44,0x78, //b 98
80 0x00,0x00,0x38,0x44,0x40,0x44,0x38, //c 99
81 0x04,0x04,0x3C,0x44,0x44,0x44,0x3C, //d 100
82 0x00,0x00,0x38,0x44,0x78,0x40,0x38, //e 101
83 0x18,0x20,0x20,0x78,0x20,0x20,0x20, //f 102
84 0x00,0x3C,0x44,0x44,0x3C,0x04,0x38, //g 103
85 0x40,0x40,0x70,0x48,0x48,0x48,0x48, //h 104
i

Tổng kết
Các bạn có thể tải về toàn bộ file cho bài này Tại đây
Nếu chưa hiểu code, cách tốt nhất là tải project của mình về, thử
thay đổi các giá trị data, biến, cắt bớt vòng lặp, tưởng tượng cách
thực thi của các vòng lặp để nhận thấy sự khác biệt là sẽ hiểu được
cách hoạt động của code thôi

Các bạn nên đọc các bài viết của mình từ bài 1 sẽ dễ hiểu hơn
là đọc tắt, nhảy bài. Vì các bài đều có sự liên quan và có lộ
trình !

Trong bài tiếp theo mình sẽ hướng dẫn về các hiệu ứng chạy chữ,
lật chữ …

Related posts:
[Matrix LED] Bài 10: Kĩ thuật [Matrix LED]Bài 13: Thiết kế
PWM – Điều chế động rộng bộ font tiếng việt
bằng phương pháp B.A.M

Thuật toán FFT cho mạch [Matrix LED] Bài 20: Quét
nháy theo nhạc led bằng DMA

Thích Chia sẻ 3 người thích nội dung này. Đăng kýđể xem những gì bạn bè của
bạn thích.

 MATRIX 8X32 MATRIX LED

Từ tác giả:

Nếu có bất kì thắc mắc nào trong bài viết, vui lòng để lại comment
dưới mỗi bài ! Mình sẽ không trả lời thắc mắc của các bạn ở
facebook hay email !

Nếu trong phần code bạn nhìn thấy nhưng thứ kiểu như &amp; thì
đó là lỗi hiển thị, cụ thể 3 kí tự < > & bị biến đổi thành như thế
&amp; là &
&lt;  là <
&gt; là >

Giới thiệu Đào Nguyện  71 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

16 BÌNH LUẬN
Adolfo Catus
10 THÁNG BA, 2020 TẠI 1:22 CHIỀU

You have touched some nice points here. Any way keep up
wrinting.

 TRẢ LỜI

Tuấn Anh Lê
19 THÁNG TƯ, 2020 TẠI 4:24 CHIỀU

unsigned char Buffer_display[8][4]; mình chưa hiểu cái này từ đâu


ra? Giải thích giúp mình vs.

 TRẢ LỜI

Đào Nguyện 
25 THÁNG TƯ, 2020 TẠI 1:55 SÁNG

đây là khai báo mảng lưu dữ liệu bật tắt của các con led

 TRẢ LỜI

Trần Thanh Bình


6 THÁNG NĂM, 2020 TẠI 4:19 CHIỀU

Cái mảng đó giống mảng tam để chứa các giá trị của cột của 1
con led ma trận đó ạ

 TRẢ LỜI

Trần Thanh Bình


6 THÁNG NĂM, 2020 TẠI 4:21 CHIỀU

Ad ơi.
Cho em hỏi cái điều kiện này là sao vậy ạ.
(font[txt-32][y-MatrixY] & (0x80>>(x-MatrixX))

 TRẢ LỜI
Đào Nguyện 
10 THÁNG NĂM, 2020 TẠI 12:05 CHIỀU

Ví dụ font có byte data là 0xA5 = 10100101 nằm ở tọa độ n m


txt phải -32 vì mã ascii bắt đầu từ 32 ( trong khi font bắt đầu từ
0)
y-MatrixY và (x-MatrixX : Do x,y là tọa độ trên màn led, trong khi
tọa độ của font bắt đầu từ 0 nên mình – đi để căn chỉnh lại
đúng tọa độ font về vị trí n m => chính là byte 0xA5 ví dụ bên
trên
Sau khi lấy được mã font chính xác là 0xA5 mình sẽ cần lấy
chính xác bit của nó bằng cách cho & với 0x80 dịch trái 1 lượng

 TRẢ LỜI

Hieu Hoang
16 THÁNG SÁU, 2020 TẠI 10:08 CHIỀU

hc595_out(Buffer_display[z][0]);
hc595_out(Buffer_display[z][1]);
hc595_out(Buffer_display[z][2]);
hc595_out(Buffer_display[z][3]);
chỉ với 1 hàm hc595_out làm sao để ic biết mà xuất ra lần lượt 4
con hc595 ạ, e không thấy phần nào là chỉ định con hc595 nào
nhận dat để xuất.

 TRẢ LỜI

Đào Nguyện 
16 THÁNG SÁU, 2020 TẠI 10:29 CHIỀU

dữ liệu đẩy ra hc595 là nối tiếp mà bạn, cứ xếp hàng đẩy lần
lượt ra thôi. byte nào đẩy trước thì là cho con cuối

 TRẢ LỜI

Khách
23 THÁNG SÁU, 2020 TẠI 8:21 SÁNG

Mình thấy mạch test cùng OK, nhưng vẫn đề lên mạch thực điện áp
cấp sao hả bạn. Giả sử mình muốn mở thêm 1;2 tấm nữa thì áp cấp
ra sao.

Ả Ờ
 TRẢ LỜI

Đào Nguyện 
23 THÁNG SÁU, 2020 TẠI 2:44 CHIỀU

m không giỏi về mảng điện tử lắm đâu. bạn có thể dùng


transistor để kích cho led sáng đều đẹp

 TRẢ LỜI

Khách
10 THÁNG BẢY, 2021 TẠI 10:05 CHIỀU

có thể dùng timer của pic để quét matrix đc ko a

 TRẢ LỜI

Khách
21 THÁNG BẢY, 2021 TẠI 9:32 CHIỀU

cho em xin code assembly dc ko anh, em còn 1 tuần nữa nộp bài r

 TRẢ LỜI

Khách
7 THÁNG MƯỜI MỘT, 2021 TẠI 7:51 CHIỀU

anh còn đó k ạ

 TRẢ LỜI

Khách
10 THÁNG MƯỜI HAI, 2021 TẠI 7:38 SÁNG

Bạn cho mính hỏi txt – 32 là sao nhỉ, mình chưa hiểu lắm

 TRẢ LỜI
Khách
9 THÁNG HAI, 2022 TẠI 4:06 SÁNG

void Matrix_setpx(int x,int y,char color)


{
if(x>31 || y>7 || x<0 || y > (x%8)); //sáng led
else Buffer_display[y][x/8] &= ~(0x80 >> (x%8)); //tắt led
}
Mình không hiểu ý nghĩa của [y][x/8] . Ban có thể giải thích cho
mình 1 chút về nó được không?

 TRẢ LỜI

Khách
17 THÁNG NĂM, 2022 TẠI 3:07 CHIỀU

Bài viết rất hay và tâm huyết!

 TRẢ LỜI

Để lại bình luận


Nhập bình luận ở đây...

IOT47 BLOG LIÊN HỆ – HỖ TRỢ LIÊN KẾT ỦNG HỘ

Blog chuyên chia sẽ kiến ✉  ▶ Kênh DIY, làm mạch Nếu thấy cái bài viết hữu
thức về IoT, lập trình daonguyen20798@gmail. điện tử ích, các bạn có thể ủng
nhúng, được lập vào com ▶ Kênh tổng hợp video 💰
hộ cho mình tại tài
tháng 8/2019 bởi Đào ☎   0394733311 từ blog khoản:
Nguyện F    ▶ https://qstech.vn/ VIETCOMBANK CHƯƠNG
fb.com/nguyendao207 DƯƠNG
STK: 0541000289275
DAO VAN NGUYEN

Copyright © 2019 | Website thiết kế bởi Đào Nguyện | Theme MH Magazine Lite

You might also like