Antar Muka PC Keyboard dengan DST-51

AN0009

Teknik interfacing PC Keyboard Connector ke AT89C51 Minimum System

Akses Keyboard oleh DST-51

Pengiriman data Keyboard ke DST-51

  • Pengiriman data dimulai dengan mengirimkan start bit (logika 0 pada Kbd Data) diikuti dengan sebuah sinyal clock ( negative going edge ) untuk memberitahu DST-51 bahwa keyboard mulai mengirimkan data
  • Setelah Kbd Clock kembali ke logika 1 maka dilanjutkan dengan pengiriman bit ke 0 hingga bit ke 7 di mana setiap bit selalu diikuti dengan sebuah sinyal clock
  • Selanjutnya bit pariti dikirimkan dan diikuti sinyal clock. Bit pariti = 0 bila jumlah logika 1 (dari bit 0 hingga bit 7) adalah ganjil dan bit pariti = 1 bila jumlah logika 1 (dari bit 0 hingga bit 7) adalah genap
  • Proses pengiriman data ditutup dengan dikirimkan logika 1 diikuti dengan sebuah sinyal clock sebagai stop bit
  • Kbd Data kembali ke logika 1 hingga pengiriman data selanjutnya

Potongan program inisial keyboard

Init_Keyboard:

Mov R0,#08H ;Aktifkan Interrupt keyboard
Mov IE,#80H ;
Clr Shift_Flag ;Matikan Shift Flag
Setb IE.0 ;
Ret

Potongan program pengambilan 1 byte data dari keyboard

Ambil_Keyboard:

Clr IE.0 ;Matikan Interrupt 0
Push 00H ;Simpan R0 di stack
CLR A ;Tunggu ada Interrupt keyboard
JNB INT0,* ;Level high
Mov R0,#08H
Ambil_Keyboard2: ;Ambil data dari P1.4 setiap
JB INT0,* ;kali interrupt keyboard transisi
MOV C,P1.4 ;low
RR A ;Geser Acc A
MOV A.7,C ;Simpan data di bit 7 Acc A
JNB INT0,* ;Tunggu Int0 high
Djnz R0,Ambil_Keyboard2 ;Lakukan 8x
Jb INT0,* ;Abaikan Parity Bit
Jnb INT0,* ;
Jb INT0,* ;Abaikan Stop Bit
Jnb INT0,* ;
Pop 00H ;Ambil R0 dari Stack
Setb IE.0 ;Aktifkan kembali Interrupt 0
Ret

Scan Code Keyboard

  • 01H hingga 83H adalah scan code
  • F0H sebagai awalan dari scan code menandakan ada tombol dilepas
  • E0H sebagai awalan dari scan code tombol tambahan
  • FAH, AAH, EEH, FEH, FFH, 00H yaitu kode-kode yang dipakai untuk menjawab perintah dari host
Flowchart Keyboard

Flowchart pengambilan scan code keyboard

Listing Code

.CODE

LShift EQU 12H
CapsLock EQU 58H
RShift EQU 59H
Shift_Flag bit 0
ORG *
Init_Keyboard:

Mov R0,#08H ;Aktifkan Interrupt keyboard
MOV IE,#80H ;
Clr Shift_Flag ;Matikan Shift Flag
SETB IE.0 ;
RET

Ambil_Keyboard:

Clr IE.0
Push 00H
CLR A ;Tunggu ada Interrupt keyboard
JNB INT0,* ;Level high
Mov R0,#08H
Ambil_Keyboard2: ;Ambil data dari P1.4 setiap
JB INT0,* ;kali interrupt keyboard transisi
MOV C,P1.4 ;low
RR A ;Geser Acc A
MOV A.7,C ;Simpan data di bit 7 Acc A
JNB INT0,* ;Tunggu Int0 high
Djnz R0,Ambil_Keyboard2 ;Lakukan 8x
Jb INT0,* ;Buang Stop Bit
Jnb INT0,* ;
Jb INT0,* ;
Jnb INT0,* ;
Pop 00H
Setb IE.0
Ret

