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
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 ;
RETAmbil_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
RetKonversi_ScanCode :
Mov DPTR,#AddrTable ;Isi DPTR dengan alamat awal AddrTable
Movc A,@A+DPTR
RetKeyboard_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 dilepasKomplemen_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 CapitalKybd_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: antar muka, antarmuka, dst51, Interface, keyboard