Với 1 ic vi điều khển AT89C51 chỉ có 4 cảng (p0, p1, p2, p3), Bạn chỉ có thể ghép phối hợp tối đa 4 khối ma trân led 8x8, và nếu cho bố trí ngang 8x24 (Xem hình), Bạn sẽ có bảng đèn như hình sau:
Bạn cũng có thể bố trí tạo bảng đèn ma trận 16x16 như hình sau, cách bố trí này cho độ phân giải của một hình cao hơn, do đó Bạn có thể cho in ra các hình cần nhiều ảnh điểm hơn.
Do vậy, trên bảng ma trận 16x16, tôi có thể cho hiện 8 chữ Phật Tại Nhân Tâm - Thế Giới Hòa Bình tức là: 佛在人心。世界和平 ), nếu dùng kiểu 8x24, không đủ số điểm để in các hình chữ phức tạp:
Tóm lại, trước hết Bạn hãy tạo cho mình một bảng đèn dùng khối Led ma trận 8x8. Kế đó xác định các bó 8 dùng nối vào các cảng của ic vi điều khiển AT89C51, Bạn cũng có thể tự làm bản mạch in để hàn các Led siêu sáng trắng hay đỏ, dùng các Led siêu sáng làm bảng đèn sẽ đẹp hơn (vì sau đó Bạn còn phải dùng đến kinh lọc để tăng độ nét cho các điểm sáng). Các bo mạch in này đều có bán tại cửa hàng: Phúc Lan Shop (nếu có nhu cầu Bạn hãy đặt mua về dùng).
(2) Kết hợp ic AT89C51 và các khối Led ma trận 8x8.
Sau đây là cách kết hợp bảng đèn Led 8x24 với ic vi điều khiển AT89C51 (Bạn xem hình)
Giải thích mạch điện: Hình vẽ cho thấy, chân 20 của ic AT89C51 cho nối masse và chân 40 nối với nguồn 5V. Trên chân 18, 19 gắn thạch anh để định tần. Trên chân 9 gắn tụ C1 (10uF) và điện trở 8.2K dùng làm mạch Reset. Chân 31 cho nối vào nguồn 5V để xác định mạch sẽ chỉ làm việc với bộ nhớ trong. 4 cảng của ic AT89C51 cho nối với bảng đèn:
* p1 nối với 8 hàng, trên p1 cho xuất xung quét.
* p2 cho nối với ma trận 8x8 (1) cho xuất mã dữ liệu hình.
* p0 cho nối với ma trận 8x8 (2) cho xuất mã dữ liệu hình.
* p3 cho nối với ma trận 8x8 (3)cho xuất mã dữ liệu hình..
Nhìn chung sơ đồ quá đơn giản, vấn đề gắn các cảng p0, p1, p2, p3 vào bảng đèn cũng không nhất thiết như trên, chúng ta có thể sửa chương trình nguồn, cho xuất tín hiệu ra một cách tùy chọn.
Sau đây là cách kết hợp bảng đèn Led 16x16 với ic vi điều khiển AT89C51 (Bạn xem hình)
Nhìn vào hình vẽ này Bạn dễ dàng biết cách gắn các bó nối 8 bit từ các cảng p0, p1, p2, p3 vào bảng đèn Led ma trận 16x16.
(3) Cách tạo ra mã bit tương ứng với các hình chữ tự chọn.
Dùng bảng để tạo ra mã các con chữ, nó sẽ được cho lấy ra và cho hiện trên bảng đèn Led 8x24.
Thí dụ: Tạo mã cho chữ Kính (Bạn xem hình), đặt tên bảng là b_5.
b_5: ; KINH
db 11111111b
db 11111111b
db 00000001b
db 11101111b
db 11010111b
db 10111011b
db 01111111b
db 11111111b ;
db 00000111b
db 11111101b
db 11111110b
db 00000011b
db 11110111b
db 11101111b
db 11011111b
db 00000011b ;
db 11111111b
db 00000011b
db 11011111b
db 11011111b
db 11011111b
db 00000011b
db 11111111b
db 11111111b ;
Tôi cho tô màu đỏ các bit 0 để làm hiện ra mã bit của chữ Kính.
Thí dụ: Tạo mã cho chữ Chào (Bạn xem hình), đặt tên bảng là b_5a.
b_5a: ; CHAO
db 11111111b
db 10000011b
db 01111101b
db 01111101b
db 01111101b
db 10011011b
db 11111111b
db 00000011b ;
db 11011111b
db 11011111b
db 11011111b
db 00000011b
db 11111111b
db 00001111b
db 11010111b
db 11011011b ;
db 11010110b
db 00001101b
db 11111111b
db 10000111b
db 01111011b
db 01111011b
db 01111011b
db 10000111b ;
Tôi cho tô màu đỏ các bit 0 để làm hiện ra mã bit của chữ Chào.
Cách tạo hình cho các con chữ:
Bạn đặt các mã nhị phân, mỗi dòng 8 bit rồi dùng bit 0 để làm sáng Led. Qua các bit 0, Bạn nhìn thấy các chữ và các hình rồi sẽ hiện ra trên bảng đèn Led 8x24 (Bạn xem hình). Với kiểu tạo chữ và hình này, thì mã quét chung ta cho xuất trên port 1, và các mã hình sẽ cho xuất trên port 2, port 0 và port 3.
Nếu đặt mã quét xuất ra trên các port 2, port 0, port 3, lúc này mã chữ và hình sẽ cho xuất ra trên port 1. Lúc này chúng ta sẽ tạo chữ và hình theo cách thức như sau (Bạn xem hình). Lúc này mã bit làm cho Led sáng sẽ là bit 1, và một dòng là 3 nhóm 8.
Thí dụ: Tạo mã cho hình 2 trái tim (Bạn xem hình), đặt tên bảng là b_11. Đây là mã hình cho trôi dọc.
b_11: ; LOGO trai tim
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b ;
db 00000110b,00000000b,01100000b
db 00001111b,00000000b,11110000b
db 00011111b,10000001b,11111000b
db 00111111b,11000011b,11111100b
db 01111111b,11100111b,11111110b
db 01111001b,11100111b,10011110b
db 00110000b,11000011b,00001100b
db 00000000b,00000000b,00000000b ;
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b ;
Tôi cho tô màu đỏ các bit 1 để làm hiện ra mã bit của hình 2 trái tim (Đây là mã hình cho trôi dọc).
Qua phần trình bày trên tôi nghĩ là Bạn đã biết cách để tạo ra bất cứ hình chữ nào mà Bạn muốn, chỉ có điều Bạn nhớ là với số Led trên bảng ma trận ít, nên khó có thể diễn đạt các hình quá phức tạp, cần nhiều ảnh điểm. Đó là giới hạn chính của loại bảng đèn quang báo này.
Nói với Bạn HA mai, trên bảng mã dưới đây (các dòng mã chưa gắn hình), Bạn hãy gắn vào bit 0 để làm cho các Led trên bảng đèn quang báo của Bạn sáng, tôi nghĩ chắc Bạn sẽ dễ dàng tạo ra được chữ Lớp ĐT 1101.
db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11111111b ;
db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11111111b ;
(vì Bạn chỉ dùng 2 khối Led 8x8, nên để hiện một hình trên đó Bạn sẽ cần dùng đến 16 dòng mã lệnh)
(4) Bây giờ nói đến phần mềm, cách viết chương trình nguồn.
Đây là một chương trình nguồn thực hành (tư liệu cũ, tôi thường dùng trong các lớp dạy thực hành về bảng đèn quang báo), chương trình này cho hiện chữ [Công Ty Thuốc - Thú Y - LAVACO, Kính Chào, Kính Chào Quý Khách...] và chữ chạy từ phải qua trái và các hình Logo cho chạy từ trên xuống dưới. Đây là một dạng bảng hiệu, chúng ta thử phân tích các câu lệnh trong chương trình nguồn này.
org 0000h
num equ 20h
start: call xoa
mov r3, #0
;
;
call k_th ; Ket thuc, dung quet hang, troi xuong
call m_2 ; Cong Ty Thuoc - Thu - Y : LAVACO
call m_1 ; Kinh Chao
call m_3 ; Kinh Chao Quy Khach
call m_22 ; Cong Ty Thuoc - Thu - Y : LAVACO
call tr_t ; Logo hinh trai tim, quet hang
call m_1 ; Kinh Chao
call m_3 ; Kinh Chao Quy Khach
call m_2 ; Cong Ty Thuoc - Thu - Y : LAVACO
call tr_t ; Logo hinh trai tim, quet hang
call m_1 ; Kinh Chao
call m_3 ; Kinh Chao Quy Khach
call m_2 ; Cong Ty Thuoc - Thu - Y : LAVACO
call m_22 ; Cong Ty Thuoc - Thu - Y : LAVACO
call m_2 ; Cong Ty Thuoc - Thu - Y : LAVACO
call m_22 ; Cong Ty Thuoc - Thu - Y : LAVACO
call tr_t ; Logo hinh trai tim, quet hang
call m_1 ; Kinh Chao
call m_2 ; Cong Ty Thuoc - Thu - Y : LAVACO
call kh_d ; Khoi dau, dung quet hang, troi len
call tr_t ; Logo hinh trai tim, quet hang
call m_1 ; Kinh Chao
call m_22 ; Cong Ty Thuoc - Thu - Y : LAVACO
call m_22 ; Cong Ty Thuoc - Thu - Y : LAVACO
call m_22 ; Cong Ty Thuoc - Thu - Y : LAVACO
call m_22 ; Cong Ty Thuoc - Thu - Y : LAVACO
call m_22 ; Cong Ty Thuoc - Thu - Y : LAVACO
call m_22 ; Cong Ty Thuoc - Thu - Y : LAVACO
call m_1 ; Kinh Chao
call tr_t ; Logo hinh trai tim, quet hang
jmp start
;
kh_d:
call xoa
mov num, #3
lamt1: mov dptr, #b_10 ; Logo 5
mov r3, #0
qlai1: mov r2, #40
llai1: call h1c
djnz r2, llai1
inc dptr
inc dptr
inc dptr
inc r3
cjne r3, #16, qlai1
djnz num, lamt1
ret
;
k_th:
call xoa
mov num, #3
lamt2: mov dptr, #b_9 ; Logo 4 hinh giot nuoc
mov r3, #0
qlai2: mov r2, #40
llai2: call h1b
djnz r2, llai2
inc dptr
inc dptr
inc dptr
inc r3
cjne r3, #16, qlai2
djnz num, lamt2
ret
;
tr_t:
call xoa
mov num, #4
lamt3: mov dptr, #b_11 ; Logo hinh trai tim
mov r3, #0
qlai3: mov r2, #40
llai3: call h1b
djnz r2, llai3
inc dptr
inc dptr
inc dptr
inc r3
cjne r3, #16, qlai3
djnz num, lamt3
ret
;
jmp start
m_1:
call xoa
ttuc: mov dptr, #b_5 ; KINH
mov r4, #0ffh
ttd: call h1
djnz r4, ttd
;
call xoa
mov dptr, #b_5a ; CHAO
mov r4, #0ffh
ttd1: call h1
djnz r4, ttd1
ret
;
m_2:
call xoa
mov dptr, #b_1 ; Cong Ty Thuoc - Thu - Y : LAVACO
la1: mov r4, #15
ql1: call h1
djnz r4, ql1
inc dptr
inc r3
cjne r3, #142, la1 ; 166-24=142
mov r3, #0
ret
;
m_22:
call xoa
mov dptr, #b_1 ; Cong Ty Thuoc - Thu - Y : LAVACO
la11: mov r4, #5
ql11: call h1
djnz r4, ql11
inc dptr
inc r3
cjne r3, #142, la11 ; 166-24=142
mov r3, #0
ret
;
m_3:
call xoa
mov dptr, #b_6 ; KINH CHAO QUY KHACH...
la6: mov r4, #10
ql6: call h1
djnz r4, ql6
inc dptr
inc r3
cjne r3, #95, la6 ; 103-24=79
mov r3, #0
ret
;
h1:
mov r0, #00000001b
mov r1, #00h
ll1: mov a, r0
rr a
mov r0, a
mov p0, r0
mov a, r1
movc a, @a + dptr
mov p1, a
inc r1
call del1
call del1
call xoa
call del1
cjne r0, #00000001b, ll1
ll2: mov a, r0
rr a
mov r0, a
mov p2, r0
mov a, r1
movc a, @a + dptr
mov p1, a
inc r1
call del1
call del1
call xoa
call del1
cjne r0, #00000001b, ll2
ll3: mov a, r0
rr a
mov r0, a
mov p3, r0
mov a, r1
movc a, @a + dptr
mov p1, a
inc r1
call del1
call del1
call xoa
call del1
cjne r0, #00000001b, ll3
ret
;
h1b:
mov r0, #11111110b
mov r1, #00h
ll1b: mov a, r0
rr a
mov r0, a
mov p1, r0
;
mov a, r1
movc a, @a + dptr
mov p0, a
inc r1
mov a, r1
movc a, @a + dptr
mov p2, a
inc r1
mov a, r1
movc a, @a + dptr
mov p3, a
inc r1
call del1
call xoa
call del1
cjne r0, #11111110b, ll1b
ret
h1c:
mov r0, #01111111b
mov r1, #00h
ll1c: mov a, r0
rl a
mov r0, a
mov p1, r0
;
mov a, r1
movc a, @a + dptr
mov p0, a
inc r1
mov a, r1
movc a, @a + dptr
mov p2, a
inc r1
mov a, r1
movc a, @a + dptr
mov p3, a
inc r1
call del1
call xoa
call del1
cjne r0, #01111111b, ll1c
ret
;
del1:
mov r7, #2
v6: mov r6, #50
djnz r6, $
djnz r7, v6
ret
delay:
mov r7, #5
v6a: mov r6, #50
v5: mov r5, #250
djnz r5, $
djnz r6, v5
djnz r7, v6a
ret
xoa: mov p0, #00h
mov p2, #00h
mov p3, #00h
mov p1, #0ffh
ret
b_5: ; KINH
db 11111111b
db 11111111b
db 00000001b
db 11101111b
db 11010111b
db 10111011b
db 01111111b
db 11111111b ;
db 00000111b
db 11111101b
db 11111110b
db 00000011b
db 11110111b
db 11101111b
db 11011111b
db 00000011b ;
db 11111111b
db 00000011b
db 11011111b
db 11011111b
db 11011111b
db 00000011b
db 11111111b
db 11111111b ;
b_5a: ; CHAO
db 11111111b
db 10000011b
db 01111101b
db 01111101b
db 01111101b
db 10011011b
db 11111111b
db 00000011b ;
db 11011111b
db 11011111b
db 11011111b
db 00000011b
db 11111111b
db 00001111b
db 11010111b
db 11011011b ;
db 11010110b
db 00001101b
db 11111111b
db 10000111b
db 01111011b
db 01111011b
db 01111011b
db 10000111b ;
b_6: ; KINH CHAO QUY KHACH....
db 11111111b
db 11111111b
db 00000001b
db 11101111b
db 11010111b
db 10111011b
db 01111111b
db 11111111b ;
db 00000111b
db 11111101b
db 11111110b
db 00000011b
db 11110111b
db 11101111b
db 11011111b
db 00000011b ;
db 11111111b
db 00000011b
db 11011111b
db 11011111b
db 11011111b
db 00000011b
db 11111111b
db 11111111b ;
db 11111111b
db 10000011b
db 01111101b
db 01111101b
db 01111101b
db 10011011b
db 11111111b
db 00000011b ;
db 11011111b
db 11011111b
db 11011111b
db 00000011b
db 11111111b
db 00001111b
db 11010111b
db 11011011b ;
db 11010110b
db 00001101b
db 11111111b
db 10000111b
db 01111011b
db 01111011b
db 01111011b
db 10000111b ;
db 11111111b
db 11111111b
db 11111111b
db 10000011b
db 01111101b
db 01111101b
db 01011101b
db 10000011b
db 01111111b
db 11111111b
db 10000011b
db 01111111b
db 01111111b
db 01111111b
db 10000011b
db 11111111b
db 11111011b
db 11110111b
db 00001101b
db 11110110b
db 11111011b
db 11111111b
db 11111111b
db 11111111b
db 00000001b
db 11101111b
db 11010111b
db 10111011b
db 01111111b
db 11111111b
db 00000011b
db 11011111b
db 11011111b
db 11011111b
db 00000011b
db 11111111b
db 00001111b
db 10110111b
db 10111011b
db 10110111b
db 00001101b
db 11111110b
db 10000111b
db 01111011b
db 01111011b
db 01111011b
db 10110111b
db 11111111b
db 00000011b
db 11011111b
db 11011111b
db 11011111b
db 00000011b
db 11111111b
db 11111111b
db 11111111b
b_9:
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b ;
db 11011011b,01101101b,10110110b
db 00000000b,00000000b,00000000b
db 11011011b,01101101b,10110110b
db 00000000b,00000000b,00000000b
db 11011011b,01101101b,10110110b
db 00000000b,00000000b,00000000b
db 11011011b,01101101b,10110110b
db 00000000b,00000000b,00000000b ;
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
b_10: ; Bat dau
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b ;
db 11111111b,11111111b,11111111b
db 00000000b,00000000b,00000000b
db 11111111b,11111111b,11111111b
db 00000000b,00000000b,00000000b
db 11111111b,11111111b,11111111b
db 00000000b,00000000b,00000000b
db 11111111b,11111111b,11111111b
db 00000000b,00000000b,00000000b ;
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b ;
b_11: ; LOGO trai tim
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b ;
db 00000110b,00000000b,01100000b
db 00001111b,00000000b,11110000b
db 00011111b,10000001b,11111000b
db 00111111b,11000011b,11111100b
db 01111111b,11100111b,11111110b
db 01111001b,11100111b,10011110b
db 00110000b,11000011b,00001100b
db 00000000b,00000000b,00000000b ;
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b
db 00000000b,00000000b,00000000b ;
b_1: ; Cong - Ty - Thuoc - Thu -y
db 11111111b
db 11111111b
db 11111111b
db 10000111b
db 01111011b
db 01111011b
db 01111011b
db 10110111b
db 11111111b
db 10001111b
db 01110101b
db 01110110b
db 01110101b
db 10001111b
db 11111111b
db 00000111b
db 11101111b
db 11011111b
db 10111111b
db 00000111b
db 11111111b
db 10001111b
db 01110111b
db 01010111b
db 01010111b
db 10010111b
db 11111111b
db 11111111b
db 11111111b
db 11111011b
db 11111011b
db 00000011b
db 11111011b
db 11111011b
db 11111111b
db 11110111b
db 11101111b
db 00011111b
db 11101111b
db 11110111b
db 11111111b
db 11111111b
db 11111111b
db 11111011b
db 11111011b
db 00000011b
db 11111011b
db 11111011b
db 11111111b
db 00000111b
db 11011111b
db 11011111b
db 11011111b
db 00000111b
db 11111111b
db 10000111b
db 01111111b
db 01111111b
db 01111111b
db 10000111b
db 11111111b
db 10001111b
db 01110101b
db 01110110b
db 01110101b
db 10001111b
db 11111101b
db 10001110b
db 01110111b
db 01110111b
db 01110111b
db 10101111b
db 11111111b
db 11111111b
db 11111111b
db 11111011b
db 11111011b
db 00000011b
db 11111011b
db 11111011b
db 11111111b
db 00000111b
db 11011111b
db 11011111b
db 11011111b
db 00000111b
db 11111111b
db 10000111b
db 01111111b
db 01111101b
db 01111110b
db 10000111b
db 11111111b
db 11111111b
db 11111111b
db 11111011b
db 11110111b
db 00001111b
db 11110111b
db 11111011b
db 11111111b
db 11111111b
db 11111111b
db 11101111b
db 11000111b
db 10000011b
db 11000111b
db 11101111b
db 11111111b
db 11111111b
db 11111111b
db 00000000b
db 01000001b
db 01111111b
db 01111111b
db 01111111b
db 11111111b
db 00000011b
db 10000101b
db 11011110b
db 11011101b
db 00000011b
db 11111111b
db 11000000b
db 10100001b
db 01111111b
db 10111111b
db 11000000b
db 11111111b
db 00000000b
db 01000010b
db 01101110b
db 01101110b
db 01111110b
db 11111111b
db 10000001b
db 01000010b
db 01111110b
db 01111110b
db 10011001b
db 11111111b
db 10000001b
db 01000010b
db 01111110b
db 01111110b
db 10000001b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11111111b ;
end
Ghi chú của người soạn: Bạn thấy tôi dùng mã bit 0, 1 (dạng nhị phân) và sắp theo từng dòng để làm hiện rõ các hình chữ sẽ hiện ra trên bảng đèn, nếu chuyển đổi các dòng mã này ra dạng số hệ 16 và sắp gọn lại thì chương trình sẽ rất ngắn, như khi xem các bảng này sẽ rất khó hiểu và không thể thấy được hình gì trong đó do đó sẽ rất khó thay đổi hay sửa lỗi.
Giải thích ý nghĩa của các câu lệnh:
org 0000h
num equ 20h
start: call xoa
mov r3, #0
;
;
call k_th ; Ket thuc, dung quet hang, troi xuong
call m_2 ; Cong Ty Thuoc - Thu - Y : LAVACO
call m_1 ; Kinh Chao
call m_3 ; Kinh Chao Quy Khach
call m_22 ; Cong Ty Thuoc - Thu - Y : LAVACO
call tr_t ; Logo hinh trai tim, quet hang
call m_1 ; Kinh Chao
call m_3 ; Kinh Chao Quy Khach
call m_2 ; Cong Ty Thuoc - Thu - Y : LAVACO
call tr_t ; Logo hinh trai tim, quet hang
call m_1 ; Kinh Chao
call m_3 ; Kinh Chao Quy Khach
call m_2 ; Cong Ty Thuoc - Thu - Y : LAVACO
call m_22 ; Cong Ty Thuoc - Thu - Y : LAVACO
call m_2 ; Cong Ty Thuoc - Thu - Y : LAVACO
call m_22 ; Cong Ty Thuoc - Thu - Y : LAVACO
call tr_t ; Logo hinh trai tim, quet hang
call m_1 ; Kinh Chao
call m_2 ; Cong Ty Thuoc - Thu - Y : LAVACO
call kh_d ; Khoi dau, dung quet hang, troi len
call tr_t ; Logo hinh trai tim, quet hang
call m_1 ; Kinh Chao
call m_22 ; Cong Ty Thuoc - Thu - Y : LAVACO
call m_22 ; Cong Ty Thuoc - Thu - Y : LAVACO
call m_22 ; Cong Ty Thuoc - Thu - Y : LAVACO
call m_22 ; Cong Ty Thuoc - Thu - Y : LAVACO
call m_22 ; Cong Ty Thuoc - Thu - Y : LAVACO
call m_22 ; Cong Ty Thuoc - Thu - Y : LAVACO
call m_1 ; Kinh Chao
call tr_t ; Logo hinh trai tim, quet hang
jmp start
Trước hết Bạn hãy viết các chương trình con, mỗi chương trình con cho làm một công việc cụ thể, mỗi chương trình con đều có một tên nhãn riêng, khi cần dùng đến đoạn chương trình này, Bạn chỉ phải dùng lệnh Call. Có thể Call nhiều lần tùy thích.
;
kh_d:
call xoa
mov num, #3
lamt1: mov dptr, #b_10 ; Logo 5
mov r3, #0
qlai1: mov r2, #40
llai1: call h1c
djnz r2, llai1
inc dptr
inc dptr
inc dptr
inc r3
cjne r3, #16, qlai1
djnz num, lamt1
ret
Trong đoạn chương trình này. Trước hết cho xóa sạch bảng đèn với lệnh (call xoa), rồi đặt số lần là 3 với câu lệnh (mov num, #3), kết đó đặt dữ liệu trong b_10, tức hình Logo 5 vào thanh ghi con trỏ dptr, dùng câu lệnh (mov dptr, #b_10), bây giờ trả trị trong r3 về 0 với câu lệnh (mov r3, #0), đặt số lần lập lại với trị nạp vào r2, dùng câu lệnh (mov r2, #40), bắt đầu cho hiện hình Logo với câu lệnh (call 1c), lập lại câu lệnh này 40 lần với câu lệnh (djnz r2, llai1), để hình trôi xuống (trôi dọc), Bạn cho dời bảng dữ liệu b_10 xuống với câu lệnh (inc dptr, phải lập lại 3 lần, vì một dòng hình phải cho in ra trên 3 port), sau đó tăng trị trong r3 lên để đếm số dữ liệu đã dời với câu lệnh (inc r3), rồi cho kiểm tra số lần lấy dữ liệu với câu lệnh (cjne r3, #16, qlai1), sau cùng cho lập lại qui trình trên 3 lần với câu lệnh (djnz num, lamt1). Đến đây chương trình sẽ quay lại sau lệnh Call với câu lệnh (ret).
;
k_th:
call xoa
mov num, #3
lamt2: mov dptr, #b_9 ; Logo 4 hinh giot nuoc
mov r3, #0
qlai2: mov r2, #40
llai2: call h1b
djnz r2, llai2
inc dptr
inc dptr
inc dptr
inc r3
cjne r3, #16, qlai2
djnz num, lamt2
ret
;
tr_t:
call xoa
mov num, #4
lamt3: mov dptr, #b_11 ; Logo hinh trai tim
mov r3, #0
qlai3: mov r2, #40
llai3: call h1b
djnz r2, llai3
inc dptr
inc dptr
inc dptr
inc r3
cjne r3, #16, qlai3
djnz num, lamt3
ret
;
jmp start
m_1:
call xoa
ttuc: mov dptr, #b_5 ; KINH
mov r4, #0ffh
ttd: call h1
djnz r4, ttd
;
call xoa
mov dptr, #b_5a ; CHAO
mov r4, #0ffh
ttd1: call h1
djnz r4, ttd1
ret
Trước hết cho xóa sạch bảng đèn với câu lệnh (call xoa), gắn dữ liệu của b_5 vào thanh ghi con trỏ dptr với câu lệnh (mov dptr, #b_5; bảng mã của chữ Kính), gắn trị 256 vào thanh r4 với câu lệnh (mov r4, #0ffh), bây giờ mới gọi chương trình cho in chữ ra bảng đèn, dùng câu lệnh (call h1). Cho lập lại lệnh này 256 lần với câu lệnh (djnz r4, ttd). Lại cho xóa bảng đèn với câu lệnh (call xoa), gắn bảng mã chữ Chào vào thanh ghi con trỏ dptr với câu lệnh (mov dptr, #b_5a), đặt số lần lập lại là 256 lần với câu lệnh (mov r4, #0ffh), bây giờ cho hiện chữ Chào với câu lệnh (call h1), lập lại 256 lần với câu lệnh (djnz r4, ttd1), đến đây đã hiện xong 2 chữ Kính Chào và sẽ quay lại sau lệnh call với câu lệnh (ret).
;
m_2:
call xoa
mov dptr, #b_1 ; Cong Ty Thuoc - Thu - Y : LAVACO
la1: mov r4, #15
ql1: call h1
djnz r4, ql1
inc dptr
inc r3
cjne r3, #142, la1 ; 166-24=142
mov r3, #0
ret
;
m_22:
call xoa
mov dptr, #b_1 ; Cong Ty Thuoc - Thu - Y : LAVACO
la11: mov r4, #5
ql11: call h1
djnz r4, ql11
inc dptr
inc r3
cjne r3, #142, la11 ; 166-24=142
mov r3, #0
ret
;
m_3:
call xoa
mov dptr, #b_6 ; KINH CHAO QUY KHACH...
la6: mov r4, #10
ql6: call h1
djnz r4, ql6
inc dptr
inc r3
cjne r3, #95, la6 ; 103-24=79
mov r3, #0
ret
;
h1:
mov r0, #00000001b
mov r1, #00h
ll1: mov a, r0
rr a
mov r0, a
mov p0, r0
mov a, r1
movc a, @a + dptr
mov p1, a
inc r1
call del1
call del1
call xoa
call del1
cjne r0, #00000001b, ll1
ll2: mov a, r0
rr a
mov r0, a
mov p2, r0
mov a, r1
movc a, @a + dptr
mov p1, a
inc r1
call del1
call del1
call xoa
call del1
cjne r0, #00000001b, ll2
ll3: mov a, r0
rr a
mov r0, a
mov p3, r0
mov a, r1
movc a, @a + dptr
mov p1, a
inc r1
call del1
call del1
call xoa
call del1
cjne r0, #00000001b, ll3
ret
Đây là đoạn chương trình chính dùng cho công việc xuất hình trên bảng đèn, hình xuất tra và cho trôi heo chiều dọc, mã quét đặt vào p0, rồi p1, rồi p3, các mã dữ liệu hình cho xuất ra trên p1. tôi sẽ giải thích từng lệnh một để Bạn dễ hiểu..
h1: ; Đặt tên nhãn
mov r0, #00000001b ; Chuẩn bị mã quét dòng, bit 1 là mở transistor npn
mov r1, #00h ; Trị khởi đầu của mã lấy dữ liệu trong bảng
ll1: mov a, r0 ; Gắn trị r0 vào thanh ghi a
rr a ; cho bit trong thanh a quay qua phải tạo mã quét.
mov r0, a ; chuyển nội dung trong a trở lại r0
mov p0, r0 ; cho xuất mã quét ra trên cảng p0.
mov a, r1 ; gắn r1 vào thanh a để lấy dữ liệu trong bảng
movc a, @a + dptr ; lấy dữ liệu trong bảng theo trị có trong a
mov p1, a ; cho nội dung trong a xuất ra trên cảng p1.
inc r1 ; tăng trị trong r1 lên heo bước +1
call del1 ; làm trễ với chương trình con del1
call del1 ; làm trễ với chương trình con del1
call xoa ; cho xóa bảng đèn
call del1 ; làm trễ với chương trình con del1
cjne r0, #00000001b, ll1 ; Quay lại làm tiếp nếu chưa đủ 8 lần
ll2: mov a, r0 ; (làm lại công đoạn trên với mã quét xuất trên p1)
rr a
mov r0, a
mov p2, r0 ; cho xuất mã quét ra trên cảng p2.
mov a, r1
movc a, @a + dptr
mov p1, a
inc r1
call del1
call del1
call xoa
call del1
cjne r0, #00000001b, ll2
ll3: mov a, r0 ; (làm lại công đoạn trên với mã quét xuất trên p3)
rr a
mov r0, a
mov p3, r0 ; cho xuất mã quét ra trên cảng p3.
mov a, r1
movc a, @a + dptr
mov p1, a
inc r1
call del1
call del1
call xoa
call del1
cjne r0, #00000001b, ll3
ret ; Quay lại sau lệnh call
Sau đây là đoạn chương trình cho in hình ra với mã quét xuất trên p1, mã hình cho xuất ra trên cảng p0, p2, p3. Tôi sẽ giải thích ý nghĩa của từng câu lệnh.
;
h1b: ; Tên nhãn
mov r0, #11111110b ; chuẩn bị mã quét, với bit 0 làm transistor pnp dẫn điện
mov r1, #00h ; đặt trị khởi đầu dùng để lấy dữ liệu
ll1b: mov a, r0 ; gắn trị trong r0 vào thanh a để dùng lệnh quay
rr a ; cho nội dung trong thanh a quay qua phải
mov r0, a ; trả nội dung trong thanh a về thanh r0
mov p1, r0 ; cho xuất mã quét trong r0 ra trên cảng p1
;
mov a, r1 ; gắn trị trong r1 vào a để dùng lệnh truy cập bảng
movc a, @a + dptr ; lấy mã hình trong bảng cho vào thanh a
mov p0, a ; cho xuất mã hình có trong a ra cảng p0
inc r1 ; tăng trị trong r1 lên theo bước +1
mov a, r1 ; lại chuyển trị trong r1 vào a để lấy mã hình tiếp theo
movc a, @a + dptr ; lại lấy mã hình tiếp theo
mov p2, a ; cho mã hình này xuất ra trên cảng p2.
inc r1 ; tăng trị trong r1 lên theo bước +1
mov a, r1 ; lại chuyển trị trong r1 vào a để lấy mã hình tiếp theo
movc a, @a + dptr ; lại lấy mã hình tiếp theo
mov p3, a ; cho mã hình này xuất ra trên cảng p3.
inc r1 ; tăng trị trong r1 lên theo bước +1
call del1 ; làm trễ để duy trì thời gian sáng
call xoa ; cho xóa nội dung trên bảng đèn
call del1 ; làm trễ để duy trì thời gian tắt
cjne r0, #11111110b, ll1b ; kiểm tra số lần quét xem đã đủ 8 lần chưa
ret ; quay lại sau lệnh Call
Với đoạn chương trình này tương tự như phần trên, Bạn chỉ thay đổi chiều của mã quét, và dúng lệnh quay trái (rl a) thay vì là lệnh quay phải (rr a).
h1c:
mov r0, #01111111b
mov r1, #00h
ll1c: mov a, r0
rl a
mov r0, a
mov p1, r0
;
mov a, r1
movc a, @a + dptr
mov p0, a
inc r1
mov a, r1
movc a, @a + dptr
mov p2, a
inc r1
mov a, r1
movc a, @a + dptr
mov p3, a
inc r1
call del1
call xoa
call del1
cjne r0, #01111111b, ll1c
ret
Các đoạn chương trình làm trễ:
;
del1:
mov r7, #2
v6: mov r6, #50
djnz r6, $
djnz r7, v6
ret
delay:
mov r7, #5
v6a: mov r6, #50
v5: mov r5, #250
djnz r5, $
djnz r6, v5
djnz r7, v6a
ret
xoa: mov p0, #00h
mov p2, #00h
mov p3, #00h
mov p1, #0ffh
ret
Hình chụp cho thấy bảng đèn ma trận 8x24 được dùng cho bài thực hành này:
Phần nói thêm: Cách làm đổi màu bảng đèn.
Đến đây đã có thể trả lời câu hỏi của Bạn sinh viên ở Hải Phòng một cách rõ ràng hơn, tôi đưa ra phương án khả thi như sau (Bạn xem phần giải thích), không cần dùng đến ic dời bit 74164 mà vẫn làm được các công việc mà Bạn muốn, đó là:
* Hiện chữ Lớp ĐT 1101
* Cho chữ chạy qua trái.
* và cho chữ đổi màu.
Bạn tạo rbảng đèn như hình vẽ. 8 hàng của khối 1 và khối 2 dùng nhận mã quét, vậy vòng quay của mã quét sẽ là 16. 8 chân cấp dòng cho Led đỏ của 2 khối cho nối chung nhau và cho nhận mã hình, tương tự 8 chân cấp dòng cho Led xanh của 2 khối nối chung nhau và cũng nhận mã hình.
Hình vẽ cho thấy cách nối các bó 8 vào ic vi điều khiển AT89C51
Hình vẽ cho thấy cách đấu dây của 2 khối ma trận 8x8.
Mạch điện dùng AT89C51 để điều khiển bảng đèn trên.
Bây giờ, Bạn hãy tham khảo cách viết các câu lệnh để viết chương trình nguồn của Bạn với:
* Xuất mã quét trên 8 hàng của khối 1 (với cảng p0) rồi qua khối 2 (với cảng p2).
* Mỗi lần xuất mã quét dòng thì cùng lúc cho xuất mã hình trên cột.
* Mã hình cho xuất trên cảng p1 sẽ cho hiện hình màu đỏ, khi cho xuất ở cảng p3 sẽ cho hiện hình màu xanh.
* Nếu mã hình cùng lúc cho xuất trên cảng p1 và p3 sẽ cho hình màu vàng.
Phần tiếp theo là Bạn hãy tự tạo hình và cất mã hình vào các bảng với tên nhãn rỏ ràng. Hãy nghĩ ra và tìm cách làm...Mong Bạn đọc hiểu những điều tôi đã viết. Chờ phản hồi. Chào!
.
Phụ lục:
Bảng đèn ma trận lớn dùng pixel 3 màu,
dùng ở các hội trường hay phòng trà (sản phẩm của TQ)
(Đây là một đề tài lớn và cần nhiều văn tự và giấy mực, lúc đầu tôi định giới thiệu ở đây để các Bạn làm bảng quang báo có tư liệu tham khảo, nó là một màn hình màu lớn có nguyên lý vận hành rất độc đáo, nhưng có thể phải để nó riêng ở một chuyên đề mới phù hợp. Mong Bạn đón đọc.)
Còn tiếp......Bạn nhớ vào xem...