#include <avr/io.h>
#include <stdlib.h>
#include <string.h>
#include <util/delay.h>
#ifndef _BV
#define _BV(bit) (1<<(bit))
#endif
#ifndef sbi
#define sbi(reg,bit) reg |= (_BV(bit))
#endif
#define cbi(reg,bit) reg &= ~(_BV(bit))
char reverseBits( char num)
{
char reverse_num = 0x00;
int i;
for (i = 0; i < 8; i++) {
if ((num & (1 << i)))
reverse_num |= 1 << ((8 - 1) - i);
}
return reverse_num;
}
int main()
{
DDRD = 0xFF;
DDRB = 0x00;
PORTD = 0x00;
PORTB = 0xFF;
//historie przycisków
char h_sw2 = 0xFF; //jedynki na start bo to jest domyślny stan pinb
char h_sw3 = 0xFF;
char h_sw4= 0xFF;
//czas co ile sprawdzamy stan diód
double t_ms = 10;
//rzeczy do pktu3
bool czyAktywnaAnimacja =0;
int nrDiody=0;
int diody[10] = {2,3,4,5,6,7,6,5,4,3};
int i;
double iloscPetliDlaDiody = 500/t_ms;
while(1)
{
char pom1 = PINB;
//pkt1
if(bit_is_clear(PINB,PB0))
{
sbi(PORTD,0);
}
else
{
cbi(PORTD,0);
}
//pkt2
//wzór: xx00nn11
h_sw2 = (h_sw2<<1)+ (pom1&0x02)/2;
//PORTD = reverseBits(h_sw2);
if(((h_sw2&0x03) == 0x03) && ((h_sw2&0x30) == 0x00)) //sprawdzam czy jest zbocze narastające
{
if(bit_is_clear(PORTD,PD1))
{
sbi(PORTD,PD1);
}
else
{
cbi(PORTD,PD1);
}
}
//pkt3
h_sw3 = (h_sw3<<1) + (pom1&0x04)/4;
if((h_sw3&0x30) == 0x00 && !czyAktywnaAnimacja) //sprawdzam jest wcisnięty wcisk nr czy
{
czyAktywnaAnimacja = 1;
i=0;
nrDiody = 0;
sbi(PORTD,diody[0]);
}
if(czyAktywnaAnimacja)
{
i++;
if(i>= iloscPetliDlaDiody ) //500ms/50ms
{
i=0;
cbi(PORTD,diody[nrDiody%10]);
nrDiody++;
sbi(PORTD,diody[nrDiody%10]);
}
}
//pkt4
h_sw4 = (h_sw4<<1) + (pom1&0x08)/8;
if((h_sw4&0x30) == 0x00) //sprawdzam jest wcisnięty wcisk nr ctery
{
czyAktywnaAnimacja = 0;
cbi(PORTD,diody[(nrDiody)%10]);
}
_delay_ms(t_ms);
}
}