Witaj.
Przeanalizuj mój fragment kodu, jest to kod pochodzący z mojego
programu "Atmega8 i TWI na przykładzie zegara LED".
Co prawda pisałem ten kod na Atmege, ale po zamianie bitów portów powinno pasować do Attiny. Najważniejszy jest bit "portu C" -> pełni rolę szybkiego przełącznika
W tym kodzie ignorowana jest długość naciśnięcia klawisza, a również ignorowane jest naciśnięcie kilku klawiszy na raz.
Czyli obojętnie jak długo jest naciśnięty klawisz zadanie wykona się tylko raz. Aby powtórnie wykonać zadanie trzeba zwolnić klawisz i na nowo nacisnąć.
Zmienna "unsigned char klawiatura;" ma dowolną wartość np.0b00011111 , ale trzeba pamiętać o powiązaniu z "_delay_ms(30)" i "switch (klawiatura)"
Funkcja "_delay_ms(30)" jest po to aby zniwelować drgania styków i tu też można sobie opóźnienia dobierać.
Powodzenia
Piotr
unsigned char klawiatura;
int main(void)
{ /* Instrukcje jednokrotnego wykonania */
// Porty: PD0 PD1 PD2 PD3 PD4 -> wejścia klawiatury z pull-up'em
// Port: PC0 -> znacznik jednokrotnego wykonania
// 1 -> wyjście
// 0 -> wejście
DDRC =0b00000001;
DDRD =0b00000000;
// 1 -> z podciągnięciem do VCC (pull-up)
// 0 -> bez podciągniecia do VCC
PORTC =0b00000000;
PORTD =0b00011111;
while(1) /* Instrukcje wielokrotnego wykonania */
{
//---------------------------
// początek
// test klawisza
//---------------------------
klawiatura =0b00011111;
if(bit_is_clear(PIND,PIND0)) { _delay_ms(30); klawiatura =klawiatura & 0b00011110; }
if(bit_is_clear(PIND,PIND1)) { _delay_ms(30); klawiatura =klawiatura & 0b00011101; }
if(bit_is_clear(PIND,PIND2)) { _delay_ms(30); klawiatura =klawiatura & 0b00011011; }
if(bit_is_clear(PIND,PIND3)) { _delay_ms(30); klawiatura =klawiatura & 0b00010111; }
if(bit_is_clear(PIND,PIND4)) { _delay_ms(30); klawiatura =klawiatura & 0b00001111; }
if(klawiatura ==0b00111111) PORTC &=~(1<<1); // znacznik -> znacznik zwolnienia klawisza
//---------------------------
// początek
// wybór klawisza
//---------------------------
if(bit_is_clear(PINC,PINC1)) // start klawiatury
{
switch (klawiatura)
{
// -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
case 0b00011110:
// tu wpisz co ma być jednokrotnie wykonane, gdy wciśniesz ten klawisz
PORTC |=(1<<1); // znacznik -> wciśniętego klawisza
break;
// -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
case 0b00011101:
// tu wpisz co ma być jednokrotnie wykonane, gdy wciśniesz ten klawisz
PORTC |=(1<<1); // znacznik -> wciśniętego klawisza
break;
// -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
case 0b0b00011011:
// tu wpisz co ma być jednokrotnie wykonane, gdy wciśniesz ten klawisz
PORTC |=(1<<1); // znacznik -> wciśniętego klawisza
break;
// -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
case 0b00010111:
// tu wpisz co ma być jednokrotnie wykonane, gdy wciśniesz ten klawisz
PORTC |=(1<<1); // znacznik -> wciśniętego klawisza
break;
// -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
case 0b00001111:
// tu wpisz co ma być jednokrotnie wykonane, gdy wciśniesz ten klawisz
PORTC |=(1<<1); // znacznik -> wciśniętego klawisza
break;
// -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
default: /* klawisze poza wyborem */
break;
} // END switch (klawiatura)
//---------------------------
// koniec
// test klawisza
// wybór klawisza
//---------------------------
}// stop klawiatury
// tu wpisz dalsze instrukcje programu wykonywane wielokrotnie
} // end while()
} // end main()