PDA

View Full Version : Giao tiếp keyboard ps/2, pic, LCD


tranhuyky
20-12-2006, 04:45 PM
Chào các bạn,
Mình có bài toán giao tiếp keyboard ps/2, pic và LCD 16x2.
Kết nối chân clock và data của keyboard ps/2 với pic6f877a qua cổng B0,B1. Nhiệm vụ đặt ra là:
* Nhấn 1 phím trên keyboard thì hiển thị phím đó ra lcd.
* Khi nhấn num lock, caps lock, scroll lock thì pic gởi tính hiệu cho keyboard để các led tương ứng này sáng lên.
* Nhấn backspace thì xóa ký tự...
Mong nhận sự chỉ giáo của các bạn.

pham_dinh_hung83
22-12-2006, 08:12 PM
đọc tài liệu của sony ấy, tương tự như tay playstation. các bác robocon vẫn làm, đừng nối dài dây hơn của nó nhe, đơ đấy. đội của mình thua vì nó ngĩ mà ớn.
nó cơ bản là tryền nối tiếp đồng bộ, các bít dữ liệu rơi trên xung ck.
vào trang bkpro.info có code mẫu,
ko bít cái của mình để đâu mất rồi
làm đồ án bận quá, có gì mail cho mình
ok, chúc vui

tranhuyky
23-12-2006, 11:33 PM
đọc tài liệu của sony ấy, tương tự như tay playstation. các bác robocon vẫn làm, đừng nối dài dây hơn của nó nhe, đơ đấy. đội của mình thua vì nó ngĩ mà ớn.
nó cơ bản là tryền nối tiếp đồng bộ, các bít dữ liệu rơi trên xung ck.
vào trang bkpro.info có code mẫu,
ko bít cái của mình để đâu mất rồi
làm đồ án bận quá, có gì mail cho mình
ok, chúc vui
Email của bạn là gì vậy?
Minh gap rac roi o phan truyen du lieu tu pic xuong keyboard, vd khi
nhan num lock thì pic nhan duoc tính hieu va goi yeu cau keyboard sang
led num lock. Minh truyen keyboard khong nhan duoc. Tren mang co noi co
2 loai ACK , 1 cái là 1byte(0xFA) 1 cái là 1 bit, vay khong biet host lam the
nào phan biet duoc ACK của keyboard là 1 bit hay 1 byte.

pham_dinh_hung83
24-12-2006, 06:50 PM
thực ra thì mình khá bận .
mấy hôm vừa rồi ít ngủ
mình cho bạn chương trình mình dùng 8051 giao tiếp ps2 tay đồ chơi điện tử playstation 2. có hiện thị lcd nhé. cố nghiên cứu ,
chúc vui

;-------------------------------------------------
ORG 0000h
;-------------------------------------------------
BUTTON1 EQU P3.6
BUTTON2 EQU P3.7
DC2_NGUOC BIT P2.7

DC3_THUAN BIT P0.1
DC3_NGUOC BIT P0.2

DC4_THUAN BIT P0.3
DC4_NGUOC BIT P2.3

DC_BANH1_CHIEU BIT P0.0
DC_BANH1_VOLT BIT P0.7
DC_BANH1_CHAY BIT P0.6

DC_BANH2_CHIEU BIT P2.4
DC_BANH2_VOLT BIT P2.5
DC_BANH2_CHAY BIT P2.6

DC1_THUAN BIT P2.2
DC1_NGUOC BIT P2.1

DC2_THUAN BIT P2.0

;-------------------------------------------------
LCDDATA EQU P1
LCDD7 BIT P1.7

LCDRS BIT P1.0
LCDRW BIT P1.1
LCDE BIT P1.2
;-------------------------------------------------
PsCom BIT P3.4
PsData BIT P3.5
PsClk BIT P3.2
PsATT BIT P3.3
fReady BIT 01h
fAnalog BIT 02h
;-------------------------------------------------
TEMP EQU 30h
TEMP1 EQU 31h
;-------------------------------------------------
PsxStatus EQU 32h
PsxVer EQU 33h
PsxLX EQU 34h
PsxLY EQU 35h
PsxRX EQU 36h
PsxRY EQU 37h
PsxBt1 EQU 28h
PsxBt2 EQU 29h
;-------------------------------------------------
TRAI_TREN BIT PsxBt2.2
TRAI_DUOI BIT PsxBt2.0

