PDA

View Full Version : VDK giao tiếp bàn phím máy vi tính


zemen
12-01-06, 11:28
Chào bà con xa gần, tôi chưa thấy có mục nào nói về giao tiếp bàn phím máy vi tính với vi điều khiển nhỉ? Cái này hay đấy chứ, cả trăm phím cho ta sử dụng. Tôi có làm giao tiếp bàn phím với 89S52 dùng ngắt ngoài 0 (p3.2) làm ngõ nhận xung SCK, còn 1 pin nào đó (chẳng hạn p3.1) làm ngõ nhận dư liều SDA. Chương trình đã chạy, mã hex của bàn phím VDK đã nhận được, tuy nhiên chương trình không thoát khỏi ngắt ngoài để trở về chương trình chính. Bà con xem thế nào? Có gì chỉ dẫn thêm cho tôi và mọi người biết với!
Dưới đây là chương trình viết bằng hợp ngữ:

;p3.2 dung lam duong nhan xung SCK
;P3.1 dung lam duong nhan du lieu SDA

org 0
ljmp main

org 0003h
ljmp ex0isr ;Chuong trinh ngat ngoai 0

main:
mov ie, #81h;Cho phep ngat ngoai
setb it0 ;ngat canh

lap:
inc p0
lcall delay
mov r0, p0 ;Binh thuong port 0 dem nhi phan
cjne r0, #255, lap
mov p0, #0
sjmp lap

;Chuong trinh ngat ngoai de doc phim nhan
ex0isr:
clr ex0
mov r1, #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 r1, nhan2 ;doc bit tiep theo cua byte du lieu
mov p2, a ;dua ma cua phim nhan ra port 2

jb p3.2, $
jnb p3.2, $ ;cho bit parity => bo qua

jb p3.2, $
jnb p3.2, $ ;cho bit stop => bo qua

setb p3.0
setb p3.2
; lcall delay
setb ex0 ;cho phep ngat tro lai
reti

;Chuong trinh con tri hoan ms
delay:
mov r7, #255
nhan8: mov r6, #255
nhan9: djnz r6, nhan9
djnz r7, nhan8
ret

end

THIENTHUONG
13-11-07, 13:04
Cám ơn Bạn Nha

Ho Minh
13-11-07, 13:13
uh, cái này hay đấy.
nếu làm việc với PIC và trình dịch của Mikro thì có hẳn thư viện về nó luôn.
tuy nhiên cũng chỉ phát hiện 1 số phím thôi.

Theo tôi thì nếu dùng chuẩn truyền thông UART thì cùng hay đấy.
1. Bắt phím bàn phím PS2
2. Đẩy mã xuống VĐK bằng giao tiếp UART
3. Nhận mã ở VĐK
4. Hiển thị

Okie ....

anhaicpt
29-11-07, 20:40
Zemen viết đơn giản thế thôi ah, Ngày trước mình viết cho 8051 để giải mã bàn phím PS2 cũng khá phức tạp!

zemen
30-11-07, 08:38
Zemen viết đơn giản thế thôi ah, Ngày trước mình viết cho 8051 để giải mã bàn phím PS2 cũng khá phức tạp!

Ờ thì tuỳ theo ứng dụng chứ. Mình chỉ làm cái bài tập nho nhỏ thôi, nên chủ yếu lấy dc mã của phím. Có người sử dụng phức tạp hơn, có thể dùng ngắt hay không, xử lí phím đơn lẻ hay tổ hợp, viết cho 8051, avr hay pic đều dc cả.
Lâu rồi mình o coi nó, đoạn mã dưới là viết bằng C, dùng ngắt ngoài để bắt xung đầu tiên.

void Ngat_ngoai (void) interrupt 0
{
//xung ck thu 1, bo qua bit start
unsigned char i;
EA = 0; //khong chphep ngat xay ra

while(!FSCK){} //cho canh len (xung clock)

A = 0;
for (i = 0; i < 8; i++)
{ //chor canh xuong cua xung ck thu 2 thi bat dau nhan
//va nhan du 8 bit du lieu
while(FSCK){}
A = A >> 1;
A7 = FSDA; //nhan bit du lieu
while(!FSCK){} //cho xung ck len tro lai
}
bdkhien = A; //luu ma dieu khien

while(FSCK){}
while(!FSCK){} //bo qua bit parity
while(FSCK){}
while(!FSCK){} //bo qua bit stop
delay_ms(100);
}

byte
30-11-07, 09:47
bác làm về bàn phím PS2 rồi, bác có thể up lên cho bọn em tài liệu nói về cơ chế hoạt động của bàn phímn àydc không bác??

zemen
30-11-07, 10:41
trang http://www.beyondlogic.org nói cũng dc lắm! Nhưng nó viết bằng tiếng Anh, bạn coi qua chắc sẽ làm dc thôi.

minhhieu
30-11-07, 11:09
Bạn zemen có thể post lên Frame của tín hiệu bàn phím được không? Cảm ơn nhiều nhiều!!!!

