Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Interfejs myszy i klawiatury komputerowej dla PICa

zasoby 17 Wrz 2004 22:21 4243 1
  • Dużo układów bazujących na PIC wykorzystują proste przyciski do sterowania funkcjami zbudowanego urządzenia. Przy niewielkich ilościach jest opłacalne kupienie kilku przycisków, wszystko komplikuje się jeżeli potrzebne jest dużo przycisków i zaprogramowanie pod każdym przyciskiem innej funkcji. Wspomnijmy, że pomysł na dwukrotne kliknięcie został opatentowany ;) Z drugiej strony ceny klawiatur są bardzo niskie, osoby wymieniają klawiaturę przynajmniej raz na kilka lat. Czemu nie wykorzystać klawiatury lub myszki do sterowania pracą mikrokontrolera PIC?

    Rozwiązanie jest kompatybilne tylko z złączem PS/2.

    Interfejs myszy i klawiatury komputerowej dla PICa

    Demonstracyjny listing został napisany dla PIC16F628, gdzie pin RA0 jest używany dla linii DATA PS2 a RA1 jest używany dla CLK. Można użyć dowolnego PICa i dowolnych pinów wprowadzając korekcję do listingu. Na pokładzie klawiatury znajduje się pewnego rodzaju niewielki procesor z którym należy się skomunikować. Do tego są używane linie DATA i CLK, a zasilanie +5V jest doprowadzane pinami 5 oraz 2. Dane są wysyłane w sposób szeregowy - bit startu - 8 bitów danych oraz bit stopu. Wszystko jest odpowiednio synchronizowane przez sygnał zegarowy.

    Listing programu dane wejściowe z klawiatury PS/2

    Code:

    MAIN: comf PORTA,W ; are clock and data lines both high?
    andlw b’0000001’ ; (i.e. is keyboard in Idle state?)
    btfsc STATUS,Z
    goto MAIN ; no
    call RECEIVE ; yes, so check if a key pressed
    movf BYTE,W ; is BYTE > 0 (has a data byte been received?)
    btfsc STATUS,Z
    goto MAIN ; no, so try again
    btfss PARITY,0 ; yes, is parity bit correct (hi)?
    goto MAIN ; no, so start again
    call YourRoutine ; yes (data received ok so use it as you want)
    goto MAIN ; repeat it all again
    RECEIVE: btfss PORTA,1 ; wait till clock high (idle clock)
    goto RECEIVE ; not yet high
    btfsc PORTA,0 ; it’s high, so is data line low (start bit)?
    return ; no, it’s high, so a false Start bit, try again
    clrf BYTE ; yes, set BYTE to zero prior to getting data
    movlw 8 ; set loop for 8 data bits
    movwf LOOP
    clrf PARITY ; clear parity record
    RECDATA: rrf BYTE,F ; rotate byte to make room for received bit
    call HIGHLOW ; wait for clock high to low transition
    RX2: btfsc PORTA,0 ; is data low?
    goto RECSET ; no, it’s high
    bcf BYTE,7 ; yes, data is low so clear bit 7 of BYTE
    goto RECNEXT ; and ignore parity counter
    RECSET: bsf BYTE,7 ; set bit 7 of BYTE
    incf PARITY,F ; and add 1 to parity counter
    RECNEXT: decfsz LOOP,F
    goto RECDATA ; loop until all 8 bits have been received
    call HIGHLOW ; wait for clock high to low transition
    movf PORTA,W ; get parity bit
    xorwf PARITY,W ; XOR with parity counter
    andlw 1 ; extract bit 0 of parity
    movwf PARITY ; and store it
    call HIGHLOW ; wait for Stop bit (but not actually used)
    return ; return to main routine
    HIGHLOW: btfss PORTA,1 ; loop until clock is high
    goto HIGHLOW
    HL2: btfsc PORTA,1 ; loop until clock is low
    goto HL2
    return


    W załączniku opis w języku angielskim, schemat przykładowego układu, listingi programów, znaczenie kodów klawiszy.

    EPE


    Fajne!