Capaian Pembelajaran

  • Memahami konsep input dengan push button
  • Mengimplementasikan teknik debouncing
  • Mengontrol seven segment display
  • Membuat program counter dengan input button
  • Memahami konsep scanning display multiplexing

1. Input dengan Push Button

Push button adalah komponen input paling dasar dalam sistem embedded. Button menghasilkan sinyal LOW (0) ketika ditekan dan HIGH (1) ketika tidak ditekan, dengan menggunakan konfigurasi pull-up resistor.

Konfigurasi Push Button

  • Pull-up Configuration - Button connected to GND, internal pull-up enabled
  • Normal State - INPUT pin reads HIGH (1) karena pull-up
  • Pressed State - INPUT pin reads LOW (0) ketika button ditekan
  • Debouncing - Diperlukan untuk menghilangkan noise mekanis

Simulator Push Button

Simulator Push Button dengan Pull-up

Klik tombol untuk mensimulasikan input button dan lihat perubahan status pin

Status Input Pin

PIN STATE: HIGH (1)
BUTTON: RELEASED

Penjelasan: Button dalam keadaan released, pin membaca HIGH karena pull-up resistor internal

Kontrol Simulasi

Kode Dasar Pembacaan Button

button_read.c - Pembacaan Push Button
// Output simulasi pembacaan button Klik "Run Code" untuk melihat simulasi

2. Teknik Debouncing

Debouncing adalah teknik untuk menghilangkan noise mekanis yang terjadi ketika button ditekan atau dilepas. Noise ini dapat menyebabkan multiple trigger yang tidak diinginkan.

Simulator Efek Debouncing

50 ms
30%

Keterangan: Garis merah = Sinyal raw, Garis hijau = Sinyal setelah debouncing

Implementasi Debouncing dalam Code

Metode Debouncing

  • Software Delay - Delay sederhana setelah deteksi perubahan
  • State Machine - FSM untuk tracking state button
  • Timer-based - Menggunakan hardware timer untuk sampling
  • Counter-based - Menghitung consecutive readings
debounce_fsm.c - Debouncing dengan State Machine
#include 
#include 

#define BUTTON_PIN PB0

typedef enum {
    BTN_IDLE,
    BTN_PRESSED,
    BTN_RELEASED
} button_state_t;

// Finite State Machine untuk debouncing
button_state_t button_fsm(uint8_t current_state) {
    static button_state_t state = BTN_IDLE;
    static uint16_t debounce_counter = 0;
    
    switch(state) {
        case BTN_IDLE:
            if (current_state == 0) {  // Button pressed
                debounce_counter++;
                if (debounce_counter > 100) {  // 10ms debounce
                    state = BTN_PRESSED;
                    debounce_counter = 0;
                }
            } else {
                debounce_counter = 0;
            }
            break;
            
        case BTN_PRESSED:
            if (current_state == 1) {  // Button released
                debounce_counter++;
                if (debounce_counter > 100) {
                    state = BTN_RELEASED;
                    debounce_counter = 0;
                }
            } else {
                debounce_counter = 0;
            }
            break;
            
        case BTN_RELEASED:
            state = BTN_IDLE;
            break;
    }
    
    return state;
}

int main(void) {
    DDRB &= ~(1 << BUTTON_PIN);  // Input
    PORTB |= (1 << BUTTON_PIN);  // Pull-up
    
    while(1) {
        uint8_t button_raw = (PINB & (1 << BUTTON_PIN)) == 0;
        button_state_t state = button_fsm(button_raw);
        
        if (state == BTN_PRESSED) {
            // Button pressed action
            // ...
        } else if (state == BTN_RELEASED) {
            // Button released action
            // ...
        }
        
        _delay_ms(1);  // 1ms sampling rate
    }
}

3. Seven Segment Display

Seven Segment Display adalah komponen output yang terdiri dari 7 LED segment (a-g) dan sering ditambah 1 dot point. Digunakan untuk menampilkan angka 0-9 dan beberapa huruf.

Jenis Seven Segment

  • Common Anode - Anode terhubung bersama, katoda individual
  • Common Cathode - Katoda terhubung bersama, anode individual
  • Single Digit - Satu digit display
  • Multi Digit - Beberapa digit dengan multiplexing

Simulator Seven Segment Display

Simulator Seven Segment Display

