#include <stdint.h> // Untuk definisi uint32_t

#define RCC_APB2ENR (*(volatile uint32_t*)0x40021018) // Alamat register RCC_APB2ENR
#define GPIOA_CRL   (*(volatile uint32_t*)0x40010800) // Alamat register GPIOA_CRL
#define GPIOA_ODR   (*(volatile uint32_t*)0x4001080C) // Alamat register GPIOA_ODR
#define GPIOA_IDR   (*(volatile uint32_t*)0x40010808) // Alamat register GPIOA_IDR

int main(void) {
    // Mengaktifkan clock untuk GPIOA
    RCC_APB2ENR |= (1 << 2); // Bit ke-2 untuk GPIOA

    // Konfigurasi PA0 sebagai output (Push-Pull, Low-Speed)
    GPIOA_CRL &= ~(0xF << (0 * 4)); // Clear konfigurasi PA0
    GPIOA_CRL |= (0x2 << (0 * 4)); // Set PA0 sebagai output push-pull

    // Konfigurasi PA1 sebagai input (Pull-Down)
    GPIOA_CRL &= ~(0xF << (1 * 4)); // Clear konfigurasi PA1
    GPIOA_CRL |= (0x8 << (1 * 4)); // Set PA1 sebagai input dengan pull-down

    while (1) {
        // Membaca status tombol di PA1
        if (GPIOA_IDR & (1 << 1)) { // Jika PA1 HIGH
            GPIOA_ODR |= (1 << 0);  // Menyalakan LED di PA0
        } else {
            GPIOA_ODR &= ~(1 << 0); // Mematikan LED di PA0
        }
    }
}