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.
Simulator Push Button
Kode Dasar Pembacaan Button
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
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
#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 |
|---|---|---|---|
| 0 | 0111111 | 0x3F | 00111111 |
| 1 | 0000110 | 0x06 | 00000110 |
| 2 | 1011011 | 0x5B | 01011011 |
| 3 | 1001111 | 0x4F | 01001111 |
| 4 | 1100110 | 0x66 | 01100110 |
| 5 | 1101101 | 0x6D | 01101101 |
| 6 | 1111101 | 0x7D | 01111101 |
| 7 | 0000111 | 0x07 | 00000111 |
| 8 | 1111111 | 0x7F | 01111111 |
| 9 | 1101111 | 0x6F | 01101111 |
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
Kode Implementasi 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
#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