Vous êtes sur la page 1sur 13

#include

#include
#include
#include

<mega16.h>
<delay.h>
<stdlib.h>
<stdio.h>

#define DDR_key
DDRC
#define PORT_key PORTC
#define PIN_key
PINC
unsigned int nilai,i=0;
int array[8];
unsigned char buffer[16];
#asm
.equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd.h>
void simpan_dlm_1variabel()
{
if (i==1){nilai=array[i];}
if (i>=2 && i<=4)
{
nilai=(nilai*10)+array[i];
}
}
void scanning_keypad()//scanning pendeteksian penekanan keypad
{
PORT_key = 0b11111110;
delay_ms(30);
if (PIN_key.4 == 0) {i++; array[i]=7; simpan_dlm_1variabel(); delay_ms(100);}
if (PIN_key.5 == 0) {i++; array[i]=8; simpan_dlm_1variabel(); delay_ms(100);}
if (PIN_key.6 == 0) {i++; array[i]=9; simpan_dlm_1variabel(); delay_ms(100);}
if (PIN_key.7 == 0) {lcd_clear();i=0;nilai=0;delay_ms(300);}

PORT_key= 0b11111101;
delay_ms(30);
if (PIN_key.4 == 0) {i++; array[i]=4; simpan_dlm_1variabel(); delay_ms(100);}
if (PIN_key.5 == 0) {i++; array[i]=5; simpan_dlm_1variabel(); delay_ms(100);}
if (PIN_key.6 == 0) {i++; array[i]=6; simpan_dlm_1variabel(); delay_ms(100);}
if (PIN_key.7 == 0) {delay_ms(300);}
PORT_key = 0b11111011;
delay_ms(30);
if (PIN_key.4 == 0) {i++; array[i]=1; simpan_dlm_1variabel(); delay_ms(100);}
if (PIN_key.5 == 0) {i++; array[i]=2; simpan_dlm_1variabel(); delay_ms(100);}
if (PIN_key.6 == 0) {i++; array[i]=3; simpan_dlm_1variabel(); delay_ms(100);}
if (PIN_key.7 == 0) {delay_ms(300);}
PORT_key= 0b11110111;
delay_ms(30);
if (PIN_key.4 == 0) {delay_ms(300);}
if (PIN_key.5 == 0) {i++; array[i]=0; simpan_dlm_1variabel(); delay_ms(100);}
if (PIN_key.6 == 0) {delay_ms(300);}
if (PIN_key.7 == 0) {delay_ms(300);}
}
void tampil_lcd()
{
lcd_gotoxy(0,0);
sprintf(buffer,"%d ",nilai);
lcd_puts(buffer);
}
void main(void)
{
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORT_key=0xFF;

DDR_key=0x0F;
lcd_init(16);
#asm("sei")
while (1)
{
scanning_keypad();
tampil_lcd();
};
}
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

//http://sheemeeyu.blogspot.co.id/2013/03/review-mengaktifkan-motor-dengan-keypad.html

