#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
// Pin definitions
#define BUTTON_PIN 4 // Button connected to GPIO 4
uint8_t led_pins[] = {38, 37, 36, 35, 0, 45, 48, 47};
// Function declarations
int readPinStateWithDebounce(int pin);
void writeToPins(uint8_t pins[], uint8_t val);
void printbin8(uint8_t val);
void app_main() {
uint8_t counter = 0; // 8-bit counter variable
int lastButtonState = 1; // Tracks the last button state
// Configure GPIO pins
gpio_set_direction(BUTTON_PIN, GPIO_MODE_INPUT);
gpio_set_pull_mode(BUTTON_PIN, GPIO_PULLUP_ONLY); // pull-up resistor
for (int i = 0; i < 8; i++) {
gpio_set_direction(led_pins[i], GPIO_MODE_OUTPUT);
}
// Main loop
while (1) {
int buttonState = readPinStateWithDebounce(BUTTON_PIN);
// Check for button press
if (buttonState == 0 && lastButtonState == 1) {
counter++; // increase counter
printf("Button pressed! Counter = %d\n", counter);
printbin8(counter);
writeToPins(led_pins, counter);
}
lastButtonState = buttonState;
vTaskDelay(pdMS_TO_TICKS(10)); // delay
}
}
/**
* Function Name - readPinStateWithDebounce
* Description - Reads a GPIO pin with debounce logic
* Return type - int
* Parameters - GPIO pin number to read
*/
int readPinStateWithDebounce(int pin) {
int istate = gpio_get_level(pin);
if (istate == 0) {
vTaskDelay(pdMS_TO_TICKS(50)); // Debounce delay
int cstate = gpio_get_level(pin);
if (cstate == 0) {
return 0; // Button is pressed
}
else {
return 1; // something there
}
}
else {
return 1; // Button not pressed
}
}
/**
* Function Name - writeToPins
* Description - Writes a byte value to an array of GPIO pins
* Return type - void
* Parameters - array of GPIO pin numbers 8-bit value to write
*/
void writeToPins(uint8_t pins[], uint8_t val) {
for (int i = 0; i < 8; i++) {
// Write each bit to an LED
gpio_set_level(pins[i], (val >> i) & 1);
}
}
/**
* Function Name - printbin8
* Description - Prints an 8bit value in binary
* Return type - void
* Parameters - 8-bit value to print
*/
void printbin8(uint8_t val) {
printf("The value of %u in binary is: 0b", val);
for (int i = 7; i >= 0; i--) {
printf("%d", (val >> i) & 1);
}
printf("\n");
}