Laman

Jumat, 17 Januari 2014

Interfacing keypad 3X4 dengan ATmega16


Rangkaian simulasi proteus


Kode programnya
#include "mega16.h"
#include "stdio.h"
#include "delay.h"
#include "lcd.h"

#asm
   .equ __lcd_port=0x15 ;PORTC
#endasm
#include "lcd.h"

int n=-1;
char string[16];
char angka;

void scanning(char a, char b, char c, char d){                  
PORTD=a;
delay_us(100);
if(PIND.2==0)
{angka=b;n++;delay_ms(111);}
else if(PIND.1==0)
{angka=c;n++;delay_ms(111);}
else if(PIND.0==0)              
{angka=d;n++;delay_ms(111);}
if(n>16){n=0;
lcd_clear();}
}

void main(void)
{
DDRD=0b01111000;
ACSR=0x80;
SFIOR=0x00;
lcd_init(16);
while (1)
      {
        scanning(191,1,2,3);
        scanning(223,4,5,6);
        scanning(239,7,8,9);
        scanning(247,'*',0,'#'); 
        
        lcd_gotoxy(0,0);
        lcd_putsf("  LCD KARAKTER ");
        
        if(angka >= 0 && angka <= 9){
        lcd_gotoxy(n,1);
        sprintf(string, "%i", angka);
        lcd_puts(string);
        } else {
        lcd_gotoxy(n,1);
        sprintf(string, "%c", angka);
        lcd_puts(string);}
      }
}

Di program ada kode.
        scanning(191,1,2,3);
        scanning(223,4,5,6);
        scanning(239,7,8,9);
        scanning(247,'*',0,'#');

Disini aku membuat fungsi sendiri untuk scanning tiap baris agar kodenya sedikit. Aku menggunakan PORTD untuk keypadnya. PIND.0-2 aku gunakan sebagai kolom, sedangkan PORTD.3-6 aku gunakan sebagai baris. Maksud dari 191 adalah decimal dari bilangan biner 10111111 yang berturut-turut adalah nilai port nomor 7 sampai 0. Maksudnya kita men-scan baris pertama (PORTD.6=0). Nah saat PORTD.6 nol, kita gunakan berbagai kondisi untuk mencocokkan tombol mana yang ditekan yang bergantung pada kolom mana yang bernilai 0.  Nah tiga angka setelah angka '191' merupakan akibat bila salah satu kolom terpenuhi kondisinya. Jika tidak ada penekanan tombol maka dia akan berlanjut ke scanning baris kedua, yaitu 223 (PORTD.5=0). Begitu seterusnya scanning berlangsung dengan sangat cepat.
        if(angka >= 0 && angka <= 9){
        lcd_gotoxy(n,1);
        sprintf(string, "%i", angka);
        lcd_puts(string);
        } else {
        lcd_gotoxy(n,1);
        sprintf(string, "%c", angka);
        lcd_puts(string);}

Ini merupakan sintaks untuk menampilkan karakter ke LCD. Ada dua macam sintaks yaitu untuk karakter angka dan karakter bebas. Untuk angka (berjenis integer) maka kita memanggilnya dengan '%i' dan untuk karakter bebas (berjenis character) kita gunakan '%c'. Koordinat 'n' hanya untuk menggeser posisi karakter selanjutnya yang mana setiap karakter yang muncul akan menyebabkan n bertambah satu. Sehingga karakter yang baru, akan muncul disebelahnya.


Untuk simulasi di proteus dan kode program di CVAVR bisa di ambil disini

Password: abcde