Professional Documents
Culture Documents
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
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ữ
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
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 }
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
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
C
1 int MatrixX,MatrixY;
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 }
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);
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 }
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ị
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.
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ư & thì
đó là lỗi hiển thị, cụ thể 3 kí tự < > & bị biến đổi thành như thế
& là &
< là <
> là >
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
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
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
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
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
TRẢ LỜI
Khách
10 THÁNG BẢY, 2021 TẠI 10:05 CHIỀU
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
TRẢ LỜI
Khách
17 THÁNG NĂM, 2022 TẠI 3:07 CHIỀU
TRẢ LỜI
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