#include <mega8535.h>
#include <delay.h>
unsigned char dt,array[];
int i=0,nilai=0,password=2313;
void detek_key(void);
void simpan_pass(void);
void main (void)
{
PORTA=0x00;
DDRA=0xff;
PORTB=0xff;
DDRB=0xff;
PORTC=0x00;
DDRC=0xff;
PORTD=0xff;
DDRD=0xf0;
while(1)
{
detek_key();
delay_ms(50);
};
}
void simpan_pass(void){
if (i==1){nilai=array[i];}
if (i>=2 && i<=8)
{
nilai=(nilai*10)+array[i];
}}
void detek_key(void){
PORTD.4=0;
delay_ms(50);
dt=(~PIND & 0x0f);
switch (dt){
case 1 : i++;array[i]=1;simpan_pass();PORTA=0xff;delay_ms(100);PORTA=0x00;delay_ms(50);break;

case 2 : i++;array[i]=0;simpan_pass();PORTA=0xff;delay_ms(100);PORTA=0x00;delay_ms(50);break;
case 4 : i++;array[i]=0;simpan_pass();PORTA=0xff;delay_ms(100);PORTA=0x00;delay_ms(50);break;
case 8 : if (nilai==password){PORTB=0xfe;PORTC=0xfe;delay_ms(200);PORTC=0x00;}else
{PORTC=0xfd;}delay_ms(100);PORTA=0x00;delay_ms(50);break;
};
PORTD.4=1;PORTD.5=0;
delay_ms(50);
dt=(~PIND & 0x0f);
switch (dt){
case 1 : i++;array[i]=2;simpan_pass();PORTA=0xff;delay_ms(100);PORTA=0x00;delay_ms(50);break;
case 2 : i++;array[i]=0;simpan_pass();PORTA=0xff;delay_ms(100);PORTA=0x00;delay_ms(50);break;
case 4 : i++;array[i]=0;simpan_pass();PORTA=0xff;delay_ms(100);PORTA=0x00;delay_ms(50);break;
case 8 : i++;array[i]=0;simpan_pass();PORTA=0xff;delay_ms(100);PORTA=0x00;delay_ms(50);break;
};
PORTD.5=1;PORTD.6=0;
delay_ms(50);
dt=(~PIND & 0x0f);
switch (dt){
case 1 : i++;array[i]=3;simpan_pass();PORTA=0xff;delay_ms(100);PORTA=0x00;delay_ms(50);break;
case 2 : i++;array[i]=0;simpan_pass();PORTA=0xff;delay_ms(100);PORTA=0x00;delay_ms(50);break;
case 4 : i++;array[i]=0;simpan_pass();PORTA=0xff;delay_ms(100);PORTA=0x00;delay_ms(50);break;
case 8 : i++;array[i]=0;simpan_pass();PORTA=0xff;delay_ms(100);PORTA=0x00;delay_ms(50);break;
};
PORTD.6=1;PORTD.7=0;
delay_ms(50);
dt=(~PIND & 0x0f);
switch (dt){
case 1 : i++;array[i]=0;simpan_pass();PORTA=0xff;delay_ms(100);PORTA=0x00;delay_ms(50);break;
case 2 : i++;array[i]=0;simpan_pass();PORTA=0xff;delay_ms(100);PORTA=0x00;delay_ms(50);break;
case 4 : i++;array[i]=0;simpan_pass();PORTA=0xff;delay_ms(100);PORTA=0x00;delay_ms(50);break;
case 8 : i++;array[i]=0;simpan_pass();PORTA=0xff;delay_ms(100);PORTA=0x00;delay_ms(50);break;
};
PORTD.7=1;
delay_ms(50);
}

PENGUNCI PINTU (DOOR LOCK) BERPASSWORD MENGGUNAKAN KEYPAD DAN LCD DENGAN CODEVISION AVR
http://elektro-kontrol.blogspot.co.id/2011/06/pengunci-pintu-door-lock-berpassword.html

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;
saat terjadi penekanan angka 6 maka;
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:
saat i bernilai 1, i=1 kita hitung dengan rumus:
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]
jika i bernilai (i>=2 dan i<=8)
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
#include
#include
#include

<mega16.h>
<delay.h>
<stdlib.h>
<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=015 ;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 ur 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();


PORTB = 0b11111011;
delay_ms(30);
if (PINB.4 == 0) {i++; array[i]=3; simpan_dlm_1variabel();
if (PINB.5 == 0) {i++; array[i]=6; simpan_dlm_1variabel();
if (PINB.6 == 0) {i++; array[i]=9; simpan_dlm_1variabel();
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);}
}

delay_ms(300);}
delay_ms(300);}
delay_ms(300);}
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=000;//PD0 belogika low atau dlm keadaan unlock awalnya
DDRD=001;//PD0 sebagai output
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=080;
SFIOR=000;

// LCD module initialization


lcd_init(16);
lcd_putsf(ElectrO-cOntrOl);
delay_ms(1500);
lcd_clear();
while (1)
{
lock();
scanning_keypad();
tampil_lcd();
};
}
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

Vous aimerez peut-être aussi