Untitled
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