PENGUNCI PINTU (DOOR LOCK) BERPASSWORD MENGGUNAKAN KEYPAD DAN LCD DENGAN CODEVISION AVR
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.
Berikut adalah listing program lengkapnya:
#include <mega16.h>
#include <delay.h>
#include <stdlib.h>
#include <stdio.h>
float nilai=0, password=12345678;
char temp[12], array[10], i=0, indeks=0;
//variabel indeks digunakan untuk mendeteksi jika indeks=0 unlock, indeks=1 lock
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0×15 ;PORTC
#endasm
#include <lcd.h>
void lock()
{
while (indeks==0)
{
lcd_gotoxy(0,0);
lcd_putsf(“Please press =”);
lcd_gotoxy(0,1);
lcd_putsf(“to lock”);
PORTB = 0b11111011;
delay_ms(30);
if (PINB.7 == 0)
{
indeks=1;
PORTD.0=1;//terkunci
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf(“locked”);
delay_ms(1000);
lcd_clear();
}
}
}
void enter()
{
if (nilai==password)
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf(“unlocked”);
delay_ms(1000);
i=0; nilai=0;
PORTD.0=0;//kunci terbuka
indeks=0;
}
else
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf(“wrong password”);
delay_ms(2500);
i=0; nilai=0;
indeks=1;//karena password salah jadi masih terkunci
}
}
void simpan_dlm_1variabel()
{
if (i==1){nilai=array[i];}
if (i>=2 && i<=8)
{
nilai=(nilai*10)+array[i];
}
}
void scanning_keypad()//scanning pendeteksian penekanan keypad
{
lcd_gotoxy(0,0);
lcd_putsf(“enter u’r pass”);
PORTB = 0b11111110;
delay_ms(30);
if (PINB.4 == 0) {i++; array[i]=1; simpan_dlm_1variabel(); delay_ms(300);}
if (PINB.5 == 0) {i++; array[i]=4; simpan_dlm_1variabel(); delay_ms(300);}
if (PINB.6 == 0) {i++; array[i]=7; simpan_dlm_1variabel(); delay_ms(300);}
if (PINB.7 == 0) {lcd_clear();i=0;nilai=0;delay_ms(300);}
PORTB = 0b11111101;
delay_ms(30);
if (PINB.4 == 0) {i++; array[i]=2; simpan_dlm_1variabel(); delay_ms(300);}
if (PINB.5 == 0) {i++; array[i]=5; simpan_dlm_1variabel(); delay_ms(300);}
if (PINB.6 == 0) {i++; array[i]=8; simpan_dlm_1variabel(); delay_ms(300);}
if (PINB.7 == 0) {i++; array[i]=0; simpan_dlm_1variabel(); delay_ms(300);}
PORTB = 0b11111011;
delay_ms(30);
if (PINB.4 == 0) {i++; array[i]=3; simpan_dlm_1variabel(); delay_ms(300);}
if (PINB.5 == 0) {i++; array[i]=6; simpan_dlm_1variabel(); delay_ms(300);}
if (PINB.6 == 0) {i++; array[i]=9; simpan_dlm_1variabel(); delay_ms(300);}
if (PINB.7 == 0) {delay_ms(300);}
PORTB = 0b11110111;
delay_ms(30);
if (PINB.4 == 0) {delay_ms(300);}
if (PINB.5 == 0) {delay_ms(300);}
if (PINB.6 == 0) {delay_ms(300);}
if (PINB.7 == 0) {enter();delay_ms(300);}
}
void tampil_lcd()
{
if (nilai>0)
{
ftoa(nilai,0,temp);
lcd_gotoxy(0,1);
lcd_puts(temp);
}
}
void main(void)
{
PORTB=0xff;
DDRB=0x0f;
PORTD=0×00;//PD0 belogika low atau dlm keadaan unlock awalnya
DDRD=0×01;//PD0 sebagai output
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0×80;
SFIOR=0×00;
// LCD module initialization
lcd_init(16);
lcd_putsf(“ElectrO-cOntrOl”);
delay_ms(1500);
lcd_clear();
while (1)
{
lock();
scanning_keypad();
tampil_lcd();
};
}
Jika ingin mendapatkan program dalam  
bentuk file CodeVision AVR dan file simulasi menggunakan proteus untuk  
aplikasi ini, silakan download pada link dibawah ini.
CATATAN: saat  memasukkan 
password disarankan tidak diawali dengan angka 0, untuk lebih  jelasnya 
lihat perhitungan untuk menjadikannya dalam satu variabel.
Semoga bermanfaat...
Sumber dari : http://elektro-kontrol.blogspot.com
Sumber dari : http://elektro-kontrol.blogspot.com


 

