Witam!
Staram się napisać na razie dość prosty program, który ma wyświetlić cyfrę, która została wciśnięta na klawiaturze matrycowej 3x4.
Program działa prawie poprawnie, jedynie jedną kolumnę dziwnie odczytuje, mianowicie "podnosi ją do góry".
Tzn tam gdzie powinno być 1 jest 4, tam gdzie 4 jest 7 itd.
Reszta klawiatury działa tak jak trzeba, nie mogę tylko rozwiązać problemu z tą jedną kolumną.
Skanowanie odbywa się bez przerwań, ponieważ wykorzystuje ATTiny2313 który ma ich nie za wiele i chce je wykorzystać do czegoś innego.
Program:
Chciałem jeszcze algorytm do skanowania klawiatury inaczej napisać, wykorzystując przesunięcia bitowe, ale ginę w tym... kompletnie to mi nie wychodzi, jeszcze do końca tego nie pojmuję.
Układ jest zmontowany następująco:
Pod port B podpięty jest wyświetlacz 8 segmentowy (8. - ósemka z kropką).
Portu A jeszcze nie wykorzystuję.
Do portu D podpiąłem klawiaturę. Bity PD0/1/2 to kolumny, zaś PD3/4/5/6 to wiersze.
Na początku program ma za zadanie ustawić 0 na jednym z wierszy a następnie sprawdzić kolumny czy nie nastąpiło zwarcie. Jeśli tak to wpisuje numer do zmiennej cyfra która jest zwracana z funkcji. Jeśli nie nastąpiło skanuje następny wiersz i następny...
-------------------------------------
Trochę pogrzebałem i stwierdziłem że dziwacznie program się wykonuje.
tak jak by zamiast linijki:
Kompilował coś takiego:
I głowie się dlaczego, bo poniższe linijki są identyczne niemal że, a działają prawidłowo, tylko tutaj coś głupieje.
Staram się napisać na razie dość prosty program, który ma wyświetlić cyfrę, która została wciśnięta na klawiaturze matrycowej 3x4.
Program działa prawie poprawnie, jedynie jedną kolumnę dziwnie odczytuje, mianowicie "podnosi ją do góry".
1 2 3
4 5 6
7 8 9
A 0 B
Tzn tam gdzie powinno być 1 jest 4, tam gdzie 4 jest 7 itd.
Reszta klawiatury działa tak jak trzeba, nie mogę tylko rozwiązać problemu z tą jedną kolumną.
Skanowanie odbywa się bez przerwań, ponieważ wykorzystuje ATTiny2313 który ma ich nie za wiele i chce je wykorzystać do czegoś innego.
Program:
#include <avr/io.h>
#define F_CPU 4000000
#include <util/delay.h>
unsigned int i=0, j, cyfra=0;
unsigned char znaki[17] = {192,249,164,176,153,146,130,248,128,144,136,131,198,161,134,142,0}; //pokolei 0, 1, 2,...
int skan_klaw(void){
for(i=0;i<4;++i){
PORTD = ~_BV(i+3); //funkcja wpisująca 0 do pojedyńczego bitu
if(bit_is_clear(PIND, PD0)){ //sprawdzanie stanu kolumny 1
cyfra = (i*3)+1;
return cyfra;}
if(bit_is_clear(PIND, PD1)){ //sprawdzanie stanu kolumny 2
cyfra = (i*3)+2;
return cyfra;}
if(bit_is_clear(PIND, PD2)){ //sprawdzanie stanu kolumny 3
cyfra = (i*3)+3;
return cyfra;}
}
return 0;
}
int main(void)
{
DDRA = 0x00;
PORTA = 0xFF;
DDRB = 0xFF; //Port B jako wyjścia
PORTB = 0xFF;//Podciągnij
DDRD = 0xF8; // Piny 0, 1 i 2 jako wejścia, reszta wyjście
PORTD = 0xFF; //podciagnij
while(1){
j = skan_klaw();
if(j!=0){
PORTB = znaki[j];
}}
return 0;
}
Chciałem jeszcze algorytm do skanowania klawiatury inaczej napisać, wykorzystując przesunięcia bitowe, ale ginę w tym... kompletnie to mi nie wychodzi, jeszcze do końca tego nie pojmuję.
Układ jest zmontowany następująco:
Pod port B podpięty jest wyświetlacz 8 segmentowy (8. - ósemka z kropką).
Portu A jeszcze nie wykorzystuję.
Do portu D podpiąłem klawiaturę. Bity PD0/1/2 to kolumny, zaś PD3/4/5/6 to wiersze.
Na początku program ma za zadanie ustawić 0 na jednym z wierszy a następnie sprawdzić kolumny czy nie nastąpiło zwarcie. Jeśli tak to wpisuje numer do zmiennej cyfra która jest zwracana z funkcji. Jeśli nie nastąpiło skanuje następny wiersz i następny...
-------------------------------------
Trochę pogrzebałem i stwierdziłem że dziwacznie program się wykonuje.
tak jak by zamiast linijki:
...
if(bit_is_clear(PIND, PD0)){ //sprawdzanie stanu kolumny 1
cyfra = (i*3)+1;
...Kompilował coś takiego:
...
if(bit_is_clear(PIND, PD0)){ //sprawdzanie stanu kolumny 1
++i;
cyfra = (i*3)+1;
...I głowie się dlaczego, bo poniższe linijki są identyczne niemal że, a działają prawidłowo, tylko tutaj coś głupieje.
