Nó là một thiết bị I/O đa dụng có thể sử dụng với bất cứ P nào, có thể lập trình để truyền dữ liệu, từ I/O thông thường đến I/O interrupt.. Trong chế độ này, các kiểu truyền dữ liệu I/O
Trang 1BÀI 2: GIAO TIẾP CÁC THIẾT BỊ ĐƠN GIẢN
DÙNG 8255A
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 8255A
1 Cơ sở lý thuyết
8255A là thiết bị xuất nhập song song lập trình được Nó là một thiết bị I/O đa dụng có thể sử dụng với bất cứ P nào, có thể lập trình để truyền dữ liệu,
từ I/O thông thường đến I/O interrupt
8255A có thể chia thành 3 Port: A, B và C; mỗi port 8 bit trong đó Port C
có thể sử dụng như 8 bit riêng hay chia thành 2 nhóm, mỗi nhóm 4 bit: PCH (PC7 PC4) và PCL (PC3 PC0)
8255A có thể hoạt động ở 2 chế độ (mode): BSR (Bit Set/Reset) và I/O
Chế độ BSR: dùng để đặt hay xóa các bit của Port C
Chế độ I/O: gồm có 3 chế độ:
- Chế độ 0: tất cả các Port làm việc như các Port I/O đơn giản
- Chế độ 1 (chế độ bắt tay: handshake): các Port A và B dùng các bit của Port C làm tín hiệu bắt tay Trong chế độ này, các kiểu truyền
dữ liệu I/O có thể được cài đặt, kiểm tra trạng thái và ngắt
- Chế độ 2: Port A có thể dùng để truyền dữ liệu song hướng dùng các tín hiệu bắt tay từ Port C còn Port B được thiết lập ở chế độ 0 hay 1
CS A1 A0 Chọn
0
0
0
0
1
0
0
1
1
x
0
1
0
1
x
Port A Port B Port C Thanh ghi điều khiển 8255A không hoạt động
Trang 2 Thanh ghi điều khiển:
Dùng để xác định chức năng của các Port Nội dung của thanh ghi này gọi
là từ điều khiển (CW: Control Word) Thanh ghi điều khiển sẽ được truy xuất khi A1 = A0 = 1 Chú ý rằng ta không thể thực hiện tác vụ Đọc đối với thanh ghi này
Nếu bit D7 = 0, Port C làm việc ở chế độ BSR nhưng từ điều khiển BSR không ảnh hưởng đến chức năng các Port A, B
Để giao tiếp với ngoại vi thông qua 8255A cần phải:
- Xác định địa chỉ của các port A, B, C và CR thông qua các chân chọn chip CS và giải mã A1, A0
- Ghi từ điều khiển vào thanh ghi điều khiển
- Ghi các lệnh I/O để giao tiếp với ngoại vi qua các port A, B, C
Từ điều khiển BSR:
Từ điều khiển BSR khi được ghi vào thanh ghi điều khiển sẽ đặt hay xoá mỗi lần 1 bit
D7
Nhóm B
PCL (PC3 PC0) 1: Input
0: Output
PB 1: Input 0: Output
Mode 1: Mode 1 0: Mode 0
Nhóm A
PCH (PC7 PC4)
1: Input
0: Output
PA
1: Input
0: Output
Mode
1x: Mode 2
01: Mode 1
00: Mode 0
D6 D5 D4 D3 D2 D1 D0
1: Mode I/O
0: Mode BSR
Dạng từ điều khiển cho 8255A ở chế độ I/O
Trang 3D7 D6 D5 D4 D3 D2 D1 D0
Mode
BSR
Không sử dụng Chọn bit
000: PC0 001: PC1 010: PC2 011: PC3 100: PC4 101: PC5 110: PC6 111: PC7
0: Xoá (Reset) 1: Đặt (Set)
Khi sử dụng ở mode BSR, cần chú ý các điều sau:
- Để đặt hay xoá các bit ở Port C, từ điều khiển được ghi vào thanh ghi điều khiển chứ không ghi vào Port C
- Một từ điều khiển BSR chỉ ảnh hưởng đến một bit của Port C
- Từ điều khiển BSR không ảnh hưởng đến I/O mode
2 Tiến trình thực hiện
Xét 8255 được kết nối phần cứng như sau:
- Port A: nối với 8 Led (theo thứ tự PA0 – PA7 nối với Led0 – Led7), trong đó Led sáng khi giá trị tương ứng gởi ra là 1
- Port B: nối với 4 công tắc nhấn trong đó công tắc SW1 nối với PB7, SW2 nối với PB6, SW3 nối với PB5, SW4 nối với PB4 và khi nhấn công tắc bất kỳ, giá trị tương ứng tại Port B là 1; không nhấn thì = 0
- Port C: nối với 3 Relay 1,2,3 tương ứng nối với PC0,1,2 trong đó Relay đóng khi giá trị tương ứng tại Port C là 1 và ngắt khi = 0
Trang 4Cửa sổ chương trình mô phỏng 8255:
3.1 Điều khiển Led
8 Led dữ liệu được kết nối với Port A của U5 (có địa chỉ là 300h), như vậy
nếu muốn xuất dữ liệu ra Led, ta dùng lệnh OUT DX,AL trong đó DX chứa địa
chỉ của Led (300h) và AL chứa dữ liệu muốn xuất ra Led
Bài 2.1: Sáng 4 Led phải
Copy file 8255.exe vào thư mục C:\Emu8086\Devices và thực hiện
chương trình sau:
#start=8255.exe#
.model small
.stack 100h
Led nối Port A Phím nhấn nối Port B Địa chỉ cơ sở của 8255
Cho phép reset 8255
Vẽ dạng sóng tại ngõ ra PC6
Các Relay nối với Port C
Trang 5.data
.code
main proc
mov ax,@data mov ds,ax mov ax,02h int 10h
mov dx,303h ;Địa chỉ CR của 8255
mov dx,300h ;Địa chỉ Port A (nối với Led) mov al,0Fh
out dx,al
exit:
mov ah,4Ch ;Kết thúc chương trình int 21h
main endp
END main
- Biên dịch và thực thi chương trình
Bài 2.2: Bỏ đoạn in nghiêng, thực thi chương trình:
- Không nhấn nút Reset 8255 trên cửa sổ chương trình mô phỏng
8255
- Nhấn nút Reset 8255
Nhận xét tác dụng của đoạn lệnh định cấu hình của 8255
Bài 2.3: Sửa lại bài 2.1 để sáng 4 Led trái
Bài 2.4: Sửa lại bài 2.1 để sáng 4 Led giữa
Bài 2.5: Sửa lại bài 2.1 để sáng đồng thời Led 0 và Led 7
Bài 2.6: nhấp nháy 8 Led liên tục
#start=8255.exe#
.model small
.stack 100h
.data
.code
main proc
mov ax,@data mov ds,ax mov ax,02h int 10h
mov al,82h mov dx,303h out dx,al lap:
mov al,0 ; Sáng 8 Led mov dx,300h
Trang 6out dx,al call delay
mov al,0FFh ; Tắt 8 Led mov dx,300h
out dx,al call delay
jmp lap exit:
mov ah,4Ch int 21h main endp
; -
delay proc
push cx mov cx,0Fh loop $ pop cx ret delay endp
end main
Bài 2.7: nhấp nháy 8 Led 5 lần
#start=8255.exe#
.model small
.stack 100h
.data
.code
main proc
mov ax,@data mov ds,ax mov ax,02h int 10h mov al,82h mov dx,303h out dx,al
mov cx,5 ; Gán CX = 5 lap:
mov al,0 mov dx,300h out dx,al call delay
mov al,0FFh mov dx,300h out dx,al
Trang 7call delay
loop lap ; Số lần lặp tuỳ theo CX exit:
mov ah,4Ch int 21h main endp delay proc
push cx mov cx,0Fh loop $ pop cx ret delay endp
end main
Bài 2.8: Sửa lại bài 2.7 để thực hiện nhấp nháy 2 Led giữa 10 lần
Bài 2.9: Sửa lại bài 2.7 để thực hiện nhấp nháy đồng thời 2 Led 0
và Led 4 8 lần
Bài 2.10: Sửa lại bài 2.7 để Led sáng tuần tự từ trái sang phải, mỗi lần 1 Led
#start=8255.exe#
.model small
.stack 100h
.data
.code
main proc
mov ax,@data mov ds,ax mov ax,02h int 10h mov al,82h mov dx,303h out dx,al
mov al,80h ; Sáng Led 7 mov dx,300h
out dx,al call delay
mov al,40h ; Sáng Led 6 mov dx,300h
out dx,al call delay
mov al,20h ; Sáng Led 5 mov dx,300h
out dx,al call delay
Trang 8mov al,10h ; Sáng Led 4 mov dx,300h
out dx,al call delay
mov al,08h ; Sáng Led 3 mov dx,300h
out dx,al call delay
mov al,04h ; Sáng Led 2 mov dx,300h
out dx,al call delay
mov al,02h ; Sáng Led 1 mov dx,300h
out dx,al call delay
mov al,01h ; Sáng Led 0 mov dx,300h
out dx,al call delay
exit:
mov ah,4Ch int 21h main endp delay proc
push cx mov cx,0Fh loop $ pop cx ret delay endp
end main
Bài 2.11: Sửa lại bài 2.10 để Led sáng tuần tự từ phải sang trái, mỗi lần 1 Led
Bài 2.12: Sửa lại bài 2.10 để Led sáng dần từ trái sang phải
Bài 2.13: Sửa lại bài 2.10 để Led sáng dần từ phải sang trái
Bài 2.14: Sửa lại bài 2.10 để Led sáng từ ngoài vào trong, mỗi lần 2 Led
Bài 2.15: Sửa lại bài 2.10 để Led sáng từ trong ra ngoài, mỗi lần 2 Led
Bài 2.16: Sửa lại bài 2.10 nhưng lặp lại 5 lần
Bài 2.17: Thực hiện bài 2.10 nhưng dùng vòng lặp
Trang 9.model small
.data
pa db 80h,20h,40h,10h,08h,04h,02h,01h .code
main proc
mov ax,@data mov ds,ax
mov ax,02h int 10h
mov al,82h ;PA: XUẤT, PB: NHẬP, PC: XUẤT mov dx,303h ;Địa chỉ CR của 8255
out dx,al ;Định cấu hình cho 8255
mov bx,0 mov dx,300h ; Địa chỉ Led
next1:
mov al,pa[bx]
out dx,al
call delay
inc bx
cmp bx,8 ; Led có 8 trạng thái
jne next1
exit:
mov ah,4Ch ; Kết thúc chương trình
int 21h
main ENDP
ret
END main
Bài 2.18: Thực hiện bài 2.17 nhưng lặp lại 7 lần
Bài 2.19: Thực hiện bài 2.17 nhưng sáng liên tục, khi nhấn một phím bất kỳ thì kết thúc chương trình
Bài 2.20: Thực hiện bài 2.17 nhưng sáng liên tục, khi nhấn phím ESC thì kết thúc chương trình
Bài 2.21: Viết chương trình cho Led sáng tuần tự từ trái sang phải 5 lần, nhấp nháy 2 Led giữa 3 lần, sáng dần từ phải sang trái 6 lần, tắt dần từ trái sang phải 4 lần, lặp lại toàn bộ quá trình 5 lần
Trang 103.2 Khảo sát Relay
Các Relay được nối với Port C của U5 Do đó, nếu muốn đóng Relay nào,
ta sẽ cho bit tương ứng của Port C = 1 còn nếu muốn ngắt Relay thì sẽ cho bit tương ứng = 0
Đóng RL1 (PC0 = 1): từ điều khiển 0000 0001b = 01h Ngắt RL1 (PC0 = 0): từ điều khiển 0000 0000b = 00h Đóng RL2 (PC1 = 1): từ điều khiển 0000 0011b = 03h Ngắt RL2 (PC1 = 0): từ điều khiển 0000 0010b = 02h Đóng RL3 (PC2 = 1): từ điều khiển 0000 0101b = 05h Ngắt RL3 (PC2 = 0): từ điều khiển 0000 0100b = 04h
Bài 2.22: Chương trình ngắt lần lượt các Relay 1, 2, 3 và sau đó đóng các Relay này theo thứ tự 3, 2, 1:
#start=8255.exe#
.data
.code
main proc
mov ax,@data mov ds,ax mov ax,02h int 10h
mov al,82h mov dx,303h out dx,al
mov al,00h ; Ngắt RL1 mov dx,303h
out dx,al call delay
mov al,02h ; Ngắt RL2 mov dx,303h
out dx,al call delay
mov al,04h ; Ngắt RL3 mov dx,303h
out dx,al call delay
mov al,05h ; Đóng RL3 mov dx,303h
out dx,al call delay
Trang 11mov al,03h ; Đóng RL2 mov dx,303h
out dx,al call delay
mov al,01h ; Đóng RL1 mov dx,303h
out dx,al call delay
exit:
mov ah,4Ch int 21h main endp
ret
END main
Bài 2.23: Chương trình tạo xung vuông tại PC6
#start=8255.exe#
.data
.code
main proc
mov ax,@data mov ds,ax
mov al,82h mov dx,303h out dx,al
lap:
mov al,0Ch mov dx,303h out dx,al call delay
mov al,0Dh mov dx,303h out dx,al
Trang 12call delay jmp lap
exit:
mov ah,4Ch int 21h main endp
ret
END main
3.3 Khảo sát công tắc nhấn
Công tắc nhấn được nối với Port B của U5, khi nhấn SW thi bit tương ứng của Port B sẽ = 1 còn nếu không nhấn thì bằng 0 Như vậy, muốn kiểm tra công tắc nào được nhấn, ta phải kiểm tra bit tương ứng của Port B
Bài 2.24: Chương trình kiểm tra công tắc nhấn như sau:
#start=8255.exe#
.data
.code
main proc
mov ax,@data
mov ds,ax mov ax,02h int 10h
mov al,82h mov dx,303h out dx,al
begin:
mov dx,301h
in al,dx and al,0F0h cmp al,10110000b
je sw1
Trang 13cmp al,11010000b
je sw2 cmp al,11100000b
je sw3 cmp al,01110000b
je sw4 jmp begin
sw1:
mov al,0Fh mov dx,300h out dx,al call delay
mov al,0 mov dx,303h out dx,al call delay mov al,2 out dx,al call delay mov al,4 out dx,al jmp begin
sw2:
mov al,0F0h mov dx,300h out dx,al call delay mov al,1 mov dx,303h out dx,al call delay mov al,3 out dx,al call delay mov al,5 out dx,al jmp begin
sw3:
jmp exit sw4:
mov al,3Ch mov dx,300h out dx,al jmp begin
Trang 14exit:
mov ah,4Ch int 21h main endp
; -
loop $
ret
END main
Bài 2.25: Viết chương trình kiểm tra các công tắc nhấn:
Nhấn SW1: led chạy liên tục từ trái sang phải, mỗi lần 1 led
Nhấn SW2: nhấp nháy liên tục 2 led giữa
Nhấn SW3: led chạy liên tục từ ngoài vào trong và từ trong ra ngoài
Nhấn SW4: dừng quá trình chạy
Bài 2.26: Viết chương trình kiểm tra các công tắc:
Nhấn SW1: đóng RL1, phát 10 xung ra PC6
Nhấn SW2: đóng RL2, phát 5 xung ra PC6
Nhấn SW3: nhấp nháy đồng thời 2 Led 0 và 7 5 lần
Nhấn SW4: tắt các Led, ngắt RL1, RL2 và kết thúc chương trình