PROGRAM MENAMPILKAN KARAKTER KEYPAD PADA LCD DENGAN AVR DAN ARDUINO

Mengakses Keypad dan Menampilkan Karakter pada LCD dengan AVR maupun ARDUINO

Oke gees yang sedang belajar mikrokontroller baik yang sedang belajar AVR maupun Arduino. Kali ini saya akan bahas cara memprogram atau mengakses keypad pada kedua basis kontrol tersebut sekaligus. Tapi sebelum kita masuk ke program saya akan bagikan sedikit penjelasan tentang keypad dulu agar kalian lebih mudah memahami.

Ok langsung saja gaes dari pembahasan pertama kita tentang keypad.

Keypad merupakan konfigurasi dari beberapa buah tombol yang tersusun pada sebuah papan yang akan diberikan suatu karakter pada setiap tombolnya. Maka dari itu keypad disebut juga sebuah papan tombol. dalam kata lain apabila kita memencet suatu karakter pada keypad sebenarnya kita menekan sebuat tombol. Jadi keypad adalah kumpulan tombol push button, tapi dengan konfigurasi kolom dan baris, kumpulan tombol tersebut diefektifkan dengan menggunakan konfigurasi matrik.


Dengan konfigurasi tersebut sebenarnya kita dapat membuat sendiri sebuah keypad dengan menggunakan tombol-tombol push button pada sebuah papan circuit. Untuk mengakses keypad kita perlu memahami sistem scaning keypad. Dengan sistem scaning inilah kita bisa menghasilkan karakter-karakter yang telah kita tentukan pada setiap tombol pada keypad. untuk lebih mudah sistem scaning keypad dibuat dalam bentuk diagram alir seperti berikut :



Bagan scaning keypad diatas merupakan bagan scaning keypad 4x4 dengan B1,B2,B3,B4 dan K1,K2,K3,K4 merupakan Input dan Output dari mikrokontroller. B1,B2,B3,B4 merupakan output dari mikrokontroler yang memberikan sinyal masuk ke keypad 1 (HIGH) atau 0 (LOW) sedangkan K1,K2,K3,K4 merupakan masukan ke mikro kontroler yang membaca sinyal yang diteruskan dari status A,B,C,D jika ada tombol yang ditekan. jadi kondisi B1,B2,B3,B4 akan berubah dari 1 (HIGH) ke kondisi 0 (LOW) secara bergantian terus menerus dengan cepat. ketika ada tombol yang ditekan maka sinyal 0 (LOW) akan diteruskan ke K1 atau K2 atau K3 atau K4 tergantung tombol mana yang ditekan. Ketika itu terjadi maka bisa diketahui tombol mana yang sedang atau telah ditekan.




Ada satu hal lagi yang harus diperhatikan ketika akan membuat program keypad yaitu adanya efek bouncing. Efek bouncing adalah adanya efek pantulan atau perubahan sinyal yang terjadi berkali kali pada saat tombol keypad ditekan yang menyebabkan seolah-olah tombol keypad ditekan berkali kali. ini menyebabkan kerugian sehingga nilai atau karakter yang kita masukan jadi tidak valid. 

Bagaimana mengatasi efek bouncing?

Kita dapat menggunakan IC 555 untuk menambah lebar pulsa atau kita juga dapat memberikan delay pada saat tombol keypad ditekan.

OK langsung saja kita buat program.....

Kita akan membuat program akses keypad dengan tampilan LCD dengan simulasi pada software ISIS proteus.

Buat rangkaian skematik pada ISIS Proteus seperti berikut :


Mikrokontroler yang kita gunakan adalah ATMega8535 dan Arduino yang kita gunakan adalah Arduino UNO R3. Konfigurasikan koneksi pin seperti gambar skematik diatas. Setelah itu buat program untuk mengakses keypad pada software CodeVisionAVR maupun Arduino IDE. Program yang dibuat berdasarkan algoritma flow chart scaning keypad yang telah dibuat diatas.


PROGRAM LENGKAP:


Program AVR :

/*******************************************************
This program was created by the
CodeWizardAVR V3.12 Advanced
Automatic Program Generator
© Copyright 1998-2014 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date    : 31/07/2019
Author  :
Company :
Comments:

Chip type               : ATmega8535
Program type            : Application
AVR Core Clock frequency: 11,059200 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 128
*******************************************************/

#include <mega8535.h>

// Alphanumeric LCD functions
#include <alcd.h>

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRA=(0<<DDA7) | (0<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0);

// Port B initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);

// Port C initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRC=(0<<DDC7) | (0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTC=(0<<PORTC7) | (0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);

// Port D initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=Out Bit2=Out Bit1=Out Bit0=Out
DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (1<<DDD3) | (1<<DDD2) | (1<<DDD1) | (1<<DDD0);
// State: Bit7=P Bit6=P Bit5=P Bit4=P Bit3=1 Bit2=1 Bit1=1 Bit0=1
PORTD=(1<<PORTD7) | (1<<PORTD6) | (1<<PORTD5) | (1<<PORTD4) | (1<<PORTD3) | (1<<PORTD2) | (1<<PORTD1) | (1<<PORTD0);

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=(0<<WGM00) | (0<<COM01) | (0<<COM00) | (0<<WGM01) | (0<<CS02) | (0<<CS01) | (0<<CS00);
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Disconnected
// OC1B output: Disconnected
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (0<<CS10);
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0<<AS2;
TCCR2=(0<<WGM20) | (0<<COM21) | (0<<COM20) | (0<<WGM21) | (0<<CS22) | (0<<CS21) | (0<<CS20);
TCNT2=0x00;
OCR2=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<OCIE0) | (0<<TOIE0);

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
MCUCSR=(0<<ISC2);