PHAI_TREN BIT PsxBt2.3
PHAI_DUOI BIT PsxBt2.1

SANG_TRAI BIT PsxBt1.7
SANG_PHAI BIT PsxBt1.5
LEN_TREN BIT PsxBt1.4
XUONG_DUOI BIT PsxBt1.6

VUONG BIT PsxBt2.7
TRON BIT PsxBt2.5
TAM_GIAC BIT PsxBt2.4
GACH_CHEO BIT PsxBt2.6

SELECT BIT PsxBt1.0
START BIT PsxBt1.3

JOY1 BIT PsxBt1.1
JOY2 BIT PsxBt1.2
;-------------------------------------------------
WDTRST EQU 0A6h
WDTPRG EQU 0A7h
;-------------------------------------------------
ORG 000h
LJMP MAIN

ORG 100H
;-------------------------------------------------

;================================================= =
MAIN:
ORL WDTPRG,#06 ; WATCHDOG 1s o THACH ANH 11.0592MHz
CALL INITLCD
CALL MESSAGE
CALL CLRSCR
LOOP_PSX:
CALL Psx_Process
CALL HIENTHI
CALL DKRELAY
CALL DELAY
SJMP LOOP_PSX
SJMP $
;================================================= =

;-------------------------------------------------
DKRELAY:
CALL CLRWDT

; ----- DIEU KHIEN ANALOG PHAI ------

MOV A,PsxRY
ADD A,#255 ; SO SANH A VOI 00
JC NEXT_R1 ; NEU A>0 THI KIEM TRA TIEP
CLR DC_BANH2_CHAY ; NEU A=0 THI CHO DONG CO PHAI CHAY TIEN O 24V
SETB DC_BANH2_CHIEU
CLR DC_BANH2_VOLT
SJMP EXIT_R
NEXT_R1:
MOV A,PsxRY
ADD A,#205 ; SO SANH A VOI 50
JC NEXT_R2 ; NEU A>50 THI KIEM TRA TIEP
CLR DC_BANH2_CHAY ; NEU A<=50 THI CHO DONG CO PHAI CHAY TIEN O 12V
SETB DC_BANH2_CHIEU
SETB DC_BANH2_VOLT
SJMP EXIT_R
NEXT_R2:
MOV A,PsxRY
ADD A,#55 ; SO SANH A VOI 200
JC NEXT_R3 ; NEU A>200 THI KIEM TRA TIEP
SETB DC_BANH2_CHAY ; NEU A<=200 THI CHO DONG CO PHAI DUNG
SETB DC_BANH2_CHIEU
SETB DC_BANH2_VOLT
SJMP EXIT_R
NEXT_R3:
MOV A,PsxRY
ADD A,#01 ; SO SANH A VOI 255
JC NEXT_R4 ; NEU A=255 THI CHO DONG CO PHAI LUI O 24V
CLR DC_BANH2_CHAY ; NEU A<255 THI CHO DONG CO PHAI LUI O 12V
CLR DC_BANH2_CHIEU
SETB DC_BANH2_VOLT
SJMP EXIT_R
NEXT_R4:
CLR DC_BANH2_CHAY ; CHO DONG CO PHAI LUI O 24V
CLR DC_BANH2_CHIEU
CLR DC_BANH2_VOLT
EXIT_R:

; ----- KIEM TRA CHE DO CHAY THANG ------

JB PHAI_TREN,KOTHANG
MOV PsxLY,PsxRY
KOTHANG:


; ----- DIEU KHIEN ANALOG TRAI ------

