#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "driver/gpio.h"
#include "esp_log.h"
#define OE_pin GPIO_NUM_6 // Enable
#define STCP_pin GPIO_NUM_5 // Latch
#define SHCP_pin GPIO_NUM_4 // Clock
#define DS_pin GPIO_NUM_3 // Data
#define delay(value) vTaskDelay( value/portTICK_PERIOD_MS )
// Manter o botão pressionado ativa o Enable (OE) e os leds irão acender para ilustrar a contagem.
// A contagem vai de 0 a 15.
#define pin_button GPIO_NUM_19
void clock(void);
void configure_ci_setup(void);
void configure_button(void);
void write_output(int8_t);
/*
*/
void app_main(void) {
configure_ci_setup();
configure_button();
for (;;) {
for (int8_t i = 0 ; i <= 15 ; i++) {
if (gpio_get_level(pin_button) == 1) {
gpio_set_level(OE_pin, GPIO_NUM_1);
} else {
gpio_set_level(OE_pin, GPIO_NUM_0);
}
write_output(i);
delay(500);
}
}
}
/*
*/
void write_output(int8_t num) {
gpio_set_level(STCP_pin, GPIO_NUM_0);
for (int8_t i = 7 ; i >= 0 ; i--) {
int8_t bit_set = num >> i;
if (bit_set & 1) {
gpio_set_level(DS_pin, GPIO_NUM_1);
clock();
} else {
gpio_set_level(DS_pin, GPIO_NUM_0);
clock();
}
}
gpio_set_level(STCP_pin, GPIO_NUM_1);
}
void configure_button(void) {
gpio_config_t io_conf = {};
io_conf.intr_type = GPIO_INTR_POSEDGE;
io_conf.pin_bit_mask = (1 << pin_button);
io_conf.mode = GPIO_MODE_INPUT;
io_conf.pull_up_en = 1;
gpio_config(&io_conf);
}
void configure_ci_setup(void) {
gpio_pad_select_gpio(OE_pin);
gpio_pad_select_gpio(STCP_pin);
gpio_pad_select_gpio(SHCP_pin);
gpio_pad_select_gpio(DS_pin);
gpio_set_direction(OE_pin, GPIO_MODE_OUTPUT);
gpio_set_direction(STCP_pin, GPIO_MODE_OUTPUT);
gpio_set_direction(SHCP_pin, GPIO_MODE_OUTPUT);
gpio_set_direction(DS_pin, GPIO_MODE_OUTPUT);
gpio_set_level(OE_pin, GPIO_NUM_0);
}
void clock(void) {
gpio_set_level(SHCP_pin, GPIO_NUM_1);
gpio_set_level(SHCP_pin, GPIO_NUM_0);
}