Vi xử lý phkkhanh bai3 tài liệu, giáo án, bài giảng , luận văn, luận án, đồ án, bài tập lớn về tất cả các lĩnh vực kinh...
Trang 1BÀI 3: TRUYỀN DỮ LIỆU QUA PORT
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
- Máy vi tính
- Phần mềm Emu8086
- Chương trình mô phỏng hoạt động của I/O port
1 Cơ sở lý thuyết
Khi giao tiếp với thiết bị ngoại vi, ngoài cách giao tiếp thông qua 8255, ta cũng có thể giao tiếp trực tiếp với hệ thống thông qua các mạch giải mã địa chỉ
và lập trình trực tiếp thông qua các địa chỉ này, thông thường ta gọi là các port giao tiếp
Các port giao tiếp có thể kết nối với các mạch điện tử cơ bản như: Led đơn, Led 7 đoạn, …
2 Tiến trình thực hiện
2.1 Xuất / nhập dữ liệu qua Port
Cửa sổ chương trình IOPort.exe:
Bài 3.1: Copy file ioport.exe vào thư mục C:\Emu8086\Devices và thực
hiện chương trình sau:
#start=ioport.exe#
.model small
Dữ liệu ghi ra port Dữ liệu đọc vào từ port
Địa chỉ port ghi Địa chỉ port đọc
Trang 2.stack 100h
.data
msg db 'Gia tri nhap:$'
msg1 db 'Gia tri xuat:$'
msg2 db 'Nhan ''N'' de nhap gia tri, ''X'' de xuat gia tri, ESC de thoat$'
.code
main proc
mov ax,@data mov ds,ax mov ax,02h int 10h
mov ah,02h ; Chuyển toạ độ con trỏ đến mov dx,0101h ; hàng 1, cột 1
int 10h mov ah,09h ; Xuất chuỗi msg ra màn hình lea dx,msg
int 21h
mov ah,02h mov dx,0201h ; Hàng 2, cột 1 int 10h
mov ah,09h lea dx,msg1 int 21h
mov ah,02h mov dx,0D01h ; Hàng 13, cột 1 int 10h
mov ah,09h lea dx,msg2 int 21h begin:
mov ah,08h ; Chờ phím nhấn int 21h
cmp al,'N' ; Nhấn N thì nhập
je Nhap cmp al,'n'
je Nhap cmp al,'X' ; Nhấn X thì xuất
je Xuat cmp al,'x'
je Xuat cmp al,27 ; Nhấn ESC thì thoát
je exit jmp begin
Trang 3mov dx,300h ; Địa chỉ port nhập
in al,dx mov dx,010Eh ; Hàng 1, cột 15 mov ah,02h
mov bh,0 int 10h call Xuatthapphan ; Xuất giá trị vừa nhập jmp begin
Xuat:
mov dx,020Eh ; Hàng 2, cột 15 mov ah,02h
mov bh,0 int 10h call Nhapthapphan ; Nhập giá trị từ bàn phím mov dx,301h
out dx,al ; Xuất ra port có địa chỉ 301h jmp begin
exit:
mov ah,4Ch int 21h main endp
Xuatthapphan proc
mov ah,0 ; Xuất số hàng trăm mov bl,100
div bl push ax mov dl,al add dl,'0' mov ah,02h int 21h pop ax
mov al,ah ; Xuất số hàng chục mov ah,0
mov bl,10 div bl push ax mov dl,al add dl,'0' mov ah,02h int 21h pop ax
mov dl,ah ; Xuất số hàng đơn vị add dl,'0'
mov ah,02h int 21h ret
Trang 4Xuatthapphan endp
; -
Nhapthapphan proc
mov ah,01h ; Nhập số hàng trăm int 21h
sub al,'0' mov ah,0 mov bl,100 mul bl mov bh,al
mov ah,01h ; Nhập số hàng chục int 21h
sub al,'0' mov ah,0 mov bl,10 mul bl add bh,al
mov ah,01h ; Nhập số hàng đơn vị int 21h
sub al,'0' add al,bh ret
Nhapthapphan endp
END main
- Thực thi chương trình
- Nhấn nút ‘N’, quan sát giá trị nhập.trên màn hình Dùng chương trình IOPort thay đổi giá trị tại địa chỉ 300h và nhấn ‘N’ Quan sát và nhận xét kết quả
- Nhấn nút ‘X’, nhập một số thập phân có 3 chữ số và quan sát giá trị thay đồi tại địa chỉ 301h của chương trình IOPort
Bài 3.2: Thực hiện lại bài 3.1 nhưng thay đổi port nhập là 202h và port xuất là 302h trong chương trình IOPort
Bài 3.3: Thực hiện bài 3.1 nhưng xuất ra màn hình là giá trị thập lục phân
Bài 3.4: Thực hiện bài 3.1 nhưng xuất ra màn hình là giá trị nhị phân
Bài 3.5: Thực hiện bài 3.1 nhưng không nhập giá trị từ bàn phím mà lấy giá trị đã nhập từ port nhập để đưa ra port xuất
Trang 52.2 Điều khiển Led 7 đoạn
Cửa sổ chương trình Led 7 đoạn:
Hiển thị theo mã Led Số lượng Led hiển thị
(1 – 4 Led) Địa chỉ các Led
Hiển thị theo số nhị
phân từ 0 – 9, A - F
Cho phép hiện dấu chấm hay không
Trang 6Đối với phần hiển thị là Led 7 seg, quy ước Led dạng cathode chung
(nghĩa là Led sáng tương ứng bit điều khiển = 1) va thứ tự từ MSB đến LSB là:
dp -> g -> f -> e -> d -> c -> b -> a
Bài 3.6: Copy file Led7seg.exe vào thư mục C:\Emu8086\Devices
và thực hiện chương trình sau (dùng chế độ hiển thị trong chương trình Led7seg là Binary):
#start=led7seg.exe#
.model small
.stack 100h
.data
.code
main proc
mov ax,@data mov ds,ax mov ax,02h int 10h mov al,1 ; Xuất 1 mov dx,300h
out dx,al mov al,2 ; Xuất 2 mov dx,301h
out dx,al mov al,3 ; Xuất 3 mov dx,302h
out dx,al mov al,4 ; Xuất 4 mov dx,303h
out dx,al mov ah,4Ch int 21h main endp
END main
Bài 3.7: Thực hiện chương trình sau (dùng chế độ hiển thị trong chương trình Led7seg là Binary):
#start=led7seg.exe#
.model small
.stack 100h
.data
.code
main proc
mov ax,@data mov ds,ax mov ax,02h int 10h mov ax,2345 call XuatLED mov ah,4Ch
Trang 7main endp
XuatLED proc
; Xuất nội dung trong thanh ghi AX ra 4 Led
mov dx,0 mov bx,1000 ; Chia cho 1000 div bx ; AX = thương số (số hàng ngàn) ; DX = số dư
push dx mov dx,300h ; Xuất ra Led out dx,al
pop dx
mov ax,dx mov dx,0 mov bx,100 ; Chia cho 100 div bx ; AX = số hàng trăm
push dx mov dx,301h out dx,al pop dx
mov ax,dx mov dx,0 mov bx,10 ; Chia cho 10 div bx ; AX = số hàng chục
push dx mov dx,302h out dx,al pop dx
mov ax,dx mov dx,303h ; Xuất số hàng đơn vị out dx,al
ret XuatLED endp
END main
Bài 3.8: Đếm các giá trị tăng dần trên 4 Led 7 đoạn từ 0000 đến
2345 (chế độ hiển thị là Binary)
Bài 3.9: Thực hiện chương trình sau (dùng chế độ hiển thị trong chương trình Led7seg là Led 7 seg):
#start=led7seg.exe#
.model small
.stack 100h
.data
.code
main proc
Trang 8mov ax,@data mov ds,ax mov ax,02h int 10h
mov al,06h ; Mã của số 1 mov dx,300h
out dx,al
mov al,3Fh ; Mã của số 0 mov dx,301h
out dx,al
mov al,7Fh ; Mã của số 8 mov dx,302h
out dx,al
mov al,6Fh : Mã của số 9 mov dx,303h
out dx,al
mov ah,4Ch int 21h main endp
END main
Bài 3.10: Thực hiện chương trình sau (dùng chế độ hiển thị trong chương trình Led7seg là Led 7 seg):
#start=led7seg.exe#
.model small
.stack 100h
.data
MaLed7 db 3Fh,06h,5Bh,4Fh,66h,6Dh,7Dh,07h,7Fh,6Fh .code
main proc
mov ax,@data mov ds,ax mov ax,02h int 10h
mov ax,1234 call XuatLED
mov ah,4Ch int 21h main endp
XuatLED proc
; Xuat noi dung trong thanh ghi AX ra 4 Led
Trang 9mov bx,1000 div bx
push dx mov bx,ax mov al,MaLed7[bx]; Chuyển sang mã Led 7 đoạn mov dx,300h ; trước khi xuất
out dx,al pop dx
mov ax,dx mov dx,0 mov bx,100 div bx
push dx mov bx,ax mov al,MaLed7[bx]
mov dx,301h out dx,al pop dx
mov ax,dx mov dx,0 mov bx,10 div bx push dx mov bx,ax mov al,MaLed7[bx]
mov dx,302h out dx,al pop dx
mov ax,dx mov bx,ax mov al,MaLed7[bx]
mov dx,303h out dx,al ret
XuatLED endp
END main
Bài 3.11: Đếm các giá trị tăng dần trên 4 Led 7 đoạn từ 0000 đến
1234 (chế độ hiển thị là Led 7 seg)