MOV A,PsxLY
ADD A,#255 ; SO SANH A VOI 00
JC NEXT_L1 ; NEU A>0 THI KIEM TRA TIEP
CLR DC_BANH1_CHAY ; NEU A=0 THI CHO DONG CO TRAI CHAY TIEN O 24V
SETB DC_BANH1_CHIEU
CLR DC_BANH1_VOLT
SJMP EXIT_L
NEXT_L1:
MOV A,PsxLY
ADD A,#205 ; SO SANH A VOI 50
JC NEXT_L2 ; NEU A>50 THI KIEM TRA TIEP
CLR DC_BANH1_CHAY ; NEU A<=50 THI CHO DONG CO TRAI CHAY TIEN O 12V
SETB DC_BANH1_CHIEU
SETB DC_BANH1_VOLT
SJMP EXIT_L
NEXT_L2:
MOV A,PsxLY
ADD A,#55 ; SO SANH A VOI 200
JC NEXT_L3 ; NEU A>200 THI KIEM TRA TIEP
SETB DC_BANH1_CHAY ; NEU A<=200 THI CHO DONG CO TRAI DUNG
SETB DC_BANH1_CHIEU
SETB DC_BANH1_VOLT
SJMP EXIT_L
NEXT_L3:
MOV A,PsxLY
ADD A,#01 ; SO SANH A VOI 255
JC NEXT_L4 ; NEU A=255 THI CHO DONG CO TRAI LUI O 24V
CLR DC_BANH1_CHAY ; NEU A<255 THI CHO DONG CO TRAI LUI O 12V
CLR DC_BANH1_CHIEU
SETB DC_BANH1_VOLT
SJMP EXIT_L
NEXT_L4:
CLR DC_BANH1_CHAY ; CHO DONG CO TRAI LUI O 24V
CLR DC_BANH1_CHIEU
CLR DC_BANH1_VOLT
EXIT_L:






; ----- DIEU KHIEN KHOI PHIM BAM ------

MOV C,TRAI_TREN
MOV DC1_THUAN,C
MOV C,TRAI_DUOI
MOV DC1_NGUOC,C

MOV C,LEN_TREN
MOV DC2_THUAN,C
MOV C,XUONG_DUOI
MOV DC2_NGUOC,C


MOV C,VUONG
MOV DC3_THUAN,C
MOV C,TRON
MOV DC3_NGUOC,C


MOV C,TAM_GIAC
MOV DC4_THUAN,C
MOV C,GACH_CHEO
MOV DC4_NGUOC,C

JB START,EXIT_RL
SJMP $
EXIT_RL:
RET

;-------------------------------------------------
HIENTHI:

CALL CLRWDT
CALL CLRSCR

MOV A,PsxLX
CALL PUTS_A
MOV A,#'-'
CALL DATAWRT

MOV A,PsxLY
CALL PUTS_A
MOV A,#'-'
CALL DATAWRT

MOV A,PsxRX
CALL PUTS_A
MOV A,#'-'
CALL DATAWRT

MOV A,PsxRY
CALL PUTS_A

CALL ENTER

MOV A,PsxStatus
CALL PUTS_A
MOV A,#'-'
CALL DATAWRT

MOV A,PsxVer
CALL PUTS_A
MOV A,#'-'
CALL DATAWRT

MOV A,PsxBT1
CALL PUTS_A
MOV A,#'-'
CALL DATAWRT

MOV A,PsxBT2
CALL PUTS_A

RET



;>>>>>>-------------------------------------------------
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Nhom cac ham xu ly PSX
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Psx_Process:

CALL CLRWDT
SETB fReady
SETB fAnalog

SETB PsCom
SETB PsClk
CLR PsATT ; Dua ATT xuong
MOV A,#01h
CALL Ps_Access

MOV A,#42h
CALL Ps_Access
MOV PsxVer,B ; Expect to read 41h or 73h
MOV R2,B
CJNE R2,#73h,NoEqual01_PP
JMP Cont01_PP ; Analog mode on
NoEqual01_PP:
CLR fAnalog
MOV PsxLX,#128
MOV PsxLY,#128
MOV PsxRX,#128
MOV PsxRY,#128
Cont01_PP:
MOV A,#0h
CALL Ps_Access
MOV PsxStatus,B
MOV R2,B
CJNE R2,#5Ah,NoEqual02_PP
JMP Cont02_PP ; Neu Joystic chua ready thi CLR fReady va thoat
NoEqual02_PP:
CLR fReady
RET
Cont02_PP:
MOV A,#0h ; SLCT JOYR JOYL STRT UP RGHT DOWN LEFT
CALL Ps_Access
MOV PsxBt1,B

