/*saray camila caicedo cruel
* Control de display 7 segmentos con 74HC595
* Microcontrolador: ATmega328P (Arduino Uno a 16 MHz)
* Visualización de dígitos del 0 al 9 en un display de ánodo común
*/
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <stdint.h>
// Estructura para definir un pin de salida
typedef struct {
volatile uint8_t *puerto;
volatile uint8_t *direccion;
uint8_t numero_bit;
} pin_avr_t;
// Asignación de pines
pin_avr_t pin_datos = { &PORTD, &DDRD, PD6 }; // SER
pin_avr_t pin_latch = { &PORTD, &DDRD, PD5 }; // RCLK
pin_avr_t pin_reloj = { &PORTD, &DDRD, PD7 }; // SRCLK
#define RETARDO_US 1 // Microsegundos entre señales
// Mapeo de los dígitos para ánodo común
const uint8_t mapa_segmentos[10] = {
0b11000000, // 0
0b11111001, // 1
0b10100100, // 2
0b10110000, // 3
0b10011001, // 4
0b10010010, // 5
0b10000010, // 6
0b11111000, // 7
0b10000000, // 8
0b10010000 // 9
};
// Función para enviar un byte al 74HC595
void enviar_byte(uint8_t valor) {
for (uint8_t bit = 0; bit < 8; bit++) {
if (valor & 0x80)
*(pin_datos.puerto) |= (1 << pin_datos.numero_bit);
else
*(pin_datos.puerto) &= ~(1 << pin_datos.numero_bit);
*(pin_reloj.puerto) |= (1 << pin_reloj.numero_bit);
_delay_us(RETARDO_US);
*(pin_reloj.puerto) &= ~(1 << pin_reloj.numero_bit);
_delay_us(RETARDO_US);
valor <<= 1;
}
}
// Inicializa los pines
void inicializar(void) {
*(pin_datos.direccion) |= (1 << pin_datos.numero_bit);
*(pin_latch.direccion) |= (1 << pin_latch.numero_bit);
*(pin_reloj.direccion) |= (1 << pin_reloj.numero_bit);
*(pin_latch.puerto) &= ~(1 << pin_latch.numero_bit);
*(pin_reloj.puerto) &= ~(1 << pin_reloj.numero_bit);
}
// Función principal
int main(void) {
inicializar();
uint8_t digito_actual = 0;
while (1) {
*(pin_latch.puerto) &= ~(1 << pin_latch.numero_bit); // Desactivar latch
enviar_byte(mapa_segmentos[digito_actual]); // Enviar datos
*(pin_latch.puerto) |= (1 << pin_latch.numero_bit); // Activar latch
digito_actual = (digito_actual + 1) % 10; // Siguiente dígito
_delay_ms(500); // Retardo de medio segundo
}
return 0;
}