zemen
30-11-07, 13:04
Hình dưới là khung truyền dữ liệu của tín hiệu bàn phím máy tính. Nói chung nó tương tự UART, o khác mấy.
http://i73.photobucket.com/albums/i233/hinaphotobucket/githucphimtoivdk.gif

Còn hình này là mã bàn phím:
http://i73.photobucket.com/albums/i233/hinaphotobucket/scancode.gif

byte
01-12-07, 13:07
anh trai ơi, em cũng muốn làm với thằng này. Nhưng mà bàn phím bây giờ nhiều quá em chẳng biết cái nào là cái thằgn PS2 cả, để nhận dạng nó thì mình làm như thế nào anh trai. Ngoài trợ trời bàn phím cũ có nhiều lắm mà em chẳng biết mua thằng nào. Có phải tất cả các bàn phím hiện giờ đều có cơ chế truyền dữ liệu như trên khôgn anh. Dùng cái bàn phím này hay nhỉ, chẳng bao giờ phải lo chống rung bàn phím , số phím thì cứ coi như thoải mái. Hì hì
à suýt quên, đại ca cho em hỏi luôn cái bàn phím này nó sài điện áp bao nhiêu vậy. Đối với chân GND và VCC. còn cả các mức 0 và 1 nữa, không biết nó có giống với chuẩn của cái thằng 232 không đại ca

hoctro89xxx
01-12-07, 14:51
anh trai ơi, em cũng muốn làm với thằng này. Nhưng mà bàn phím bây giờ nhiều quá em chẳng biết cái nào là cái thằgn PS2 cả, để nhận dạng nó thì mình làm như thế nào anh trai. Ngoài trợ trời bàn phím cũ có nhiều lắm mà em chẳng biết mua thằng nào. Có phải tất cả các bàn phím hiện giờ đều có cơ chế truyền dữ liệu như trên khôgn anh. Dùng cái bàn phím này hay nhỉ, chẳng bao giờ phải lo chống rung bàn phím , số phím thì cứ coi như thoải mái. Hì hì
à suýt quên, đại ca cho em hỏi luôn cái bàn phím này nó sài điện áp bao nhiêu vậy. Đối với chân GND và VCC. còn cả các mức 0 và 1 nữa, không biết nó có giống với chuẩn của cái thằng 232 không đại ca

Bàn phím cũ hay PS2 cũng giống nhau cả thôi, chỉ việc xác định đúng chân (nó có dây chuyển để quy về 1 mối).
Nó dùng điện áp 5V, mọi thứ đều 5V.
Nếu cứ như cái hình Zemen đưa lên thì thấy nó rất dễ nhưng cũng còn tuỳ vì: nếu phát hiện đủ các phím bấm như các phần mềm trên PC phát hiện thì nó cũng phức tạp. Còn nếu lấy 1 ít phím để dùng thì mới dễ. vì có phím nó phát về 3 byte, lại có phím nó phát về 4 byte... rồi bấm kết hợp 2 phím cùng lúc...

byte
01-12-07, 16:53
bác có chỗ nào chỉ cho mình biết xem cái mã phát ra khi mình nhấn một phím nào đó không bác. Có cái đó thì tốt, vấn đề ở đây chắc chỉ ở chỗ mình nhận được dữ liệu từ nó phát ra phải không ?

hoctro89xxx
02-12-07, 01:37
bác có chỗ nào chỉ cho mình biết xem cái mã phát ra khi mình nhấn một phím nào đó không bác. Có cái đó thì tốt, vấn đề ở đây chắc chỉ ở chỗ mình nhận được dữ liệu từ nó phát ra phải không ?

Tôi có cái hình và 1 file , làm theo sẽ lấy được tất cả các phím bấm. Khi làm xong sẽ thấy nó không đơn giản như Zemen đã làm:)). Vì khi bấm 1 phím thì phải phân tích được các byte do phím đó trả về...
Cách bố trí các bit trong 1 byte thì như bạn Zemen đã đưa ra.
Trên mạng có rất nhiều code nhưng để tìm 1 cái chuẩn thì khó, lấy về phải sửa đi. Bạn Cứ yên tâm làm theo cái tôi đưa lên đây vì tôi đã làm thành công với cả ASM và C.
Muốn dùng được đầu tiên phải khởi tạo nó... cũng chẳng dễ :-w

byte
02-12-07, 08:41
em sẽ về làm, có vấn đề gì đại ca chỉ giúp em phát nhé. Thanks

anhaicpt
02-12-07, 22:37
Cung cấp thêm tài liệu để mấy bạn có hứng thú làm nhé, nói chung thì chỉ cần đọc 1 cái là đủ thôi !
http://www.beyondlogic.org/keyboard/keybrd.htm
www.jkmicro.com/documentation/pdf/PS2Keyboard_EN.pdf
http://www.computer-engineering.org/index.php?title=PS/2_Mouse/Keyboard_Protocol

cứ từng bước sẽ ok thôi, cố lên !