MOV A,#0h ; L2 R2 L1 R1 /\ O X |_|
CALL Ps_Access
MOV PsxBt2,B
; Neu khong o analog mode thi khong doc ve nua
JNB fAnalog,EndRead_PP

MOV A,#0h ; Right Joy 0x00 = Left 0xFF = Right
CALL Ps_Access
MOV PsxRX,B

MOV A,#0h ; Right Joy 0x00 = Up 0xFF = Down
CALL Ps_Access
MOV PsxRY,B

MOV A,#0h ; Left Joy 0x00 = Left 0xFF = Right
CALL Ps_Access
MOV PsxLX,B

MOV A,#0h ; Left Joy 0x00 = Up 0xFF = Down
CALL Ps_Access
MOV PsxLY,B
EndRead_PP:
SETB PsATT
RET

;>>>>>>-------------------------------------------------
; Transmit data store in A and record PSX data and store it in B
Ps_Access:
MOV R2,#8
Loop_PA:
RRC A
MOV PsCom,C
CALL CLK_Low
XCH A,B
MOV C,PsData
RRC A
XCH A,B
CALL CLK_High
DJNZ R2,Loop_PA
MOV R2,#50
DJNZ R2,$
RET
;>>>>>>-------------------------------------------------
CLK_Low:
CLR PsCLK ; Dua xung xuong
JB PsCLK,$ ; Doi xung xuong han
RET
;>>>>>>-------------------------------------------------
CLK_High:
SETB PsCLK ; Dua xung len
JNB PsCLK,$ ; Doi xung len han
RET

;-------------------------------------------------
MESSAGE:
CALL CLRSCR
CALL DELAY1S
MOV DPTR,#TEXT1
CALL DISPLAY
CALL ENTER
MOV DPTR,#TEXT2
CALL DISPLAY
CALL DELAY1S
SJMP MESSAGE
JB P3.6,NOCOPYRIGHT
CALL CLRSCR
MOV DPTR,#TEXT3
CALL DISPLAY
CALL ENTER
MOV DPTR,#TEXT4
CALL DISPLAY

WAIT:
CALL CLRWDT
; JNB P3.6,WAIT
CALL DELAY1S
CALL DELAY1S
CALL DELAY1S
CALL DELAY1S
CALL DELAY1S
CALL DELAY1S
NOCOPYRIGHT:
RET
;-------------------------------------------------
INITLCD:
CALL CLRWDT
MOV A,#00000010B
CALL COMNWRT
MOV A,#00101000B
CALL COMNWRT
MOV A,#00001100B
ACALL COMNWRT
RET
;-------------------------------------------------
DISPLAY:
CALL CLRWDT
LOOP:
ACALL DELAY
CLR A
MOVC A,@A+DPTR
JZ EXIT
ACALL DATAWRT
INC DPTR
SJMP LOOP
EXIT:
RET
;-------------------------------------------------
COMNWRT:
MOV TEMP,A ;00000010B
ANL A,#11110000B
MOV LCDDATA,A
SETB LCDE
NOP
CLR LCDE
MOV A,TEMP
SWAP A
ANL A,#11110000B
MOV LCDDATA,A
SETB LCDE
NOP
CLR LCDE
LCALL DELAY50
RET
;-------------------------------------------------
DATAWRT:
MOV TEMP,A
ANL A,#11110000B
SETB ACC.0
MOV LCDDATA,A
SETB LCDE
NOP
CLR LCDE

MOV A,TEMP
SWAP A
ANL A,#11110000B
SETB ACC.0
MOV LCDDATA,A
SETB LCDE
NOP
CLR LCDE
LCALL DELAY50
RET
;-------------------------------------------------
PUTSTRING:
CALL CLRWDT
LOOP_PS:
CLR A
MOVC A,@A+DPTR
JZ EXIT_PS
ACALL DATAWRT
INC DPTR
SJMP LOOP_PS
EXIT_PS:
RET
;-------------------------------------------------
ENTER:
MOV A,#0C0h
CALL COMNWRT
RET
;-------------------------------------------------
POINTER_BACK:
PUSH ACC
MOV A,#0C0h
CALL COMNWRT
POP ACC
RET
;-------------------------------------------------
CLRSCR:
PUSH ACC
MOV A,#01h
CALL COMNWRT
MOV B,#6
CALL DELAYB
POP ACC
RET
;-------------------------------------------------
BACK_SPACE:

