- 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
hasilnya kalo udah mahir, seperti ini loooo....
code full bisa didapat disini