Tụi mình đang làm project về Giao tiếp Bàn phím máy tính với VĐK để nhập nội dung hiển thị cho LCD,đã lấy được mã ASCII của các ký tự vào VĐK dùng ngắt ngoài P3.2, nhưng mà không thoát khỏi ngắt để về chương trình main được.
Có ai biết về chủ đề này xin chỉ bảo dùm tụi mình với nhé!
Đây là mạch nguyên lý của tụi mình (mạch board thí nghiệm 89 chỉ thêm phần LCD và cổng sp2 giao tiếp bàn phím máy tính):
+Chân P3.1 nối chân DATA của SP2 bàn phím máy tính
+Chân P3.2 nối chân CLOCK của sp2 bàn phím (dùng làm ngắt để bắt đầu lấy mã phím ở chân DATA)
Nhắc lại: Tín hiệu gửi từ bàn phím lên VDK là tín hiệu nối tiếp theo thứ tự gửi: bit Start, 8bit data (từ LSB đến MSB), bit Parity, cuối cùng là bit Stop. Sau đó còn có 1byte có giá trị F0H được gửi từ bàn phím lên vdk để báo là phím đã được nhả (sau khi bấm).
Mỗi xung Clock (Chu kỳ khoảng 35 đến 40 micro giây) có tác dụng gửi 1 bit, trong đó một nửa chu kỳ là để chuẩn bị bit từ chân DATA sp2, còn một nửa chu kỳ là để chờ cho VĐK lấy bit đó từ chân DATA. Như vậy ta viết hàm delay400 (400 micro giây) để chờ cho bàn phím gửi xong byte 0f0h(bỏ qua 8bit này vì ta không dùng đến nó) rồi mới tiếp tục cho phép ngắt trở lại)
Tài liệu tham khảo: MODULE SP2_VDK_LCD
Còn đây là code ASM của bọn mình (dùng mã phím A là 1Ch để điều khiển led trên P0), nhưng kô đổi trạng thái p0 được mà VDK lại bị treo (mình nghĩ là nó chưa thoát khỏi ngắt)
org 000h
jmp main
org 003h
jmp ngat
main:
mov r4,#3
mov tmod,#02h
mov th0,#-200 ;khoi tao timer cho ham delay400
mov ie, #81h ;Cho phep ngat ngoai
setb it0 ;Cho phep ngat cạnh
cjne R3,#1ch,mainx1
lcall choptatp0
jmp main
mainx1:
lcall choptatp02
jmp main
ngat:
clr ex0 ; ngat ngoai thu 0
mov r2, #8
jb p3.2, $ ;cho bit start => bo qua
jnb p3.2, $
nhan2: jb p3.2, nhan2 ;cho canh xuong cua xung ck
jnb p3.2, $
mov c, p3.1
rrc a ;doc bit lsb vao a7 truoc
djnz r2, nhan2 ;doc cho đến hết 8 bit data
mov r3, a ;dua ma cua phim nhan ra port 2
jb p3.2, $
jnb p3.2, $ ;chờ bit parity => bo qua
jb p3.2, $
jnb p3.2, $ ;chờ bit stop => bo qua
lcall delay400 ;chờ bàn phím gửi byte 0f0h => bo qua
setb p3.2
setb ex0 ;cho phép ngắt trở lại
RETI
delay400:
setb tr0
loop: jnb tf0,loop
djnz r4,loop
clr tr0
ret
choptatp0:
mov p0,#0ffh
lcall delay
mov p0,#0
lcall delay400
ret
choptatp02:
setb p0.2
lcall delay
clr p0.2
lcall delay
ret
delay:
mov r2, #255
nhan8: mov r6, #255
nhan9: djnz r6, nhan9
djnz r2, nhan8
ret
end
Comment