zemen
03-12-07, 12:03
nếu muốn đầy đủ hơn thì các bạn có thể làm như bác hoctro89xxx nói.
Thực ra khi ta nhấn và nhả 1 phím thì IC bàn phím có thể gửi 1 hay nhiều byte tùy phím nhấn, hơn nữa, trong giao tiếp còn có các byte điều khiển, báo trạng thái, báo nguồn...
Chương trình mình viết chỉ đơn giản nhận dạng phím dc nhấn thôi (các phím phổ biến như A, B, C, 1, 2,3, F1, F2,...), tức là chỉ nhận byte đầu tiên. Do đó sau khi nhận byte đầu này mình mới "delay_ms(100)" để bỏ qua những byte khác nếu có.

quoctoan185
30-09-08, 01:01
viết như bác zemen đơn giản quá seo chạy nổi

digital
12-10-08, 10:09
Em đang làm về cái này các bác ạ! Xin mạo muội thế này:
- Ct của bác zemen chỉ nhận đc 1 byte thôi.
- Phím nhấn tạo ra mã nhấn và mã nhả, vì vậy ta còn phải kiểm tra mã nhả nữa.Mã nhả chiếm nhiều byte hơn.
Em đang lúng túng ko biết xử lý ra sao, mong mọi người giúp đỡ!

digital
12-10-08, 16:28
Nhân đây em "cá kiếm" được ct này của bạn:
INCLUDE 89c51.mc
;---------------------------------------------------
dulieu BIT p3.4
clock BIT p3.3
;---------------------------------------------------
org 0000h
JMP main
org 0013h
JMP int1
org 0030h
main:
MOV ie,#10000100b ; cho phep cac ngat vaf nhat ngoai 1
SETB tcon.2 ; cho phep ngat thep suon xung
SJMP $
int1:
PUSH 04
MOV R4,40H
CJNE R4,#00011100B,TAT
Clr p1.7
MOV p0,40h ;hien thi gia tri doc duoc
Setb p1.7
JMP BOQUA
TAT:
Clr P1.7
Mov P0,0FFH
Setb P1.7
;-----------------------------------------------------------
BOQUA:
POP 04
PUSH A
JB 72h,nhapbitphim
MOV 30h,#50
clockbitstart:
JNB clock,clockbitstart1
JB dulieu,loibitstart
SETB 72h
MOV R7,#8
JMP thoatbitphim
nhapbitphim:
JB 73h,kiemtrabitphim
MOV 30h,#50
clockbitdata:
JNB clock,clockbitdata1
MOV A,40H
MOV C,dulieu
RRC A
MOV 40h,A
DJNZ R7,thoatbitphim
SETB 73h
MOV R7,#2
JMP thoatbitphim
clockbitstart1:
DJNZ 30h,clockbitstart
JMP loibitstart
clockbitdata1:
DJNZ 30h,clockbitdata
JMP loibitstart
clockbitstop1:
DJNZ 30h,clockbitstop1
loibitstart:
CLR 72h
CLR 73h
JMP thoatbitphim
kiemtrabitphim:
MOV 30h,#50
clockbitstop:
JNB clock,clockbitstop1
DJNZ R7,thoatbitphim
JNB dulieu,loibitstart ;kiem tr loi bit stop
CLR 72h
CLR 73h
CLR IE.2 ; cam ngat ngoai 1
thoatbitphim:
POP A
RETI


Ko hiểu p1.7 dùng để làm gì nhỉ?! Rồi còn 72h,73h nữa? Ai xem giúp với!

digital
28-10-08, 20:13
ai chỉ giưp mình với:
Mình làm mà chỉ nhận đúng nửa byte của bàn phím thôi, nửa byte còn lại nhận bị sai, chẳng hiểu sao nữa. Ví dụ: nhấn phím A có mã hex là 1Ch thì nó hiển thị là 3Ch. Bao giờ cũng thế cứ một trong hai bit có trọng số thấp ở nửa byte đầu có giá trị 1 thì bít còn lại cũng là 1 : 5C sẽ là 7C chẳng hạn thế. Ai biết giúp mình với!thanks!

mrcuongcon
28-10-08, 20:23
Đằng sau cây máy tính (máy để bàn) có hai cổng PS2, một cho con chuột, 1 cho bàn phím. Bàn phím nào có đầu dây cắm vừa vào cái cổng đó thì là PS2.....................

xuanohyes89
06-01-10, 17:39
Anh ơi ! Có thể post cái sơ đò nguyên lí mạch giao tiếp keyboard với 8951 dc ko ???
:((:((:((

THANK

mgdaubo
07-01-10, 14:21
Em hỏi ké tí: bàn phím với chuột có loại PS2 và usb, PS2 thì có frame truyền như các anh đã nói, còn usb protocol theo em biết thì nó có quá trình enumerate khá phức tạp. Vậy mà có cái đầu cắm chuyển đổi usb --> PS2 dùng cho bàn phím với chuột, chỉ đơn giản là chuyển nối các chân tương ứng. Thế là thế nào nhỉ?

plain
09-01-10, 20:38
Anh ơi ! Có thể post cái sơ đò nguyên lí mạch giao tiếp keyboard với 8951 dc ko ???
:((:((:((

THANK

sơ đồ chả có gì ghê gớm cả bạn ơi. cứ nối thẳng 2 chân VDK với chân data và clock của bàn phím là được rồi.
chúc bạn thành công