- LEVEL : ADVANCE
- BAHAN2 : AVR micro ( ATTINY 2313), KEYBOARD PS-2, DOTMATRIX , R 10K
- DASAR yg PERLU DIKUASAI : Basic I/O, Interupt dan menulis ke DOT MATRIX ( love hurts) silahkan baca disini
Pertama kita perlu mengetahui port keyboard PS2 itu seperti ini :
sedangkan pada input micro , umumnya menggunakan koneksi seperti ini :
dimana input 'clock' masuk ke pin interupt pada microcontroller, sedangkan pin 'data' masuk ke pin biasa dari AVR (bidirect). semua I/O di pull up dengan resistor 10k ke Vcc. Selanjutnya kita bahas dulu format transfer data saat ada penekanan tombol , gambarannya seperti ini :
jadi keyboard dapat mengirim data karakter ke micro, sedangkan micro mengirimkan setting keyboard. sehingga komunikasinya bidirectional
oke, selanjutnya kita perhatikan kode scan/hex dari pencetan tombol keyboard, tabelnya seperti ini :
setelah itu kita susun port ps 2 & port dot matrix dengan susunan I/O seperti ini :
==========potongan script di main(), lengkapi sendiri==============
//clock di interupt 0 (pin 6)
MCUCR |= (1<<ISC01) | (0<<ISC00); // falling edge int 0
GIMSK |= (1<<INT0);
//data keyboard di port PD3 (pin 7)
DDRD &= ~_BV(PD3) ;
//kolom dot matrix
DDRD |= _BV(PD0) | _BV(PD1) | _BV(PD4) | _BV(PD5) | _BV(PD6) ;
//data / baris dot matrix
DDRB |= _BV(PB0) | _BV(PB1) | _BV(PB2) | _BV(PB3) | _BV(PB4) | _BV(PB5) | _BV(PB6) ;
// output led buat ngecek ada pencetan keyboard di PA0 (pin 4)
DDRA |= _BV(PA0);
kemudian yg ga kalah pentingnya adalah membikin databse/lookup table untuk scan code keyboard menjadi baris data dot matrix. (harap baca dulu cara menulis di dot matrix)
const char h_A[5] PROGMEM = {0x7e, 0x11, 0x11, 0x11, 0x7e}; //A
const char h_B[5] PROGMEM = {0x7f, 0x49, 0x49, 0x49, 0x36}; //B
const char h_C[5] PROGMEM = {0x3e, 0x41, 0x41, 0x41, 0x22}; //C
const char h_D[5] PROGMEM = {0x7f, 0x41, 0x41, 0x22, 0x1c}; //D
...... dst ....
jadi, tiap ada pemencetan tombol, maka pin clock dari keyboard akan menginterupt ( falling / turun dari 1-0) AVR dengan format seperti gambar diatas, sehingga script pada interuptnya berupa
SIGNAL (SIG_INT0) //routinre interupt INT0
{
if(clk > 1 && clk <10) //clock yg bermanfaat saja yg dibaca
{
//pindahkan data dari PIN DATA keyboard ke memory
key[(clk - 2)] = ((PIND & _BV(PIND3)) >> PIND3);
//nyalakan led penanda ada data dikirim keyboard
PORTA |= _BV(PA0);
}
clk++; // tambahkan nilai variable clk tiap interrupt
if(clk == 12) //maksimum clock yg dikirim
{clk=1;
PORTA &= ~_BV(PA0); //matikan led tanda data kosong
}
}
selanjutnya kita terjemahkan data dari memory array "key" kedalam bentuk hexa yg kemudian diterjemahkan dengan database metode "lookup"
int a;
char hurufnya[5];
//rumus merubah array key ke hexa scan code
a= (128*key[7]) + (64*key[6]) + (32*key[5]) + (16*key[4]) + (8*key[3]) + (4*key[2]) + (2*key[1]) + key[0] ;
switch (a)
{
case 0x1C : strncpy_P(hurufnya,h_A,5); break;
case 0x32 : strncpy_P(hurufnya,h_B,5); break;
case 0x21 : strncpy_P(hurufnya,h_C,5); break;
case 0x23 : strncpy_P(hurufnya,h_D,5); break;
case 0x24 : strncpy_P(hurufnya,h_E,5); break;
case 0x2B : strncpy_P(hurufnya,h_F,5); break;
............dan seterusnya
default : strncpy_P(hurufnya,h_43,5);
}
// selanjutnya ditampilkan di DOTMATRIX ( tampilkan per kolom)
//kolom 1
PORTB = 0x80;
PORTD &= ~_BV(PD0);
PORTD |= _BV(PD1) | _BV(PD4) | _BV(PD5) | _BV(PD6) ;
PORTB = hurufnya[0];
_delay_ms(10);
//kolom2
PORTB = 0x80;
PORTD &= ~_BV(PD1);
PORTD |= _BV(PD0) | _BV(PD4) | _BV(PD5) | _BV(PD6) ;
PORTB = hurufnya[1];
_delay_ms(10);
......dst.....
Masalahnya jaman sekarang udah jarang yang jual model PS/2 dan yang umum itu versi USB. Tinggal beli adapter nya aja...ehhh ternyata didalemnya ga ada rangkaian tambahannya loo...bikin aja sendiri
Jangan lupa untuk melakukan pull-up clock dan data dengan resistor 10K ke Vcc
hasilnya kalo udah mahir, seperti ini loooo....
code full bisa didapat disini