Kontrol segment individual atau gunakan preset untuk angka

Nilai PORT: 0x00 | Binary: 00000000

Lookup Table untuk Seven Segment

Angka Segment (gfedcba) Hex Value Binary
001111110x3F00111111
100001100x0600000110
210110110x5B01011011
310011110x4F01001111
411001100x6601100110
511011010x6D01101101
611111010x7D01111101
700001110x0700000111
811111110x7F01111111
911011110x6F01101111

4. Project: Digital Counter

Mari buat project sederhana menggunakan button sebagai input dan seven segment sebagai output - sebuah digital counter yang dapat di-increment dan decrement.

Digital Counter dengan Button Control

0

Kode Implementasi Counter

counter_project.c - Digital Counter
// Output simulasi digital counter Klik tombol + dan - untuk mengubah nilai counter

5. Multiplexing Multi-Digit Display

Multiplexing adalah teknik untuk mengontrol multiple seven segment display dengan pin yang minimal. Setiap digit diaktifkan secara bergantian dengan kecepatan tinggi sehingga mata manusia melihatnya sebagai display yang kontinu.

Keuntungan Multiplexing

  • Menghemat Pin - n digit hanya butuh 8+n pin (bukan 8×n)
  • Power Efficient - Hanya satu digit yang aktif pada satu waktu
  • Simple Wiring - Koneksi yang lebih sederhana
  • Cost Effective - Mengurangi kebutuhan komponen

Implementasi Multiplexing

multiplex_display.c - Kontrol 4 Digit Display
#include 
#include 
#include 

#define DIGIT_COUNT 4

// Segment pins (Common for all digits)
#define SEG_PORT PORTD
#define SEG_DDR  DDRD

// Digit select pins (Common Cathode)
#define DIG_PORT PORTB
#define DIG_DDR  DDRB

uint8_t digits[DIGIT_COUNT] = {0, 0, 0, 0};
uint8_t current_digit = 0;

const uint8_t seg_table[] = {
    0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F
};

// Timer interrupt for multiplexing
ISR(TIMER0_COMPA_vect) {
    // Turn off all digits
    DIG_PORT |= 0x0F;
    
    // Set segments for current digit
    SEG_PORT = seg_table[digits[current_digit]];
    
    // Enable current digit
    DIG_PORT &= ~(1 << current_digit);
    
    // Move to next digit
    current_digit = (current_digit + 1) % DIGIT_COUNT;
}

void display_init() {
    // Set segment pins as output
    SEG_DDR = 0xFF;
    
    // Set digit select pins as output
    DIG_DDR |= 0x0F;
    
    // Timer0 setup for 1kHz interrupt (1ms per digit)
    TCCR0A = (1 << WGM01);  // CTC mode
    TCCR0B = (1 << CS01) | (1 << CS00);  // Prescaler 64
    OCR0A = 249;  // 1kHz
    TIMSK0 = (1 << OCIE0A);
    
    sei();  // Enable global interrupts
}

void display_number(uint16_t number) {
    digits[0] = number % 10;
    digits[1] = (number / 10) % 10;
    digits[2] = (number / 100) % 10;
    digits[3] = (number / 1000) % 10;
}

int main(void) {
    display_init();
    uint16_t counter = 0;
    
    while(1) {
        display_number(counter);
        counter++;
        _delay_ms(100);
    }
}

Latihan Praktikum

Tugas untuk menguasai input button dan output seven segment

Tugas 1: Button Control System

Buat sistem kontrol dengan multiple buttons:

  • 4 buttons untuk kontrol arah (atas, bawah, kiri, kanan)
  • Implementasikan debouncing untuk semua buttons
  • LED indicator untuk setiap arah
  • Mode toggle dan mode hold

Tugas 2: Smart Counter

Buat counter cerdas dengan fitur:

  • Increment/decrement dengan button
  • Reset counter dengan long press
  • Set limit atas dan bawah
  • Display nilai pada seven segment
  • Mode auto-count dengan adjustable speed

Tugas 3: Multi-digit Timer

Buat timer dengan 4-digit seven segment:

  • Implementasikan multiplexing untuk 4 digit
  • Timer count up dan count down
  • Start/stop/reset dengan buttons
  • Preset waktu dengan button combination
  • Alarm indicator ketika waktu habis