RET
;-------------------------------------------------
PUTS_A:
PUSH 0
PUSH 1
PUSH ACC
MOV R0,#3
MOV R1,#TEMP1
LOOP_A:
MOV B,#10
DIV AB
PUSH ACC
MOV A,#30h
ADD A,B
MOV @R1,A
INC R1
POP ACC
DJNZ R0,LOOP_A

MOV R0,#3
LOOP_B:
DEC R1
MOV A,@R1
ACALL DATAWRT
DJNZ R0,LOOP_B
POP ACC
POP 1
POP 0
RET
;-------------------------------------------------
CLRWDT:
MOV WDTRST,#01Eh
MOV WDTRST,#0E1h
RET

;-------------------------------------------------
DELAY:
MOV R3,#50
D1: MOV R4,#250
DJNZ R4,$
DJNZ R3,D1
RET
DELAY50:
PUSH 4
MOV R4,#50
DJNZ R4,$
POP 4
RET
DELAYB:
PUSH 4

DLB: MOV R4,#255
DJNZ R4,$
DJNZ B,DLB
POP 4
RET

DELAY1S:
CALL CLRWDT
MOV R5,#4
D2: MOV R3,#250
D3: MOV R4,#250
DJNZ R4,$
DJNZ R3,D3
DJNZ R5,D2
RET
DELAYuS:
MOV R3,#50
DJNZ R3,$
RET

;-------------------------------------------------

TEXT1:
DB "-d7KQ#1-VO DICH-",0
TEXT2:
DB "--ROBOCON 2007--",0
TEXT3:
DB " VO DICH ",0
TEXT4:
DB " ",0
;--------------------------------------------------
END

enti
26-12-2006, 01:59 PM
Chào bạn pham_dinh_hung83, bài toán ở trên là giao tiếp PIC với PS/2 keyboard của PC chứ không phải playstation2 của Sony, nên keybaord phải nhận lênh của PIC để đáp ứng lại lệnh này. Mình đã làm rồi, nếu có gì thì PM.

giangcs
20-03-2007, 07:15 PM
Chào bạn pham_dinh_hung83, bài toán ở trên là giao tiếp PIC với PS/2 keyboard của PC chứ không phải playstation2 của Sony, nên keybaord phải nhận lênh của PIC để đáp ứng lại lệnh này. Mình đã làm rồi, nếu có gì thì PM.
bạn có thể post code và sơ đồ nguyên lí để mọi người tham khảo không.

khangspkt
25-05-2009, 06:27 AM
Mình có gặp 1 rắc rối nhỏ với giao tiếp với vidieukhien. Khi kết nối data và clk với vidieukhien, để tạo trạng thái idle, treo 2 con điện trở 10k từ 2 chân này lên nguồn. Sau đó nhấn bàn phím PC, thấy ko có gì gọi là hoạt động. Mình có do thử 2 chân CLK và Data, tần số đo được là 100 Mhz. Theo mình biết thì tần số keyboard sử dụng ~ 30 Khz thôi

Anh em nào có làm rồi, chỉ mình cách kiểm tra nhé.

Mình làm trên 8051 theo project này
http://www.mytutorialcafe.com/Microcontroller%20Project%20Thesis%20PC%20Keyboard %202.htm

và làm cho pic theo link project này:
http://electronic-engineering.ch/microchip/projects/keyboard/v1xx/keyboard_v1xx.html#how_it_works

Mình đang cần gấp, nhưng gặp sự cố này ko biết giải quyết sao, nhờ anh em hỗ trợ

robotden
04-06-2009, 01:04 AM
có ai làm thành công với pic chưa, hướng dẫn bà con đi
thank

