Cơ sở lý thuyết Ma trận LED gồm các LED phát quang bố trí thành hàng và cột trong một võ.. Các tín hiệu điều khiển hàng PA0 - PA6 Port A nối vào Anode của tất cả các LED trên cùng một
Trang 1BÀI 5: MA TRẬN LED
MỤC ĐÍCH
Giúp sinh viên khảo sát các vấn đề sau:
- Sử dụng phần mềm Emu8086 để mô phỏng hoạt động của vi xử lý
8086
THIẾT BỊ SỬ DỤNG
- Máy vi tính
- Phần mềm Emu8086
- Chương trình mô phỏng hoạt động của ma trận Led
1 Cơ sở lý thuyết
Ma trận LED gồm các LED phát quang bố trí thành hàng và cột trong một
võ Các tín hiệu điều khiển hàng PA0 - PA6 ( Port A ) nối vào Anode của tất cả các LED trên cùng một hàng Các tín hiệu điều khiển cột PB0 -PB4 (Port B) nối vào Cathode của tất cả cácv LED trên cùng một cột
Khi có 1 cặp tín hiệu điều khiển hàng và cột ví dụ như khi PA0 = 1 và PB0 = 1, các Anode của hàng LED thứ nhất RW1 (hàng trên cùng) được cấp điện thế cao Đồng thời các Cathode của cột LED thứ nhất CL1 (bìa trái) được cấp thế thấp.Tuy nhiên chỉ có LED 1 là sáng vì nó có đồng thời thế cao trên Anode và thế thấp trên Cathode Như vậy khi có 1 cặp tín hiệu điều khiển hàng và cột thì chí có duy nhất 1 LED tại điểm hàng và cột gặp nhau là sáng Trên cở sở cấu trúc như vậy ta có thể xây dựng được bảng ma trận LED với số lượng LED lớn hơn ví
dụ như trong các bảng quang báo
Trong trường hợp ta cần hiển thị đồng thời 1 số LED trong ma trận để có thể hiển thị một ký hiệu nào đó ví dụ chữ „L„ trên ma trận LED Khi đó ta thấy các LED ở cột bìa trái (CL1) sáng và các LED ở hàng dưới cùng (RW7) sáng Nếu trong hiển thị tĩnh ta phải đặt tất cả các PA0 đến PA6 và PB0-4 ở mức cao, lúc này sẽ làm sáng các ở hàng RW7 và cột CL1 nhưng khi đó điều gì sẽ xảy ra?
Ta thấy rõ ràng là khi đó thì các LED khác trong ma trận cũng được cấp áp cao vào Anode và áp thấp vào Cathode do đó nó sẽ sáng tất cả các LED trong ma trận Vì vậy trong điều khiển ma trận LED ta không thể sử dụng phương pháp hiển thị tĩnh mà phải dùng phương pháp quét (hiển thị động) Nnghĩa là tiến hành cấp tín hiệu điều khiển theo dạng xung theo kiểu quét cho các hàng và cột cần hiển thị Tần số quét nhỏ nhất cho một chu kỳ cần khoảng 20Hz (50ms) nhằm bảo đảm cho mắt thấy các LED sáng đều không nháy Như vậy để hiển thị được chữ L có thể điều khiển tuần tự như trong bảng sau:
Nhịp 1 : PA0 - PA6 = 1, PB0 = 1 ; Sáng cột LED thứ nhất CL1 Nhịp 2 : PA0 - PA5 = 0, PA6 = 1, PB1 = 1 ; Sáng LED hàng RW7 và cột CL2
Trang 2Nhịp 3 : PA0 - PA5 = 0, PA6 = 1, PB2 = 1 ; Sáng LED hàng RW7 và cột CL3
Nhịp 4 : PA0 - PA5 = 0, PA6 = 1, PB3 = 1 ; Sáng LED hàng RW7 và cột CL4
Nhịp 5 : PA0 - PA5 = 0, PA6 = 1, PB4 = 1 ; Sáng LED hàng RW7 và cột CL5
Nhịp 6 : Quay lại giống nhịp 1
(từ nhịp 1 đến nhịp 6 là 1 chu kỳ quét tối thiểu phải là 20Hz)
Sơ đồ kết nối ma trận Led 5 x 7
PORT B
1
2
3
4
5
6
7
8
+5V
PORT A
1
2
3
4
5
6
7
8
Trang 3TÍN HIỆU PB0 PB1 PB2 PB3 PB4
Tương tự cho khi hiển thị các ký hiệu hay các chữ khác
Trang 42 Tiến trình thực hiện
Bài 4.1: Copy file ledmatrix.exe vào thư mục C:\Emu8086\Devices và
thực hiện chương trình sau:
#start=ledmatrix.exe#
.model small
.stack 100h
.data
pa db 7Eh,09h,09h,09h,7Eh
pb db 01h,02h,04h,08h,10h
.code
main proc
mov ax,@data mov ds,ax mov ax,02h int 10h mov dx,303h mov al,80h out dx,al ; Dinh cau hinh cho U9 start: mov ah,0Bh ; Kiem tra phim nhan
int 21h cmp al,0FFh ; Neu co nhan phim thi ket thuc
je exit ; chuong trinh
Ma trận Led
Chỉnh thời gian quét cho chương trình mô phỏng
Địa chỉ cơ sở
của 8255
Dữ liệu tại Port A và Port B
Trang 5jmp start
exit: mov ah,4Ch
int 21h main endp
; -
mov bx,0 ; Lap 5 lan cho 5 cot cont: mov dx,300h
mov al,pa[bx] ; Xuat du lieu ra Port A (hien
; thi cot cho ma tran Led) out dx,al
mov dx,301h mov al,pb[bx] ; Chon cot cho ma tran Led out dx,al
call delay inc bx
cmp bx,5 jne cont ret
; -
delay proc
push cx mov cx,03Fh loop $ pop cx ret delay endp
end main
- Sửa đoạn chương trình trên để xuất ra ma trận Led ký tự B, C, 0, 1
- Viết chương trình xuất lần lượt các ký tự A, B, C, 0, 1 ra ma trận Led Gợi ý: tạo vòng lặp hiển thị chữ A ra ma trận Led khoảng 15 lần, sau
đó đến chữ B, …
Bài 4.2: di chuyển chuỗi “AB” trên ma trận Led từ trái sang phải:
- Tính toán dữ liệu hiển thị
Giả sử cần hiển thị chuỗi “AB”:
Chữ „A‟: 7Eh, 09h, 09h, 09h, 7Eh
Chữ „B‟: 7Fh, 49h,49h,49h, 36h
Giữa chữ A và B có một cột trống để phân biệt
Chuỗi “AB”: 7Eh, 09h, 09h, 09h, 7Eh, 00h, 7Fh, 49h,49h,49h, 36h
Có thể thêm khoảng trắng trước và sau chuỗi để chuỗi hiện ra từ từ
Chuỗi “ AB ”: 00h, 00h, 00h, 00h, 00h, 7Eh, 09h, 09h, 09h, 7Eh, 00h, 7Fh, 49h,49h,49h, 36h,00h, 00h, 00h, 00h
Khai báo biến:
Trang 6pa DB 00h, 00h, 00h, 00h, 00h
DB 7Eh, 09h, 09h, 09h, 7Eh, 00h
DB 7Fh, 49h, 49h, 49h, 36h, 00h
DB 00h, 00h, 00h Như vậy, một ký tự cần hiển thị trên ma trận Led cần 6 byte và 5 byte 00h đầu chuỗi, 3 byte 00h cuối chuỗi một chuỗi dài 50 ký tự sẽ cần số byte lưu trữ cho mã Led là: 50*6 + 5 + 3 = 308 byte
- Hiển thị ký tự:
Quá trình hiển thị và cho chữ chạy mô tả như hình vẽ:
Pa[0] Pa[4]
Lần 0
Pa[1] Pa[5]
Lần 1
Pa[2] Pa[6]
Lần 2
Pa[15] Pa[19]
Lần 15
Trang 7Lần 1: hiển thị từ pa[0] † pa[4]
Lần 2: hiển thị từ pa[1] † pa[5] lần j: hiển thị từ pa[j] † pa[j+5]
Lần 16: hiển thị từ pa[15] † pa[19]
Chuỗi “AB” gồm 2 ký tự cần lưu trữ 20 byte và quét tổng cộng 20 – 4
= 16 lần chuỗi 50 ký tự cần lưu trữ 50*6 + 8 = 308 byte và quét 304 lần
- Chương trình chạy chuỗi ký tự:
.model small
.stack 100h
.data
pa DB 00h, 00h, 00h, 00h, 00h
DB 7Eh, 09h, 09h, 09h, 7Eh, 00h
DB 7Fh, 49h, 49h, 49h, 36h, 00h
DB 00h, 00h, 00h
pb DB 01h,02h,04h,08h,10h
.code
main proc
mov ax,@data mov ds,ax mov ax,02h int 10h mov dx,303h mov al,80h out dx,al ; Dinh cau hinh cho U9
start: mov ah,0Bh ; Kiem tra phim nhan
int 21h cmp al,0FFh ; Neu co nhan phim thi ket thuc
je exit ; chuong trinh mov si,0 ; Lan quet 0
quetled:
mov cx,3 ; led:
call ledmatrix loop led
inc si cmp si,16 ; Quet 16 lan, tu lan 0 -> 15 jne quetled
jmp start exit: mov ah,4Ch
int 21h
Trang 8main endp
; -
mov bx,0 ; Lap 5 lan cho 5 cot cont: mov dx,300h
mov al,pa[bx+si] ; Xuat du lieu ra Port A (hien
; thi cot cho ma tran Led) out dx,al
mov dx,301h mov al,pb[bx] ; Chon cot cho ma tran Led out dx,al
call delay inc bx
cmp bx,5 jne cont ret
; -
delay proc
push cx mov cx,03Fh loop $ pop cx ret delay endp
end main