Ini postingan pertama saya dalam hal mikrokontroller seri ATMEGA16. Saya
anggap yang sedang membaca artikel saya ini telah mengerti tentang
mikrokontroler khususnya ATMEGA. Disini saya menggunakan compiler CVAVR
Codevison dengan simulasi proteus. Program ini saya ambil dari
elektro-kontrol.blogspot.com tapi dengan menggunakan keypad 3x4...(kalo
di web aslinya pakai keypad 4x4). Jadi saya cuma modif sedikit saja.
berikut penjelasan dari elektro-kontrol.blogspot.com
Mungkin teman-teman semua sudah tahu tentang aplikasi yang bernama pengunci pintu (door lock) berpassword, pada aplikasi ini sudah saya realisasikan pada hardware yang sesungguhnya dan berhasil.
Kesulitan
utama dari aplikasi ini adalah ketika seorang user memasukkan password
dengan menggunakan keypad, kita harus dapat menyimpan input yang berasal
dari keypad kedalam satu variabel. Misalnya user menekan 6, lalu 2,
lalu 0 dan 4 berarti passwornya adalah 6204 (misalkan). Nilai tersebut
harus dijadikan dalam 1 variabel yang kemudian akan dibandingkan dengan
password yang sebenarnya. Jika user memasukkan password dengan benar
maka akan membuka kunci, jika salah maka kunci tidak akan terbuka.
Untuk
mengatasi masalah tersebut saya menggunakan array untuk mendeteksi
berapa kali penekanan keypad dan angka berapa yang akan ditekan. Baiklah
disini saya akan menjelaskan algoritma yang saya buat. Jika user
menekan 6, lalu 2 lalu 0 dan 4 maka seperti ini logikanya:
Awalnya saya deklarasikan array sebagai berikut:
array[10], i=0;
i++ (saya increamentkan) jadi i=1
kemudian angka 6 saya simpan pada variabel array[i] jadi array[1]=6
kemudian saat terjadi penekanan angka 2, maka:
i++ (saya increamentkan lagi) jadi i=2
kemudian angka 2 saya simpan pada variabel array[i] jadi array[2]=2
kemudian saat terjadi penekanan angka 0, maka:
i++ (saya increamentkan lagi) jadi i=3
kemudian angka 0 saya simpan pada variabel array[i] jadi array[3]=0
kemudian saat terjadi penekanan angka 4, maka:
i++ (saya increamentkan lagi) jadi i=4
kemudian angka 4 saya simpan pada variabel array[i] jadi array[4]=4
maka didapat array[1]=6, array[2]=2, array[3]=0, array[4]=4
kalo sudah didapat seperti diatas maka kita tinggal kumpulkan dalam satu variabel (nama variabelnya misalkan nilai) caranya:
nilai=array[1] //jadi nilai=6
saat i bernilai 2, i=2 kita hitung dengan rumus:
nilai=(array[1]*10)+array[2] //jadi nilai=62
saat i bernilai 3, i=3 kita hitung dengan rumus:
nilai=(array[1]*100)+(array[2]*10)+array[3] //jadi nilai=620
saat i bernilai 4, i=4 kita hitung dengan rumus:
nilai=(array[1]*1000)+(array[2]*100)+(array[3]*10)+array[4] //jadi nilai=6204
Sudah mengerti bukan, dari rumus-rumus diatas masih dapat disederhanakan, menjadi:
jika i=1
nilai=array[i]
nilai=(nilai*10)+array[i]
Banyaknya
penekanan tombol saya batasi sampai 8 kali. Sebenarnya saya ingin
membuatnya sampai 10 kali tetapi saat saya coba tidak berjalan dengan
lancar saat penekanan ke 9 kali. Saya tidak tahu kenapa? Jika
teman-teman bisa memecahkannya tolong beri tahu saya!
Baiklah
kembali lagi ke aplikasi yang akan kita buat. Langsung saja ke cara
kerjanya, gambar rangkaiannya bisa anda lihat dibawah ini. Saat pertama
kali alat ini saya nyalakan maka dalam keadaan tidak terkunci (unlock),
untuk menguncinya (lock) anda harus menekan tombol = (lihat gambar
keypad dibawah). Setelah terkunci, jika anda ingin membukanya kembali
anda harus memasukkan passwordnya (jika sudah mengetikan password tekan
tombol + untuk memasukkannya). Jika benar maka akan membuka kunci,
tetapi jika salah kunci tidak akan terbuka. Ketika sudah terbuka maka
cara kerjanya kembali lagi ke awal. Sedangkan tombol ON/C saya gunakan
untuk menghapus password jika salah dalam pengetikannya. Untuk indikator
kuncinya saya menggunakan sebuah LED, jika LED menyala maka dalam
keadaan tidak terkunci dan jika mati dalam keadaan terkunci.
/*****************************************************
This program was produced by the
CodeWizardAVR V1.24.6 Professional
Automatic Program Generator
© Copyright 1998-2005 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
e-mail:office@hpinfotech.com
Project :
Version :
Date : 9/20/2011
Author : F4CG
Company : F4CG
Comments:
Chip type : ATmega16
Program type : Application
Clock frequency : 12.000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega16.h>
#include <delay.h>
#include <stdlib.h>
#include <stdio.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>
// Declare your global variables here
float nilai=0,password=321;
char temp[12],array[10],i=0,index=0;
void lock()
{
while(index==0)
{
lcd_gotoxy(0,0);
lcd_putsf("please press #");
lcd_gotoxy(0,1);
lcd_putsf("to lock");
PORTB=0b10111111;
delay_ms(10);
if(PINB.3==0)
{
index=1;
PORTD.1=1;//terkunci
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("LOCKED");
delay_ms(100);
lcd_clear();
}
}
}
void enter()
{
if(nilai==password)
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Unlock");
delay_ms(100);
i=0; nilai=0;
PORTD.1=0;//kunci terbuka
index=0;
}
else
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Wrong Password");
i=0; nilai=0;
index=1;//masih terkunci
}
}
void simpan_dalam1variabel()
{
if(i==1)
{nilai=array[i];}
if(i>=2 && i<=11)
{nilai=(nilai*10)+array[i];}
}
void scanning_keypad()
{
lcd_gotoxy(0,0);
lcd_putsf("enter u'r pass:");
PORTB=0b11101111;
delay_ms(3);
if(PINB.0==0)
{i++;array[i]=1;simpan_dalam1variabel();delay_ms(30);}
if(PINB.1==0)
{i++;array[i]=4;simpan_dalam1variabel();delay_ms(30);}
if(PINB.2==0)
{i++;array[i]=7;simpan_dalam1variabel();delay_ms(30);}
if(PINB.3==0)
{enter();delay_ms(30);}
PORTB=0b11011111;
delay_ms(3);
if(PINB.0==0)
{i++;array[i]=2;simpan_dalam1variabel();delay_ms(30);}
if(PINB.1==0)
{i++;array[i]=5;simpan_dalam1variabel();delay_ms(30);}
if(PINB.2==0)
{i++;array[i]=8;simpan_dalam1variabel();delay_ms(30);}
if(PINB.3==0)
{i++;array[i]=0;simpan_dalam1variabel();delay_ms(30);}
PORTB=0b10111111;
delay_ms(3);
if(PINB.0==0)
{i++;array[i]=3;simpan_dalam1variabel();delay_ms(30);}
if(PINB.1==0)
{i++;array[i]=6;simpan_dalam1variabel();delay_ms(30);}
if(PINB.2==0)
{i++;array[i]=9;simpan_dalam1variabel();delay_ms(30);}
if(PINB.3==0)
{delay_ms(30);}
}
void tampil_lcd()
{
if(nilai>0)
{
ftoa(nilai,0,temp);
lcd_gotoxy(0,1);
lcd_puts(temp);
}
}
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In