Witam!
Podłączyłem 16 guzików pod ATmege16 i chciałem zrobić identyfikację klikniętego. Podzieliłem je na rzędy(4) i kolumny(4) i podpiąłem pod portd(PD0-PD6) i portb(PB3).
Następnie ustawiam na kolumnach(PD0-PD3 i PB3) stan wysoki i puszczam pętle w programie główny która oczekuje na wciśnięcie przycisku. Jednak polecenie PIND błędnie odczytuje stan portu (przy ustawnieniu PORTD=0x07 i DDRD=0x07 pokazuje 0xBF)
Może ktoś pomóc?
Podłączyłem 16 guzików pod ATmege16 i chciałem zrobić identyfikację klikniętego. Podzieliłem je na rzędy(4) i kolumny(4) i podpiąłem pod portd(PD0-PD6) i portb(PB3).
Następnie ustawiam na kolumnach(PD0-PD3 i PB3) stan wysoki i puszczam pętle w programie główny która oczekuje na wciśnięcie przycisku. Jednak polecenie PIND błędnie odczytuje stan portu (przy ustawnieniu PORTD=0x07 i DDRD=0x07 pokazuje 0xBF)
Może ktoś pomóc?
Cytat:
#define Kolumna_1 PD2
#define Kolumna_2 PD1
#define Kolumna_3 PD0
#define Kolumna_4 PB3
#define Wiersz_1 PD6
#define Wiersz_2 PD5
#define Wiersz_3 PD4
#define Wiersz_4 PD3
volatile unsigned char stan;
int przycisk()
{
int wiersz, kolumna, wynik;
wiersz = kolumna = 0;
DDRB |= (1<<Kolumna_4);
DDRD = 0x00;
PORTD = 0X00;
DDRD = (1<<Kolumna_1)+(1<<Kolumna_2)+(1<<Kolumna_3);
PORTB |= (1<<Kolumna_4);
PORTD |= (1<<Kolumna_1)+(1<<Kolumna_2)+(1<<Kolumna_3);
_delay_us(20);
if(PIND & (1<<Wiersz_1))
{
wiersz = 0x01;
}
else if(PIND & (1<<Wiersz_2))
{
wiersz = 0x02;
}
else if(PIND & (1<<Wiersz_3))
{
wiersz = 0x03;
}
else if(PIND & (1<<Wiersz_4))
{
wiersz = 0x04;
}
else
return 0;