vanhoan1
27-07-2009, 01:08 PM
// *****GIAO TIEP BAN PHIM VOI LCD***
// RS,RW,E POTRE
// LCD PORT B
// KEYPAD PORT D
//*************************************
#include "16F877A.h"
#include <DEFS_16f877a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#byte portD=0x08
#byte portB=0x06
#byte portE=0x09
#define LCD portb
#define rs re0
#define rw re1
#define e re2
const unsigned char line[]= {'M','O','I',' ','N','H','A','P',' ','S','O',' ',':','#'};
INT8 b=0;
void lenh(void)
{output_low(pin_e0) ;
output_low(pin_e1);
output_high(pin_e2);
output_low(pin_e2);
delay_ms(6);}
void du_lieu(void)
{
output_high(pin_e0);
output_low(pin_e1);
output_high(pin_e2);
output_low(pin_e2);
delay_ms(6);}
void goi()
{b=0;
while(line[b]!='#')
{
output_b(line[b]);
du_lieu();
delay_ms(100);
b++;
}
}
void main()
{ set_tris_e(0);output_e(0);
set_tris_b(0);output_b(0);
OUTPUT_B(0X38);
lenh();
portb=0x0E;
lenh();
output_b(0x82);
lenh();
delay_ms(1);
goi();
delay_ms(1);
portb=0xc0;
lenh();
delay_ms(100);
output_D(0b11111111);
delay_ms(10);
while(true)
{
//====================================output_D(11111 110)============//
output_D(0b11111110);
DELAY_MS(10);

if( input(pin_D4)==0 )
{
portb=0x37; //ghi 7
du_lieu();
DELAY_MS(150);
}

if( input(PIN_D5)==0 ) //cho khi D5 xuong 0
{
portb=0x38; //ghi 8
du_lieu();
DELAY_MS(150);
}

if( input(PIN_D6)==0 ) //cho khi D6 xuong 0
{
portb=0x39; //ghi 9
du_lieu();
DELAY_MS(150);
}

if( input(PIN_D7)==0 ) //cho khi D7 xuong 0
{
portb='A'; // ghi a
du_lieu();
DELAY_MS(150);
}
//====================================output_D(11111 101)=============//
output_D(0b11111101);
DELAY_MS(10);
if( input(PIN_D4)==0 ) //cho khi D4 xuong 0
{
portb=0x34; //ghi 4
du_lieu();
DELAY_MS(150);
}
if( input(PIN_D5)==0 ) //cho khi D5 xuong 0
{
portb=0x35; //ghi 5
du_lieu();
DELAY_MS(150);
}
if( input(PIN_D6)==0 ) //cho khi D6 xuong 0
{
portb=0x36; //ghi 6
du_lieu();
DELAY_MS(150);
}
if( input(PIN_D7)==0 ) //cho khi D7 xuong 0
{
portb='B'; //ghi b
du_lieu();
DELAY_MS(150);
}
//======================output_D(11111011)========== ================//
output_D(0b11111011);
DELAY_MS(10);
if( input(PIN_D4)==0 ) //cho khi D4 xuong 0
{
portb=0x31; //ghi 1
du_lieu();
DELAY_MS(150);
}
if( input(PIN_D5)==0 ) //cho khi D5 xuong 0
{
portb=0x32; //ghi 2
du_lieu();
DELAY_MS(150);
}
if( input(PIN_D6)==0 ) //cho khi D6 xuong 0
{
portb=0x33; //ghi 3
du_lieu();
DELAY_MS(150);
}
if( input(PIN_D7)==0 ) //cho khi D7 xuong 0
{
portb='C'; //ghi c
du_lieu();
DELAY_MS(150);
}
//*******************************
output_D(0b11110111);
DELAY_MS(10);
if( input(PIN_D4)==0 ) //cho khi D4 xuong 0
{
portb='*'; //ghi *
du_lieu();
DELAY_MS(150);
}
if( input(PIN_D5)==0 ) //cho khi D5 xuong 0
{
portb=0x30; //ghi 0
du_lieu();
DELAY_MS(150);
}
if( input(PIN_D6)==0 ) //cho khi D6 xuong 0
{
portb=0X01; //CLEAR
LENH();
portb=0x82;
lenh();
delay_ms(1);
goi();
delay_ms(1);
portb=0xcf;
lenh();
portb=0x04;
lenh();
}
if( input(PIN_D7)==0 ) //cho khi D7 xuong 0
{portb='D'; //ghi d
du_lieu();
DELAY_MS(150);
}
}
}

