Co do drgania styków, moim zdaniem nie ma się czym przejmować, bo one same z siebie nie drgają, tylko przy wciśnięciu następuje kilkakrotne złączenie i rozłączenie i właśnie po to jest to 200 ms, żeby styki się uspokoiły. Oczywiście ten czas może być krótszy, jednak 200ms to wystarczająco dużo by wcisnąć i puścić. Można by na końcu whila dać jeszcze jakieś opóźnienie, żeby nie było tak, że user trzyma przycisk przez jakiś czas pętla wykonuje iterację, zmienia się liczba, program znowu sprawdza warunek już dodaje, leci te 200msm użytkownik puszcza przycisk, a liczba "sama" zwiększa się.
Co do podłączenia, musimy wiedzieć jaki masz wyświetlacz czy jest to wspólna anoda czy katoda. Wtedy musisz sobie dopasować to co masz pod DDRD i chyba zanegować te define co zrobiłem, ale palca sobie za to uciąć nie dam. Przyciski łączysz z ziemią do C0 i C1. A wyświetlacz tak jak na "obrazku" w kodzie, sugerowałbym jakieś rezystory, lecz atmega raczej Ci go nie zniszczy, gdyż ma niską wydajność prądową.
Więc po tym wszystkim co opisałem kod wygląda w następujący sposób:
/*
0
=
1| |5
=----- 6
2| |4
= .-----7
3
*/
#define DIS0 0x3F // bo binarnie 0011 1111
#define DIS1 0x30 // bo binarnie 0011 0000
#define DIS2 0x6D // bo binarnie 0110 1101
#define DIS3 0x79 // bo binarnie 0111 1001
#define DIS4 0x72 // bo binarnie 0111 0010
#define DIS5 0x5D // bo binarnie 0101 1101
#define DIS6 0x5F // bo binarnie 0101 1111
#define DIS7 0x71 // bo binarnie 0111 0001
#define DIS8 0x7F // bo binarnie 0111 1111
#define DIS9 0x7B // bo binarnie 0111 1011
//pewnie tu coś skopałem ale to sobie poprawisz :D
int main()
{
int n=0;
DDRD = 0xFF; //Zależnie od tego jakim wyświetlaczem dysponujesz
PORTD = 0x00;
//do c podłaczysz przyciski, które podciągniesz progamowo do ziemi
DDRC = 0x00;
PORTC = 0x03;
while(1)
{
if(PINC & 0x01) //tutaj sprawdzamy pierwszy bit z portu C
{
_delay_ms(200); //czekamy, aż drgania styków ustaną, zobacz co będzie jak to zakomentujesz
n++;
}
if(PINC & 0x02)
{
_delay_ms(200); //czekamy, aż drgania styków ustaną, zobacz co będzie jak to zakomentujesz
n--;
}
switch(n&10) //bo liczby większej od 10 i tak nie wyświetlimy
{
case 0:
PORTD = DIS0;
break;
case 1:
PORTD = DIS1;
break;
case 2:
PORTD = DIS2;
break;
case 3:
PORTD = DIS3;
break;
case 4:
PORTD = DIS4;
break;
case 5:
PORTD = DIS5;
break;
case 6:
PORTD = DIS6;
break;
case 7:
PORTD = DIS7;
break;
case 8:
PORTD = DIS8;
break;
case 9:
PORTD = DIS9;
break;
default:
PORTD = 0x00;
break;
}
_delay_ms(200);
}
return 0;
}