// USART initialization
// USART disabled
UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (0<<RXEN) | (0<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);

// Analog Comparator initialization
// Analog Comparator: Off
// The Analog Comparator's positive input is
// connected to the AIN0 pin
// The Analog Comparator's negative input is
// connected to the AIN1 pin
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
SFIOR=(0<<ACME);

// ADC initialization
// ADC disabled
ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);

// SPI initialization
// SPI disabled
SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);

// TWI initialization
// TWI disabled
TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE);

// Alphanumeric LCD initialization
// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTB Bit 0
// RD - PORTB Bit 1
// EN - PORTB Bit 2
// D4 - PORTB Bit 4
// D5 - PORTB Bit 5
// D6 - PORTB Bit 6
// D7 - PORTB Bit 7
// Characters/line: 16
lcd_init(16);
lcd_gotoxy(0,0);
lcd_putsf("ANGKA KEYPAD:");
lcd_gotoxy(0,1);
lcd_putsf("?");

while (1){
      // Place your code here
      PORTD.0=0;
      if (PIND.4==0) {
        lcd_gotoxy(0,1); lcd_putsf("1");}
      if (PIND.5==0) {
        lcd_gotoxy(0,1); lcd_putsf("2");}
      if (PIND.6==0) {
        lcd_gotoxy(0,1); lcd_putsf("3");}
     
      PORTD.0=1;
      PORTD.1=0;
      if (PIND.4==0) {
        lcd_gotoxy(0,1); lcd_putsf("4");}
      if (PIND.5==0) {
        lcd_gotoxy(0,1); lcd_putsf("5");}
      if (PIND.6==0) {
        lcd_gotoxy(0,1); lcd_putsf("6");}
     
      PORTD.1=1;
      PORTD.2=0;
      if (PIND.4==0) {
        lcd_gotoxy(0,1); lcd_putsf("7");}
      if (PIND.5==0) {
        lcd_gotoxy(0,1); lcd_putsf("8");}
      if (PIND.6==0) {
        lcd_gotoxy(0,1); lcd_putsf("9");}
     
      PORTD.2=1;
      PORTD.3=0;
      if (PIND.4==0) {
        lcd_gotoxy(0,1); lcd_putsf("*");}
      if (PIND.5==0) {
        lcd_gotoxy(0,1); lcd_putsf("0");}
      if (PIND.6==0) {
        lcd_gotoxy(0,1); lcd_putsf("#");}
     
      PORTD.3=1;
    }
}

Program Arduino :

#include <LiquidCrystal.h>

// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
const int rs = 5, en = 4, d4 = 3, d5 = 2, d6 = 1, d7 = 0;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);
  digitalWrite(6,HIGH);
  digitalWrite(7,HIGH);
  digitalWrite(8,HIGH);
  digitalWrite(9,HIGH);
  pinMode(10,INPUT_PULLUP);
  pinMode(11,INPUT_PULLUP);
  pinMode(12,INPUT_PULLUP);
  lcd.setCursor(0, 0);
  lcd.print("KARAKTER KEYPAD ");
  lcd.setCursor(0, 1);
  lcd.print("        ?       ");
}

void loop() {
      // Print a message to the LCD.
      digitalWrite(6,LOW);
      if (digitalRead(10)==LOW){
        lcd.setCursor(0, 1); lcd.print("        1       "); }
      if (digitalRead(11)==LOW){
        lcd.setCursor(0, 1); lcd.print("        2       "); }
      if (digitalRead(12)==LOW){
        lcd.setCursor(0, 1); lcd.print("        3       "); }
   
      digitalWrite(6,HIGH);
      digitalWrite(7,LOW);
      if (digitalRead(10)==LOW){
        lcd.setCursor(0, 1); lcd.print("        4       "); }
      if (digitalRead(11)==LOW){
        lcd.setCursor(0, 1); lcd.print("        5       "); }
      if (digitalRead(12)==LOW){
        lcd.setCursor(0, 1); lcd.print("        6       "); }

      digitalWrite(7,HIGH);
      digitalWrite(8,LOW);
      if (digitalRead(10)==LOW){
        lcd.setCursor(0, 1); lcd.print("        7       "); }
      if (digitalRead(11)==LOW){
        lcd.setCursor(0, 1); lcd.print("        8       "); }
      if (digitalRead(12)==LOW){
        lcd.setCursor(0, 1); lcd.print("        9       "); }

      digitalWrite(8,HIGH);
      digitalWrite(9,LOW);
      if (digitalRead(10)==LOW){
        lcd.setCursor(0, 1); lcd.print("        *       "); }
      if (digitalRead(11)==LOW){
        lcd.setCursor(0, 1); lcd.print("        0       "); }
      if (digitalRead(12)==LOW){
        lcd.setCursor(0, 1); lcd.print("        #       "); }

      digitalWrite(9,HIGH);
}











Berlangganan update artikel terbaru via email:

0 Response to "PROGRAM MENAMPILKAN KARAKTER KEYPAD PADA LCD DENGAN AVR DAN ARDUINO"

Post a Comment

Iklan Atas Artikel

Iklan Tengah Artikel 1

Iklan Tengah Artikel 2

Iklan Bawah Artikel