namqn
27-07-2009, 02:47 PM
Bạn vanhoan1 nên post thêm sơ đồ nguyên lý của mạch ứng dụng.

Thân,

khangspkt
07-09-2009, 11:53 PM
Chào các bạn, mình đã viết được chương trình nhận dữ liệu từ bàn phím phát dữ liệu theo chuẩn ps/2.
Tài liệu tham khảo các bạn tham khảo theo link mình cung cấp bên trên.
Chương trình này mình sử dụng để đọc dữ liệu từ đầu đọc barcode (đọc mã vạch). Chương trình hoạt động rất tốt và không có vấn đề gì. Xin được chia sẽ cùng các bạn


;5 goi chuong trinh detect ky tu tu barcode reader
doc_barcode
clrf datareg
btfsc kclock
goto $-1
call getdata
btfss STATUS,C
goto doc_barcode ; re-get
bcf STATUS,C
return

getdata
call getscancode
;kiemtra w # F0
sublw h'F0'
btfss STATUS,Z
goto clear_c ;khong bang=>khong nhan capslock
btfsc kclock ;bang=> co nhan capslock
goto $-1
call getscancode
bsf STATUS,C
return
clear_c
bcf STATUS,C
return
getscancode ;in:from keyboard;out:w;lay du lieu noi tiep tu ps2keyboard, luu vao w
btfss kclock
goto $-1
movlw h'08'
movwf check8bit
getscancode2
btfsc kclock
goto $-1
btfsc kdata
btfss kdata
goto data_clear
goto data_set
xoaydatareg
rrf datareg
btfss kclock
goto $-1
decf check8bit
movf check8bit,w
sublw h'00'
btfss STATUS,Z
goto getscancode2 ;khongbang
btfsc kclock ;bang
goto $-1
btfss kclock
goto $-1
btfsc kclock
goto $-1
btfss kclock
goto $-1
movf datareg,w
return
convert_data2ascii
call KBDtable ; chuyen gia tri lay duoc tu ban phim bang cach tra bang, in:W, out:W
return
data_set
bsf STATUS,C
goto xoaydatareg
data_clear
bcf STATUS,C
goto xoaydatareg

Vài lưu ý khi sử dụng chương trình con này.
1. bạn khởi tạo kclock và kdata là 2 ngõ vào
2. 2 đường clock và data này phải được treo lên nguồn để giữ mức cao tạo trạng thái ilde
3. thanhghi datareg phải được khai báo từ đầu, sử dụng để lưu giá trị 8 bit dữ liệu của bàn phím gửi lên. Sau khi goji chương trình con này, bạn lấy dữ liệu từ thanh ghi này xử lý cho mục đích của bạn
4. bảng data của các phím được đính kèm theo file trong bài này. các bạn tải về sử dụng để chuyển đổi lần cuối ra ký tự ascii (phục vụ chương trình convert_data2ascii
lệnh call KBDtable ở trên.
5. có thắc mắc gì liên quan đến dữ liệu bàn phím này, bạn vui lòng gửi mail cho mình để mình có thể giúp bạn nhanh nhất.
Rất vui cùng chia sẻ dữ liệu cho cộng đồng pic.

LEO-XBS
13-09-2009, 12:03 PM
minh muon mua mot bo giao tiep ban phim may tinh voi con pic de thuc hien qua trinh khi an phim thi pic se cho ra mot day 5 xung, moi xung khoang 10ms. ban nao co the che tao hay dang co ma khong dung nua thi ban cho minh

noridomoto
24-09-2009, 12:02 AM
bạn vanhoan1 có sơ đồ nguyên lý không ? mới nhập môn PIC cách đây 1 tuần, nên nhìn code cũng chưa đoán ra đc cái mạch kết nối như thế nào cả.
Thân

madcow
30-09-2009, 05:23 PM
Tham khảo http://www.nerdkits.com/videos/interrupts_and_ps2_keyboard/ có nói về interupting keyboard input