"Kembali Ke Dasar Elektronika Digital ... "

Senin, 12 November 2012

INTERFACING KEYBOARD ke AVR (ATtiny) & OUTPUT ke DOT MATRIX



- 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
Share:

8 komentar:

  1. Gan boleh minta programnya?
    ifuraixame@gmail.com
    terima kasih

    BalasHapus
  2. mas boleh minta programnya gak?
    kirim ke sini ya mas : furiysa@gmail.com
    terima kasih mas

    BalasHapus
  3. gan tolong minta programnya.
    kirim ke arnoyappi@yahoo.co.id
    matursuwun

    BalasHapus
  4. mas boleh minta programnya?
    sofian.dh.89@gmail.com trimakasih

    BalasHapus
  5. silahkan download source yang full di : http://goo.gl/Pe7qmX

    BalasHapus
  6. gan,,,bleh minta rangkaian skematiknya gk? kirim ke irsadnurfiqri@gmail.com,,,, makasih

    BalasHapus
  7. mas boleh minta programnya gak?
    kirim ke sini ya mas : zannagi6@gmail.com
    terima kasih mas

    BalasHapus

Kontak Langsung



12179018.png (60×60)
+628155737755

HP: 081331339072
Mail : ahocool@gmail.com

ANTI SPAM !



Blog Ini Mendukung Blogger Indonesia Yang Jujur dan Memberikan Informasi Sebenarnya, Bukan Menyampah Demi $Rp$ Yang Hanya Merendahkan Blogger Indonesia

Site View

Categories

555 (6) 7 segmen (3) adc (3) amplifier (1) analog (9) android (11) attiny (1) attiny2313 (16) blog (1) bluetooth (1) cmos (1) dasar (31) display (2) gcc (1) infrared (2) Input Output (3) jam (6) jualan (10) kereta api (1) keyboard (1) keypad (3) kios pulsa (2) kit (6) komponen (9) komputer (3) komunikasi (1) kontrol (2) lain-lain (8) lcd (2) led (9) led matrix (6) line tracer (1) lm35 (1) memory (1) metal detector (4) microcontroller (48) mikrokontroller (1) mikrotik (4) paket belajar (19) palang pintu otomatis (1) pcb (2) project (33) proyek (1) radio (3) remote (1) revisi (1) rfid (1) robot (1) rpm (2) rs232 (1) script break down (3) sdcard (3) sensor (1) sharing (2) sms (5) software (16) tachometer (2) telepon (7) televisi (16) transistor (1) troubleshoot (3) tulisan (34) tutorial (67) vu meter (1) vumeter (1) wav player (3) wayang (1) wifi (1)

Diskusi


kaskus
Forum Hobby Elektronika