PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   PIC - Thiết kế và Ứng dụng (http://www.picvietnam.com/forum/forumdisplay.php?f=23)
-   -   Giao tiếp keyboard ps/2, pic, LCD (http://www.picvietnam.com/forum/showthread.php?t=813)

tranhuyky 20-12-2006 04:45 PM

Giao tiếp keyboard ps/2, pic, LCD
 
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

tính hiệu ACK trong keyboard
 
Trích:

Nguyên văn bởi pham_dinh_hung83 (Post 6533)
đọ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
Code:

;-------------------------------------------------
        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

Trích:

Nguyên văn bởi enti (Post 6574)
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

Liên quan ghép nối/debug
 
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/Microc...yboard%202.htm

và làm cho pic theo link project này:
http://electronic-engineering.ch/mic...l#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

day cost giao tiep ban phin hien thi lcd
 
Code:

// *****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(11111110)============//
      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(11111101)=============//
        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

Nhan du lieu tu ban phím chuẩn PS/2
 
1 Attachment(s)
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

Trích:

;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/inter..._ps2_keyboard/ có nói về interupting keyboard input


Múi giờ GMT. Hiện tại là 07:43 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam