#include <stdbool.h>
#include <avr/io.h>
namespace Bitwise {
inline int8_t read(const volatile uint8_t* destiny, const uint8_t bit) {
if (bit > 7 || destiny == nullptr) {
return -1;
}
return (*destiny >> bit) & 1;
}
inline int8_t set(volatile uint8_t* const destiny, const uint8_t bit) {
if (bit > 7 || destiny == nullptr) {
return -1;
}
*destiny |= (1 << bit);
return 0; // Retornar 0 para indicar sucesso
}
inline int8_t clear(volatile uint8_t* const destiny, const uint8_t bit) {
if (bit > 7 || destiny == nullptr) {
return -1;
}
*destiny &= ~(1 << bit);
return 0; // Retornar 0 para indicar sucesso
}
inline int8_t write(volatile uint8_t* const destiny, const uint8_t bit, const bool value) {
if (bit > 7 || destiny == nullptr) {
return -1;
}
if (value) {
*destiny |= (1 << bit);
} else {
*destiny &= ~(1 << bit);
}
return 0; // Retornar 0 para indicar sucesso
}
inline int8_t toggle(volatile uint8_t* const destiny, const uint8_t bit) {
if (bit > 7 || destiny == nullptr) {
return -1;
}
return write(destiny, bit, !read(destiny, bit));
}
}
int main(void) {
Bitwise::set(DDRB, DDB5); // Configurando o pino 13 como saída
Bitwise::clear(DDRD, DDC3); // Configurando o pino 3 como entrada
Bitwise::set(PORTD, PORTD3); // Habilitando o resistor de pull-up no pino 3
for (;;) {
Bitwise::write(PORTC, PORTC5, Bitwise::read(PIND, PIND3)); // Escrevendo o estado do pino 3 no pino A5
Bitwise::write(PORTB, PORTB5, !Bitwise::read(PORTC, PORTC5)); // Escrevendo o estado negado do pino A5 no pino 13
}
}