Untitled

mail@pastecode.io avatar
unknown
c_cpp
11 days ago
3.9 kB
3
Indexable
Never
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>

// Definicje z pierwszego programu
#define MIC_OFF_AXIS _BV(PD1)
#define MIC_CENTER _BV(PD0) | _BV(PD1)
#define MIC_CLASSIC _BV(PD0)
#define MODE_HOT_WIRED _BV(PD3)
#define MODE_HIGH_GAIN _BV(PD2) | _BV(PD3)
#define MODE_CLEAN _BV(PD2)
#define AMP_HAMERICAN _BV(PD5)
#define AMP_BRITISH _BV(PD4) | _BV(PD5)
#define AMP_TWEED _BV(PD4)
#define INFREQ_L _BV(PD7)
#define INFREQ_M _BV(PD6) | _BV(PD7)
#define INFREQ_H _BV(PD6)

int main(void) {
    // Konfiguracja pinów
    DDRB = 0b00111111;    // PB0 - PB5 jako wyjścia (z pierwszego programu)
    DDRC = 0b00111111;    // PC0 - PC5 jako wyjścia (z pierwszego programu)
    DDRD = 0b00000000;    // PD0 - PD7 jako wejścia (z pierwszego programu)

    DDRB |= (1 << PB1) | (1 << PB2); // Ustaw PB1, PB2 jako wyjścia
    DDRB &= ~((1 << PB6) | (1 << PB7)); // Ustaw PB6, PB7 jako wejścia

    uint8_t previous_state_PB6 = 0;
    uint8_t previous_state_PB7 = 0;
    uint8_t toggle_PB1 = 0;
    uint8_t toggle_PB2 = 0;

    // Główna pętla programu
    while (1) {
        PORTB &= ~(0b00111111);   // Resetujemy tylko piny PB0-PB5 bez naruszania PB1 i PB2
        PORTC &= ~(0b00111111);   // Resetujemy tylko piny PC0-PC5

        // SWITCH1 - MIC: PD0, PD1 => PC5, PC4, PC3
        switch (PIND & (_BV(PD1) | _BV(PD0))) {
            case MIC_OFF_AXIS:
                PORTC |= _BV(PC5);
                break;
            case MIC_CENTER:
                PORTC |= _BV(PC4);
                break;
            case MIC_CLASSIC:
                PORTC |= _BV(PC3);
                break;
        }

        // SWITCH2 - MODE: PD2, PD3 => PC2, PC1, PC0
        switch (PIND & (_BV(PD3) | _BV(PD2))) {
            case MODE_HOT_WIRED:
                PORTC |= _BV(PC2);
                break;
            case MODE_HIGH_GAIN:
                PORTC |= _BV(PC1);
                break;
            case MODE_CLEAN:
                PORTC |= _BV(PC0);
                break;
        }

        // SWITCH3 - AMP: PD4, PD5 => PB5, PB4, PB3
        switch (PIND & (_BV(PD5) | _BV(PD4))) {
            case AMP_HAMERICAN:
                PORTB |= _BV(PB5);
                break;
            case AMP_BRITISH:
                PORTB |= _BV(PB4);
                break;
            case AMP_TWEED:
                PORTB |= _BV(PB3);
                break;
        }

        // SWITCH4 - INPUT FREQUENCY: PD6, PD7 => PB0
        switch (PIND & (_BV(PD7) | _BV(PD6))) {
            case INFREQ_L:
                PORTB |= _BV(PB0);
                break;
            case INFREQ_M:
                PORTB |= _BV(PB0);
                break;
            case INFREQ_H:
            default:
                break;
        }

        // Obsługuje stan PB6 i PB7 w pętli głównej
        uint8_t current_state_PB6 = (PINB & (1 << PB6));
        uint8_t current_state_PB7 = (PINB & (1 << PB7));

        // Obsługuje PB6
        if (current_state_PB6 != previous_state_PB6) {
            if (current_state_PB6 == 0) { // lub 1 - zalezy w ktorym stanie jest wcisniety, wnioskuje, ze zwarty do masy
                PORTB ^= (1 << PB2);  // Ustaw PB2 na wysoki
            }
            previous_state_PB6 = current_state_pb6;
        }

        // Obsługuje PB7
        if (!current_state_PB7 && previous_state_PB7) {
            toggle_PB1 = !toggle_PB1; // Toggle stan PB1
            if (toggle_PB1) {
                PORTB |= (1 << PB1);  // Ustaw PB1 na wysoki
            } else {
                PORTB &= ~(1 << PB1); // Ustaw PB1 na niski
            }
            previous_state_PB7 = 0;
        } else if (current_state_PB7) {
            previous_state_PB7 = 1;
        }

        _delay_ms(50); // Opóźnienie anty-drebounce
    }

    return 0;
}
Leave a Comment