Keyboard IBM PC
Oleh: Budhy Sutanto
Teknik Interface membicarakan cara-cara menghubungkan
mikrokontroler dengan peralatan lain, meskipun tidak membahas pembuatan alat
sampai jadi, tapi pengetahuan tentang teknik interface ini sangat diperlukan
dalam rancang bangun peralatan yang lebih rumit.
Untuk apa menghubungkan mikrokontroler
dengan keyboard IBM PC? Keyboard IBM PC merupakan sarana input yang sangat murah,
hanya dengan 2 utas kabel sinyal ditambah 2 kabel catu daya sistem berbasis
mikrokontroler dengan mudah bisa dilengkapi dengan 101 tombol untuk mengisikan
text maupun angka.
Keyboard yang dibahas adalah
keyboard untuk IBM PC-AT, tidak termasuk model keyboard lama untuk IBM PC-XT.
Tata kerja keyboard PC
Setiap kali salah satu tombol keyboard ditekan atau dilepas, keyboard akan
mengirim kode ke host (host adalah komputer kalau keyboard dihubungkan ke PC,
atau berupa mikrokontroler kalau keyboard dihubungkan ke perlatan berbasis
mikrokontroler). Kode tersebut dinamakan sebagai scan code.
Scan code tombol ‘S’
adalah 1B
(angka heksadesimal setara dengan angka biner 00011011). Ketika tombol ‘S’
ditekan keyboard akan mengirim
1B, jika
tombol ‘S’
ditekan terus maka keyboard akan mengirimkan
1B berikutnya
terus menerus, sampai ada tombol lain yang ditekan atau tombol ‘S’
tadi dilepas.
Keyboard juga mengirim kode saat ada satu
tombol yang dilepas, kodenya adalah
F0 (angka
heksadesimal setara dengan angka biner 11110000), jadi kalau tombol ‘S’
tadi dilepas keyboard akan mengirim
F0 dan
1B.
Kode-kode tersebut dikirim keyboard secara
seri, artinya dikirimkan satu bit demi satu bit. Misalnya
1B dikirimkan
dengan cara : mula-mula dikirim ‘1’, sesaat kemudian ‘1’ lagi dan menyusul ‘0’
sampai akhirnya terkirim sebanyak 8 bit yang berbentuk 00011011 (dikirim mulai
dari bit yang paling kanan kemudian beregeser satu per satu sampai yang paling
kiri).
Masing-masing tombol punya scan code
sendiri, termasuk tombol ‘shift’,
tombol ‘ctrl’
dan lain lain, jadi jika tombol ‘ctrl’
ditekan bersama dengan ‘S’,
maka scan code yang dikirim adalah 14 (scan code untuk ‘ctrl’)
dan 1B
(scan code untul ‘S’).
Terserah host untuk mengintepretasi scan code itu sebagai apa, bearti merupakan
tugas program dalam mikrokontroler untuk mengenal scan code.
Scan code disusun sebagai kode 8 bit bisa
dipakai untuk membedakan 256 macam kode, sedangkan keyboard PC hanya punya 101
tombol, jadi sesungguhnya kode 8 bit tadi cukup untuk semua tombol. Tapi tombol
di keyboard PC dikelompokkan menjadi 2 bagian, bagian utama dan bagian tambahan,
bagian utama cukup dinyatakan dengan scan code 1 byte saja, sedangkan bagian
tambahan diwakili dengan beberapa byte scan code yang selalu diawali dengan
E0. Misalnya
tombol ‘ctrl’ kiri diwakili dengan
14 sedangkan
tombol ‘ctrl’
kanan diwakili dengan
E0
14.
Gambar 1 menggambarkan scan code
masing-masing tombol keyboard PC. Terlihat pada gambar tersebut, scan code tidak
berupa kode ASCII yang biasa dipakai mewakili huruf , dan ditentukan secara acak,
juga. Sehingga setelah diterima host, scan code harus dirubah menjadi kode ASCII
dengan memakai cara ‘pencarian tabel’.
Gambar 1 Keyboard PC dan Scan Code
Komunikasi antar keyboard dan host adalah komunikasi dua
arah, keyboard mengirim scan code ke host, host bisa mengirim perintah untuk
mengatur kerja dari key board. Kode perintah untuk keyboard tidak sebanyak scan
code, berikut ini daftar kode printah untuk keyboard (dalam heksadesimal)
selengkapnya :
ED perintah
untuk me-nyala/padam-kan lampu indikator di keyboard, setelah menerima perintah
ED dari
host, keyboard akan menjawab dengan
FA sebagai
tanda perintah itu telah dikenali
(ACK –
acknowlwdge) dan menunggu 1 byte perintah lagi dari host untuk menentukan lampu
indikator
mana yang perlu di-nyala/padam-kan.
1
byte perintah susulan tersebut akan diartikan sebagai berikut : bit 0 dipakai
untuk mengatur lampu
indikator Scroll Lock,
bit 1 untuk Num Lock
dan bit 2 untuk
Caps
Lock, bit-bit lainnya diabaikan.
EE dipakai
host untuk memeriksa apakah keyboard masih aktip. Setelah menerima perintah
EE dari host,
keyboard akan menjawab dengan
EE pula,
menandakan dirinya masih aktip.
F0
ada keyboard yang dilengkapi 3 set scan code, perintah ini dipakai
untuk memilih scan code yang ingin
dipakai. Setelah menerima perintah
F0 dari host,
keyboard akan menjawab dengan
FA sebagai
tanda
perintah itu telah dikenali (ACK
– acknowlwdge) dan host menjawab 1 byte lagi (nilainya 1 2 atau 3)
untuk memilih set scan code. Jika byte yang dikirimkan nilainya 0, keyboard akan
menjawab dengan
nomor set scan code yang saat itu dipakai.
F3 dipakai
untuk mengatur kecepatan tanggapan keyboard (Typematic Repeat Rate), setelah
menerima
perintah F3
dari host, keyboard akan menjawab dengan
FA sebagai
tanda perintah itu telah dikenali
(ACK –
acknowlwdge) dan host menjawab 1 byte nilai kecepatan tanggapan keyboard yang
dikehendaki.
F4 dipakai
untuk me-aktip-kan kembali keyboard, setelah menerima perintah ini keyboard akan
menjawab dengan
FA
(ACK –
acknowlwdge).
F5
dipakai untuk me-nonaktip-kan keyboard, setelah menerima perintah ini
keyboard akan menjawab
dengan FA
(ACK –
acknowlwdge).
FE
dipakai meminta keyboard mengirim ulang scan code terakhir yang
dikirim.
FF
Perintah untuk me-reset keyboard
Selain perintah
dari host, keyboard juga mempunyai kode-kode lain selain scan code yang
dikirimkan ke host, sebagai berikut :
FA
berarti
ACK
(acknowledge), yaitu jawaban dari keyboard bahwa perintah dari host
sudah dikenali
dengan baik.
AA
berarti keyboard selesai memeriksa diri dan siap bekerja setelah diberi catu
daya
EE
lihat perintah
EE
di atas
FE
artinya minta host mengulang perintah terakhir yang dikirim
FF /
00 berarti
terjadi kesalahan di keyboard
Rangkaian penghubung
Keyboard PC dibangun dengan mikrokontroler MCS48, yang merupakan saudara tua
MCS51 tapi jauh lebih sederhana. Untuk keperluan membentuk rangkaian penghubung
tidak perlu diketahui bagaimana cara kerja mikrokontroler dalam keyboard, tapi
cukup meninjau rangkaian elektronik bagian penghubung pada gambar 2.
Gambar 2 Bagian penghubung di dalam Keyboard
PC
Yang menarik, rangkaian sederhana ini bisa dipakai
untuk komunikasi data 2 arah, yakni keyboard mengirimkan scan code ke PC, atau
PC mengirimkan perintah-perintah ke keyboard, misalkan perintah untuk menyalakan
beberapa lampu yang ada di keyboard.
Kbd Clock dibangkitkan oleh MCS48, merupakan sinyal pendorong
Kbd Data yang
bisa bersumber dari keyboard maupun bersumber dari PC. Level tegangan pada kedua
sinyal ini memenuhi standar sinyal TTL biasa, jadi bisa langsung dihubungkan ke
AT89C2051.
Sebagai contoh
Kbd Clock
dihubungkan ke Port 3 bit 2 (kaki 6 AT89C2051) dan
Kbd Data
dibuhungkan ke Port 3 bit (kaki 7), dalam program hal ini dinyatakan dengan
baris 1 dan baris 2 Potongan Program 1. Dengan adanya pernyataan di baris 1 dan
2, selanjutnya dalam program tidak disebutkan lagi
P3.2 atau
P2.3, tapi
ditulis KBDclock
atay KBDdata
sehingga program lebih enak dibaca. Kalau program ini dipakai di proyek lain
yang Port 3 bit 2 dan bit 3-nya dipakai untuk keperluan lain,
Kbd Clock dan
Kbd Data
bisa saja dihubungkan ke port lain, asalkan baris 1 dan 2 disesuaikan dengan
perubahan itu.
Potongan Program 1
Pernyataan pemakaian Port
1
KBDclock bit P3.2 ; P3.2 dihubungkan ke KBDclock
2
KBDdata bit P3.3 ; P3.3 dihubungkan ke KBDdata
Sumber daya untuk keyboard dicatu dari luar, harus
diperhatikan kebutuhan arusnya cukup besar bisa sampai sekitar 300 mA.
Pengiriman data dari
Keyboard
Sinyal pengiriman
data dari Keyboard
Saat tidak ada
pengiriman data, sinyal
Kbd
Clock dan
Kbd
Data dalam
keadaan ‘1’. Sinyal pengiriman data dari keyboard dalam gambar 3 dijelaskan
sebagai berikut :
· Data mulai dikirimkan dengan me-nol-kan
Kbd Data
sebagai tanda mulai pengiriman (start bit), berapa saat
kemudian setelah
Kbd
Data stabil disusul
Kbd Clock
berubah menjadi ‘0’ dan kembali ke ‘1’ lagi, ini berarti
selesai mengirimkan data 1 bit.
· Setelah mengirim ‘start bit’, dikirimkan bit 0, bit 1 dan
seterusnya sampai bit 7.
· Menyusul dikirim ‘parity bit’, yaitu bit kontrol yang berguna bagi
host penerima data untuk memastikan data
yang diterima tidak ada kesalahan. Jika banyaknya bit ‘1’ yang terdapat di bit 0
sampai bit 7 ganjil, ‘parity
bit’ akan bernilai ‘1’.
· Sebagai penutup (stop bit)
Kbd Data
dikembalikan kekeadan normalnya, yaitu ‘1’.
Gambar 3 Sinyal komunikasi data seri dari
Keyboard
Menerima data 1 bit dari Keyboard
Frekuensi
Kbd Clock
sekitar 20 sampai 30 KHz. Jumlah bit yang dikirim lewat
Kbd Data
adalah 11, jadi
Kbd
Clock hanya mengirim 11 pulsa clock untuk mendorong 11 bit data
tersebut satu per satu. Perubahan
KBD
Clock dari
‘1’ ke ‘0’ merupakan bagian terpenting dari bahasan di atas, pada saat itulah
data di KBD Data
boleh diambil! Potongan Program 2 adalah bagian program menunggu saat tepat
untuk mengambil data.
Potongan Program 2
Mengambil data 1 bit
1
AmbilBit:
2
JNB KBDclock,* ; Selama KBBclock='0' tunggu di baris ini
3
JB KBDclock,* ; Selama
KBDclock='1' tunggu di baris ini
4
MOV C,KBDdata ; Ambil data bit di KBDdata ke Carry bit PSW
5
RET
· Mula-mula dianggap
KBDclock pada
level ‘0’ jadi harus menunggu agar
KBDclock
menjadi ‘1’. Baris 1 yang
mempunyai makna : selama
KBDclock =
‘0’ (JNB)
AT89C2051 akan menunggu di baris 1 (tanda
* artinya
jalankan lagi instruksi bersangkutan), begitu
KBDclock=’1’
maka AT89C2051 akan mengerjakan baris 2.
· Baris 2 menungu
KBDclock dari
level ‘1’ berubah menjadi ‘0, hal ini dilakukan dengan logika yang berbalikan
dengan baris 1, instruksi yang dipakai adalah
JB bukan lagi
JNB. Lolos
dari baris 2 data di
KBDdata boleh
diambil.
· Di baris 3 nilai
KBDdata
diambil ke Carry
bit di PSW
(Program Status Word). Jadi hasil pembacaan data 1 bit
dari sub-rutin ini disimpan di
Carry bit.
Menerima data 1 byte dari Keyboard
Potongan Program 3
mengendalikan
P3.2
dan P3.3
untuk menerima data 1 byte dari keyboard, sesuai Gambar 3 sub-rutin
AmbilByte di
bagi menjadi beberapa bagian :
·
Bagian ‘start bit’ : baris 3 mengambil ‘start bit’ di
KBDdata
dengan bantuan sub-rutin
AmbilBit,
‘start bit’
nilainya harus ‘0’ hal ini diperiksa di baris 4, jika ternyata bit yang didapat
bernilai ‘1’ berarti terjadi
kesalahan dan kembali mengulang baris 3.
·
Bagian ‘8 bit data’ : baris 6 sampai 11 mengambil data bit 0
sampai bit 7, data diambil satu bit demi satu
bit di baris 8 dan langsung digeser ke akumulator
A (baris 9),
hal ini dilakukan sebanyak 8 kali.
R7 dipakai
sebagai ‘count down counter’ untuk mengatur pengulangan itu, di baris 6
R7 diberi
nilai 8, di baris 10 isi
R7
dikurangi 1, selama
R7 belum=0 AT89C2051 akan mengulang
AmbilLagi di
baris 7. Data yang ditampung di A,
untuk sementara disimpan dulu di
R7 (baris
11).
·
Bagian ‘bit pariti’ : baris 14 sampai 20 membandingkan pariti dari
data yang diterima dengan pariti yang
dikirim keyboard, kalau tidak cocok berarti terjadi kesalahan.
Bit
Pariti (P) di PSW (Program Status Word) merupakan pariti genap
dari isi A,
di baris 14 sampai 16 bit P
disimpan ke A.0
setelah sebelumnya isi
A
di-‘nol’-kan. Baris 17 mengambil bit pariti gasal
yang dikirim
keyboard dan di simpan ke
A.1
(baris
18). Keadaan yang benar adalah kalau
A.0<>A.1,
atau banyaknya bit
‘1’ di Akumulator adalah gasal, atau
P bernilai
‘1’. P
dipindahkan ke
C
di baris 19, dan diperiksa di baris 20,
kalau nilai C=0
berarti Salah.
· Bagian ‘stop bit’ : baris 24 mengambil ‘stop bit’ jika nilainya
‘0’ berarti salah.
· Sifat penting dari sub-rutin ini adalah :
· saat keluar dari subrutin jika nilai
C=1 berarti
A berisi
data dari keyboard, sebaliknya jika
C=0 berarti
terjadi kesalahan dari isi
A tidak bisa
dipakai.
· Dalam sub-rutin ini
R7 dipakai,
jadi isinya berubah setelah keluar dari sub-rutin.
Potongan Program 3 Mengambil data 1 byte dari Keyboard
1 AmbilByte:
2 *****
Bagian ‘start bit’
3
ACALL AmbilBit
4
JC
AmbilByte ; Salah, ‘start bit’ harus =’0’
5 *****
Bagian 8 bit data
6
MOV
R7,#8
7 AmbilLagi:
8
ACALL AmbilBit
; ambil 1 bit
9
RRC A
; geser masuk ke A
10
DJNZ R7,AmbilLagi ; sudah 8 kali? Ulangi kalau belum
11
MOV R7,A ; simpan dulu hasilnya di R7
12
13
***** Bagian bit pariti
14
MOV C,P ; ‘pariti genap’ dari Acc. A simpan dulu ke C
15
CLR A ; A := 00000000
16
MOV A.0,C ; A.0 := pariti yang disimpan di C
17
ACALL AmbilBit ; ambil ‘pariti gasal’ yang dikirim keyboard
18
MOV A.1,C ; simpan ke A.1
19
MOV C,P ; yang benar adalah A.1<>A.0, atau P=1
20
JNC Salah ; kalau C=0, Salah!
21
22
***** Bagian ‘stop bit’
23
MOV A,R7 ; kembalikan R7 ke A
24
ACALL AmbilBit ; ambil ‘stop bit’, kalau C=0, Salah!
25
Salah:
26
RET
Merubah ScanCode menjadi kode ASCII
Kalau tidak ada
kesalahan, data yang diperoleh dari sub-rutin
AmbilByte
bisa berupa:
·
scan code kalau nilai data tersebut antara
01 (Hex)
sampai 83
(Hex).
·
F0
sebagai awalan dari scan code menandakan ada tombol dilepas
·
E0
sebagai awalan dari scan code tombol tambahan
·
FA,
AA,
EE,
FE,
FF,
00 yaitu
kode-kode yang dipakai untuk menjawab perintah dari host
Kalau kode tersebut berupa scan code, kode tersebut
harus diterjemahkan dulu dengan Potongan Program 4. Perubahan scan code menjadi
kode ASCII yang dilakukan sub-rutin
JadikanASCII,
sub-rutin ini mengandalkan data yang sudah ditabelkan dalam
TabelScanCode,
karena tabel ini cukup panjang tidak disertakan di sini tapi bisa dijumpai dalam
Program Lengkap.
Sebelum memanggil
JadikanASCII,
Akumulator A
harus diisi dengan scan code yang akan dijadikan kode ASCII, di baris 2
DPTR
diarahkan ke
TabelScanCode, bagian
@A+DPTR di
baris 3 menghitung posisi scan code bersangkutan di
TabelScanCode
dengan cara menjumlahkan nilai
DPTR dengan
A,
kemudian atas dasar perhitungan itu isi salah satu byte
TabelScanCode
(yang berupa kode ASCII) diambil ke
A.
Potongan Program 4
Merubah ScanCode menjadi kode ASCII
1 JadikanASCII:
2
MOV DPTR,#TabelScanCode
3
MOVC A,@A+DPTR
4
RET
Pengiriman data ke
Keyboard
Sinyal pengiriman
data ke Keyboard
Saat tidak ada
pengiriman data, sinyal
Kbd Clock dan
Kbd Data
dalam keadaan ‘1’.
Agar mudah dibedakan, Gambar 4 digambarkan dengan dua warna, warna biru artinya
sinyal itu diatur oleh host, dan warna merah artinya sinyal itu dibangkitkan
oleh keyboard. Sinyal pengiriman data dari host dalam gambar 4 dijelaskan
sebagai berikut :
· Sebelum mengirim data host ‘minta ijin’ pada keyboard dengan cara
me-‘nol’-kan
Kbd
Clock setidak-
tidaknya selama 100 mikro-detik, dan kemudian di-‘satu’-kan kembali (warna biru).
· Setelah menerima ‘permintaan ijin’ dari host, keyboard
membangkitkan 12 pulsa clock di
Kbd Clock (warna
merah). Keyboard akan mengambil data dari host setiap saat pulsa tersebut
berubah dari level ‘1’ menjadi
‘0,
jadi data dari host sudah harus siap sebelum hal tersebut terjadi.
· Data mulai dikirimkan dengan me-nol-kan
Kbd Data
sebagai tanda mulai pengiriman (start bit), saat
Kbd
Clock berubah
dari ‘1’ menjadi ‘0’ data 1 bit tadi diterima oleh keyboard.
· Setelah mengirim ‘start bit’, dikirimkan bit 0, bit 1 dan
seterusnya sampai bit 7.
· Menyusul dikirim ‘parity bit’, yaitu bit kontrol yang berguna bagi
keyboard untuk memastikan data yang
diterima tidak ada kesalahan. Jika banyaknya bit ‘1’ yang terdapat di bit 0
sampai bit 7 ganjil, ‘parity bit’
akan bernilai ‘1’.
· Sebagai penutup (stop bit)
Kbd Data
dikembalikan kekeadan normalnya, yaitu ‘1’.
· Selesai menerima 11 bit data di atas (warna biru : ‘start bit’, 8
bit ditambah dengan ‘parity bit’ dan
‘stop’bit’),
pada pulsa yang kedua belas keyboard mengirimkan
ACK=’0’
(warna merah) yang menandakan
semua bit sudah diterima.
Gambar 4 Proses pengiriman data ke Keyboard
Mengirim data 1 bit ke Keyboard
Perubahan
KBDclock dari
‘1’ ke ‘0’
merupakan bagian terpenting dari bahasan di atas, pada saat itulah data di
KBDdata
diambil oleh keyboard, jadi sebelum saat itu terjadi data harus disiapkan di
KBDData!
Potongan Program berikut adalah bagian program menunggu saat tepat untuk
mengirim data.
Potongan
Program 5 Mengirim data 1 bit
1
KirimBit:
2
JNB KBDclock,* ; Selama KBBclock=’0’ tunggu di baris ini
3
MOV KBDdata,C ; Kirim data bit di Carry bit PSW ke KBDdata
4
JB KBDclock,* ; Selama KBDclock=’1’ tunggu di baris ini
5
RET
· 1
bit data yang akan dikirim sebelumnya sudah disimpan di bit
Carry
· Mula-mula dianggap
KBDclock pada
level ‘0’ jadi harus menunggu dulu agar
KBDclock
menjadi ‘1’, hal ini
dilakukan pada baris 1 yang mempunyai makna : selama
KBDclock =
‘0’ (JNB)
AT89C2051 akan menunggu di
baris 1 (tanda
*
artinya jalankan lagi instruksi bersngkutan), begitu
KBDclock=’1’
maka AT89C2051 akan
mengerjakan baris 2.
· Di baris 2 isi
Carry bit di
PSW
(Program Status Word) dikirim ke
KBDdata, data
ini akan diambil keyboard
saat KBDclock
berubah dari ‘1’ menjadi ‘0’.
· AT89C2051 baru akan meninggalkan sub-rutin ini setelah data
diambil keyboard, jadi harus menungu
KBDclock
dari level ‘1’ berubah menjadi ‘0 (baris 3), hal ini dilakukan dengan logika
yang berbalikan dengan
baris 1, instruksi yang dipakai adalah
JB bukan lagi
JNB.
Mengirim data 1 byte ke Keyboard
Potongan Program 6
merupakan program pengirim perintah dari host, sesuai sinyal Gambar 4 sub-rutin
KirimByte
di bagi menjadi beberapa bagian :
·
1 byte data yang akan dikirim sebelumnya sudah disimpan di
Akumulator A.
Bit Pariti (P)
di PSW
(Program
Status Word) merupakan pariti genap dari isi
A, di baris 2
dan 3 bit P
disimpan dulu ke bit
F0 di
PSW,
nanti
setelah pengiriman 8 bit data bit pariti ini akan dikirim ke keyboard.
· Bagian ‘minta ijin’ : baris 6 sampai 9 me-‘nol’-kan
Kbd Clock
selama 120 mikro-detik dan kemudian di-
‘satu’-kan kembali
· Bagian ‘start bit’ : baris 12 dan 13 mengirim ‘start bit’.
· Bagian ‘8 bit data’ : baris 16 sampai 20 mengirim 8 bit isi
Akumulator (A.0
sampai A.7)
satu bit demi satu
bit ke keyboard. Di baris 18 isi
A diputar 1
bit ke kanan lewat C (RRC
A), hasil
dari perputaran ini
A.0
bergeser
masuk ke C,
A.1 masuk
ke A.0,
dan seterusnya
A.7
masuk ke A.6,
nilai C
sebelumnya masuk ke
A.7.
Selesai perputaran ini, bit yang semula di
A.0 berada di
C dikirim
ke keyboard di baris 19.
· Baris 18 dan 19 diulang sebanyak 8 kali.
R7 dipakai
sebagai ‘count down counter’ untuk mengatur
pengulangan itu, di baris 16
R7 diberi
nilai 8, di baris 20 isi
R7 dikurangi
1, selama R7
belum=0 AT89C2051
akan mengulang KirimLagi di baris 17.
· Bagian ‘bit pariti’ : bit pariti yang tadi disimpan di
F0
dikembalikan ke
C
(baris 23), bit ini adalah pariti
genap dari Akumulator
A, sedangkan
yang dikehendaki keyboard adalah bit pariti gasal, jadi nilailah harus
dibalik dulu di baris 24 baru kemudian dikirim di baris 25.
· Bagian ‘stop bit’ : baris 28 dan 29 mengirim ‘stop bit’
· Bagian ‘bit ACK’ : sebelum mengakhiri sub-rutin ini baris 32
mengambil bit
ACK.
· Sifat penting dari sub-rutin ini adalah :
·
Data 1 byte yang akan dikirim harus diisikan ke
A sebelum
masuk sub-rutin ini.
· Dalam sub-rutin ini
R7 dan
F0 dipakai,
jadi isinya berubah setelah keluar dari sub-rutin.
Potongan Program 6
Mengirim data 1 byte ke Keyboard
1 KirimByte:
2
MOV C,P ; simpan dulu bit pariti
3
MOV F0,C ; ke bit F0 di PSW
4
5 *****
Bagian ‘minta ijin’
6
CLR KBDclock ; KBDclock di-‘nol’-kan
7
MOV R7,#60
8
DJNZ R7,* ; menunggu disini selama
2x60 mikro-detik
9
SETB KBDclock ; KBDclock di-‘satu’-kan
10
11
***** Bagian Start bit
12
CLR C
13
ACALL KirimBit
14
15
***** Bagian 8 bit data
16
MOV R7,#8
17
KirimLagi:
18
RRC A ; pindahkan
A.0 ke C
19
ACALL KirimBit ; kirimkan
20
DJNZ R7,KirimLagi ; sudah 8
kali? Ulangi kalau belum
21
22
***** Bagian bit pariti
23
MOV C,F0
24
CPL C
25
ACALL KirimBit ; kirim 'pariti
gasal' ke keyboard keyboard
26
27
***** Bagian Stop bit
28
SETB C
29
ACALL KirimBit
30
31
***** Bagian mengambil sinyal ACK
32
ACALL AmbilBit
33
RET
Penutup
Dalam pembahasan
Teknik Interface, program yang ditulis umumnya hanya dalam bentuk sub-rutin
seperti yang dibahas di atas, sub-rutin tersebut menjembatani perangkat keras
berupa rangkaian elektronik dengan program mikrokontroler, sehingga
program-program di atasnya bisa ditulis tanpa harus banyak mengetahui seluk
belum rangkaian elektronik.
Berikut ini
merupakan contoh pemakaian sub-rutin di atas.
Potongan
Program 7 Program Menu sederhana yang dikendalikan keyboard
1 Menu:
2
LCALL AmbilByte ; ambil 1
byte dari keyboard
3
JNC Menu ; kalau
ada kesalahan ulangi lagi ke Menu
4
LCALL JadikanASCII ; kalau
tidak salah jadikan Kode ASCII
5
CJNE A,#’a’,TombolB? ; tombol
‘a’ ditekan? Bukan, mungkin ‘b’
6
LCALL Program_A ; jalankan
Program A
7
SJMP Menu ; kembali
ke Menu
8 ;
9 TombolB?:
10
CJNE A,#’b’,TombolC? ; tombol
‘b’ ditekan? Bukan, mungkin ‘c’
11
LCALL Program_B
; jalankan Program B
12
SJMP Menu
; kembali ke Menu
13 ;
14 TombolC?:
15
CJNE A,#’c’,Menu
; tombol ‘c’ ditekan? Bukan, kembali ke Menu
16
LCALL Program_C
; jalankan Program C
17
SJMP Menu
; kembali ke Menu
18 ;
19 Program_A:
20
.. .. ..
; intruksi-2 Program A ditulis di sini
21
RET
22 ;
23 Program_B:
24
.. .. ..
; intruksi-2 Program B ditulis di sini
25
RET
26 ;
27 Program_C:
28
.. .. ..
; intruksi-2 Program C ditulis di sini
29
RET
Potongan
Program 8 Menyalakan lampu indikator ‘Caps Lock’
1
NyalakanCapsLock:
2
MOV A,#$ED ; perintah menyala/padamkan
lampu indikator
3
LCALL KirimByte ; kirimkan ke keyboard
4
LCALL AmbilByte ; tunggu jawaban ‘ACK’
5
MOV A,#4 ; bit 2 untuk mengatur lampu
‘Caps Lock’
6
LCALL KirimByte ; kirimkan ke keyboard
7
RET
Pustaka
----,1983, Personal
Computer Hardware Reference Library – Technical Reference, International
Bussiness Machine Co.
Craig Peacock,
2000, Interfacing the PC's Keyboard, http://www.beyondlogic.org