Konversi_ScanCode :

Mov DPTR,#AddrTable ;Isi DPTR dengan alamat awal AddrTable
Movc A,@A+DPTR
Ret

Keyboard_Interrupt:

Clr IE.0 ;Keyboard ditekan/dilepas
Acall Ambil_Keyboard ;
Cjne A,#0F0H,Kybd_TidakLepas ;
Jb INT0,* ;Keyboard dilepas
Acall Ambil_Keyboard ;

;PERIKSA TOMBOL YANG DILEPAS

;Periksa tombol shift atau karakter yang dilepas
;Shift atau tombol lain yang dilepas?

Cjne A,#LShift,Bukan_LShiftlepas ;Shift dilepas?
Ajmp Komplemen_ShiftFlg ;Ya! Komplemen Shift Flag
Bukan_LShiftlepas:
Cjne A,#RShift,Bukan_Shiftlepas ;A<>RShift, bukan Shift kiri
;atau shift kanan dilepas

Komplemen_ShiftFlg:

Cpl Shift_Flag

Bukan_Shiftlepas:
Setb IE.0
Clr C
Reti

;KEYBOARD DITEKAN

;- Periksa yang ditekan:
; - Shift -> Komplemen Shift Flag
; - CapsLock -> Komplemen Shift Flag
; - Bukan Shift atau Capslock -> Konversi Scan Code
; - Shift Flag set -> Capital
; - Shift Flag clear -> Non Capital

Kybd_TidakLepas:

Cjne A,#Lshift,Bukan_Lshifttekan ;Shift Kiri ditekan?
Ajmp Komplemen_ShiftFlg ;Komplemen Shift Flag
Bukan_LShifttekan:
Cjne A,#RShift,Bukan_RShifttekan ;Shift Kanan ditekan?
Ajmp Komplemen_ShiftFlg ;Komplemen Shift Flag
Bukan_RShifttekan:
Cjne A,#CapsLock,BukanCapsLock ;Caps Lock ditekan
Ajmp Komplemen_ShiftFlg ;Komplemen Shift Flag
BukanCapsLock :
Acall Konversi_Scancode ;Konversi scan code table
Jb Shift_Flag,Capital ;Shift Flag set -> capital
Setb IE.0
Setb C
Reti
Capital:
Lcall Capitalize
Setb IE.0
Setb C
Reti
AddrTable:
DB 00
DB 0F9H
DB 00
DB 0F5H,0F3H,0F1H,0F2H,0FCH ;Function Key, FC = F12
DB 00H
DB 0FAH,0F8H,0F6H,0F4H ;FA=F10
DB 0C0H ;Tab (Special Code)
DB ’~' ;~
DB 00H
DB 00H
DB 0C1H ;AltL (Special Code)
DB 0C2H ;ShiftL (Special Code)
DB 00H
DB 0C3H ;CtrlL (Special Code )
DB ’q1′
DB 00H,00H,00H
DB ’zsaw2′
DB 00H,00H
DB ’cxde43′
DB 00H,00H
DB ’ vftr5′
DB 00H,00H
DB ’nbhgy6′
DB 00H,00H,00H
DB ’mju78′
DB 00H,00H
DB ’,kio09′
DB 00H,00H
DB ’./l;p-’
DB 00H,00H,00H
DB 2CH ; ‘
DB 00H
DB ’[='
DB 00H,00H
DB 0C5H
DB 0C6H
DB 0AH ;Enter
DB ']‘
DB 00H
DB ’\’
DB 00H,00H,00H,00H,00H,00H,00H,00H
DB 08H ;BackSpace
DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H
DB 0DH ;Esc
DB 00H
DB 0FBH ;Function Key F11
DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H
DB 0F7H ;Function Key

Tags: , , , ,

Leave a Reply