(028) 66844775 - 0902760910 banhang@phuclanshop.com
Danh mục sản phẩm

Trả lời thư: Làm bảng đèn quang báo ma trận Led 8x8 chạy chữ chỉ dùng 1 ic AT89C51

29 Tháng Tám 2015

 

Chào Bạn


Vi điều khiển là một môn học mới hiện đại kỳ lạ và lý thú. Từ một ic với các chân của các cảng (port) làm việc theo các câu lệnh đơn giản, Bạn có thể tạo ra rất nhiều ứng dụng thần kỳ. Một chủ đề mà nhiều Bạn quang tâm là dùng ic vi điều khiển AT89C51 để làm bảng đèn, bảng quang báo được tạo từ các khối Led ma trận 8x8, trên bảng đèn này cho hiện hình, hiện chữ,  và hình-chữ chạy ngang chạy dọc và đổi màu....trông rất đẹp mắt. Trong bài này tôi sẽ trình bày cách làm bảng đèn quang báo chỉ với duy nhất 1 ic vi điều khiển AT89C51 kết hợp với 4 khối ma trận Led 8x8.  Trên bảng đèn này Bạn có thể cho hiện ra tất cả các "thứ" mà Bạn muốn. Mong bài viết sẽ làm Bạn hài lòng.

 

 

Cũng nhân đó trả lời điện thư của em HA mai, trong thư viết:

 

Đến: dtth_vuongkhanhhung@yahoo.com
Ngày: Thứ Năm, 23 tháng 9, 2010, 6:54
 

Em chào thầy ạ! Em là sinh viên năm cuối khoa điện tử viễn thông của
trường đại học dân lập Hải Phòng. Em vừa học xong môn kỹ thuật vi xử lý
và được giao về làm đề tài kết thúc môn học. Đề tài của em là: hiển
thị dòng chữ "LopĐT1101" chạy từ phải sang trái,chữ chạy tự đông đổi
màu luân phiên tạo ra chu trình khép kín, dùng 2 ma trận 8x8 led 2
màu, sử dụng chip AT89c51 và ic ghi dich 8 bit 74164. Thầy có thể giúp
em được không ạ? em chua biết phải lam thế nào Thầy ạ? em mong nhận được
sự giúp đỡ của thầy!  Em cám ơn Thầy a
         (HA mai ).
 
 
 
 
Trước hết hãy tìm hiểu cấu trúc phần cứng:
 
 
 
(1) Bắt đầu câu chuyện từ các khối ma trận Led 8x8.
 
 
 
Trong các khối đèn ma trận Led 8x8, người ta gắn nhiều Led, theo 8 hàng và theo 8 cột Có loại bảng đèn dùng Led 1 màu (chỉ cần 2 chân), có loại dùng Led 2 màu (ra 3 chân), loại Led 3 màu (ra 3 chân). Trên bảng đèn Led này là các hàng chân, Bạn dùng Ohm kế, lấy thang đo Rx1 để có dòng ra trên dây đo lớn và đo trên các chân để tìm ra các chân Anode chung của các Led trên cùng một hàng và các các chân Cathode của  các Led trên cùng cột. Sau đây là bảng đèn Led 2 màu, có 24 chân và tôi dùng Ohm kế đo và xác định được số chân như hình vẽ sau:
 
 
 
 
 
Sơ đồ cách nối các Led của bảng ma trận 8x8 loại 2 màu như hình sau: Trong hình này Bạn thấy 8 chân Anode chung cho nối theo từng hàng và  8 chân Cathode  chung cho nối theo từng cột.  Khi chân chung của một hàng cho nối vào nguồn +5V và nếu lúc này chân Cathode của một cột qua một điện trở hạn dòng cho nối xuống đường masse, thì Led trên hàng và trên cột tương ứng sẽ sáng.
 
 
 
 
và nguyên lý để cho hiện hình trên bảng ma trận này như sau (Ở đây tôi cho thí dụ cách hiện chữ A):
 
 
 
 
 
Trên 8 hàng Bạn lần lượt cho cấp xung quét, với transistor pnp (2SA1015), mức volt thấp tức bit 0 trên chân B sẽ làm cho transistor dẫn điện (bit 1 sẽ làm cho nó ngưng dẫn), như vậy với xung quét như trong hình thì mỗi lần chỉ có một hàng được cho nối vào đường nguồn +5V, cùng lúc đó trên 8 cột, với transistor npn (2SC1815), Bạn xuất mức volt cao trên chân B, tức bit 1, transistor sẽ dẫn điện và nó sẽ cấp dòng cho các  Led tương ứng sáng, nếu xuất bit 0 các Led tương ứng sẽ tắt.
 
 
Bạn thấy nếu cho xung quét quét đủ nhanh  trên các hàng và cùng với hiện tượng lưu ảnh của mắt, Bạn sẽ nhìn thấy hình hiện ra trên bảng ma trận Led 8x8 này theo mã Code  xuất trên trên 8 cột, đó là nguyên lý dùng để in hình của các bảng quang báo vậy (Đơn giản quá phải không?).
 
 
 
  
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...

 

 

 

 

 


 

 

 

 

Vui lòng để lại bình luận
  • online support profile

    vivian.wang.yun

    Kinh doanh linh kiện và thiết bị ngành điện tử và điều khiển điện
Top