#include <avr/io.h>
#include <util/delay.h>
#define TRAFFIC_LIGHT_CAR_RED PORTA0
#define TRAFFIC_LIGHT_CAR_YELLOW PORTA1
#define TRAFFIC_LIGHT_CAR_GREEN PORTA2
#define TRAFFIC_LIGHT_PED_RED PORTA3
#define TRAFFIC_LIGHT_PED_GREEN PORTA4
#define PEDESTRIAN_BUTTON PINB4
void initPorts() {
// Konfigurasi port untuk Traffic Light Kendaraan
DDRA |= (1 << TRAFFIC_LIGHT_CAR_RED) | (1 << TRAFFIC_LIGHT_CAR_YELLOW) | (1 << TRAFFIC_LIGHT_CAR_GREEN);
// Konfigurasi port untuk Traffic Light Pejalan Kaki
DDRA |= (1 << TRAFFIC_LIGHT_PED_RED) | (1 << TRAFFIC_LIGHT_PED_GREEN);
// Konfigurasi port untuk Tombol Pejalan Kaki (input dengan pull-up internal)
DDRB &= ~(1 << PEDESTRIAN_BUTTON);
PORTB |= (1 << PEDESTRIAN_BUTTON);
}
void setTrafficLightCar(uint8_t red, uint8_t yellow, uint8_t green) {
// matikan semua lampu lalu kemudian atur sesuai parameter
PORTA |= (1 << PA0) | (1 << PA1) | (1 << PA2);
PORTA &= ~((red << PA0) | (yellow << PA1) | (green << PA2));
}
void setTrafficLightPedestrian(uint8_t red, uint8_t green) {
// Matikan semua lampu lalu kemudian atur sesuai parameter
PORTA |= (1 << TRAFFIC_LIGHT_PED_RED) | (1 << TRAFFIC_LIGHT_PED_GREEN);
PORTA &= ~((red << TRAFFIC_LIGHT_PED_RED) | (green << TRAFFIC_LIGHT_PED_GREEN));
}
void trafficLightCar() {
// Kuning
setTrafficLightCar(0,1,0);
_delay_ms(1000); // Tunggu 1 detik
// Merah
setTrafficLightCar(1,0,0);
_delay_ms(3000); // Tunggu 3 detik
}
void trafficLightPedestrian() {
// P.Hijau
setTrafficLightPedestrian(0,1);
_delay_ms(3000); // Tunggu 3 detik
// P.Merah
setTrafficLightPedestrian(1,0);
_delay_ms(3000); // Tunggu 3 detik
// C.Kuning
setTrafficLightCar(0,1,0);
_delay_ms(3000); // Tunggu 3 detik
}
int main() {
initPorts();
while (1) {
setTrafficLightCar(0, 0, 1);
setTrafficLightPedestrian(1, 0);
// Cek apakah tombol ditekan (logika LOW)
if (!(PINB & (1 << PEDESTRIAN_BUTTON))) {
trafficLightCar();
trafficLightPedestrian();
}
}
return 0;
}
PA0
PA1
PA2
PA3
PB7
PB6
PA4
Kendaraan
Pejalan Kaki
PB4