Untitled
unknown
c_cpp
a year ago
3.9 kB
9
Indexable
#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;
}
Editor is loading...
Leave a Comment