Witam
Jestem nowy na forum więc proszę o wyrozumiałość
Mam kłopot otóż kilka przycisków mi nie wystarcza wiec pomyślałem o podłączeniu klawiatury do uc znalazłem w necie jak podłączyć lecz nie mogę rozgryźć programu,
który plik gdzie wstawić i jak napisać program aby robił: gdy nacisnę na klawiaturze "space" to ma uc dać stan wysoki na port B0 a gdy puszcze to stan niski na B0
Program ma być w języku C dla Procesora Atmega32 z rodziny AVR
Bardzo proszę o pomoc będę bardzo wdzięczny
http://radzio.dxp.pl/pckeyboard/
Są do pobrania 3 pliki ale nie wiem gdzie który wstawić i niema programu szukałem ale nie znalazłem liczę na waszą pomoc :)
Podłączenie klawiatury do uc
Nie ma programu bo to jest gotowa funkcja , z której możesz korzystać.
utwórz własny plik z funkcją main. Powinien wyglądać mniej więcej tak:
Do kompilacji dołącz plik atkeyboard.c
To tak mniej więcej.
Jak chcesz użyć tablicy do dekodowania klawiszy na ASCII to poczytaj o PROGMEM i sposobie odczytu danych z pamięci programu.
utwórz własny plik z funkcją main. Powinien wyglądać mniej więcej tak:
Kod: Zaznacz cały
#inlcude "atkeyboard.h"
#include "scancodes.h"
...
int main()
{
intATkbd()
...
while(1) // petla glowna
{
unsigned char key;
key=getATkbd(); // program będzie czakal az nacisniesz jakis klawisz
if (key==kod_spacji)
cos tam zrob
...
}
return 0;
}
To tak mniej więcej.
Jak chcesz użyć tablicy do dekodowania klawiszy na ASCII to poczytaj o PROGMEM i sposobie odczytu danych z pamięci programu.
Aha a kod spacji to 0x29
Czyli cały program powinien wyglądać tak
A ten trzeci plik h co z nim on jest potrzebny ??
Czyli cały program powinien wyglądać tak
A ten trzeci plik h co z nim on jest potrzebny ??
Kod: Zaznacz cały
#include <avr/io.h> //Nagłówek
#include "atkeyboard.h"
unsigned char volatile dane = 0, nowy = 0, i = 0;
// procedura obsługi przerwania zewnętrzneg
#if ATKbdClk == PD2
#define USE_INT0
ISR(INT0_vect)
#elif ATKbdClk == PD3
#define USE_INT1
ISR(INT1_vect)
#endif
{
switch(i){
case 0 :
dane = 0;
i++;
break;
case 1 :
if(ATKbdGetDta()) dane |= 0x01;
i++;
break;
case 2 :
if(ATKbdGetDta()) dane |= 0x02;
i++;
break;
case 3 :
if(ATKbdGetDta()) dane |= 0x04;
i++;
break;
case 4 :
if(ATKbdGetDta()) dane |= 0x08;
i++;
break;
case 5 :
if(ATKbdGetDta()) dane |= 0x10;
i++;
break;
case 6 :
if(ATKbdGetDta()) dane |= 0x20;
i++;
break;
case 7 :
if(ATKbdGetDta()) dane |= 0x40;
i++;
break;
case 8 :
if(ATKbdGetDta()) dane |= 0x80;
i++;
break;
case 9 :
i++;
break;
case 10 :
nowy = 1;
i = 0;
break;
}
}
// funkcja inicjalizująca porty oraz przerwania
// wykorzystywane przy obsłudze klawiatury.
void initATkbd(void)
{
ATKbdDtaIn(); // linia DATA pracuje jako wejście
ATKbdSetDta();// właczenie rezystora podciągajacego linii DATA
ATKbdClkIn(); // linia CLK pracuje jako wejście
ATKbdSetClk();// właczenie rezystora podciągającego lini CLK
#ifdef USE_INT0
GICR |= (1 << INT0); // zezwolenie na przerwanie INT0
MCUCR |= (1 << ISC01); // przerwanie INT0 wyzwalane zboczem opadającym
#endif
#ifdef USE_INT1
GICR |= (1 << INT1); // zezwolenie na przerwanie INT1
MCUCR |= (1 << ISC11); // przerwanie INT1 wyzwalane zboczem opadającym
#endif
sei(); // globalne odblokowanie przerwań
}
// funkcja odczytujaca kod naciśniętego klawisza
unsigned char getATkbd(void)
{
while(!nowy); // oczekiwanie na odebranie nowego znaku
nowy = 0; // zerowanie flagi odebrania znaku
return dane;
}
int main(void)
{
intATkbd()
while(1); // petla glowna
{
unsigned char key;
key=getATkbd(); // program będzie czakal az nacisniesz jakis klawisz
if (key==0x20)
{
PORTA= 0b00000010; //Na port A1 daj stan wysoki na pozostałe stan niski
}
else;
{
PORTA= 0b00000000; //Na porty A daj stan niski
}
}
return 0;
}
Uwaga 1: zamiast key==0x20 daj key==0x29 dla spacji.
Uwaga 2: czy wiesz, że port A pracuje jako wejście twoim programie? Ustaw odpowiednio rejestr DDR (wpisz jedynkę tam, gdzie chcesz by pracował jako wyjście).
Uwaga 3: program działać będzie tak: naciśniesz spacje to ustawi jedynkę na porcie, naciśniesz inny klawisz to port wyzeruje.
Uwaga 4: nie musisz używać pliku scancodes.h jeżeli użyjesz bezpośrednio kodów klawiatury, a nie ASCII.
Uwaga 2: czy wiesz, że port A pracuje jako wejście twoim programie? Ustaw odpowiednio rejestr DDR (wpisz jedynkę tam, gdzie chcesz by pracował jako wyjście).
Uwaga 3: program działać będzie tak: naciśniesz spacje to ustawi jedynkę na porcie, naciśniesz inny klawisz to port wyzeruje.
Uwaga 4: nie musisz używać pliku scancodes.h jeżeli użyjesz bezpośrednio kodów klawiatury, a nie ASCII.
Czyli tak ma wyglądać gotowy program czy trzeba jakieś pliki dorzucić??
[ Dodano: 2010-09-01, 11:01 ]
Tylko czy ta biblioteka będzie działać pod atmega32 ??
Kod: Zaznacz cały
#include <avr/io.h> //Nagłówek
#include "atkeyboard.h"
unsigned char volatile dane = 0, nowy = 0, i = 0;
// procedura obsługi przerwania zewnętrzneg
#if ATKbdClk == PD2
#define USE_INT0
ISR(INT0_vect)
#elif ATKbdClk == PD3
#define USE_INT1
ISR(INT1_vect)
#endif
{
switch(i){
case 0 :
dane = 0;
i++;
break;
case 1 :
if(ATKbdGetDta()) dane |= 0x01;
i++;
break;
case 2 :
if(ATKbdGetDta()) dane |= 0x02;
i++;
break;
case 3 :
if(ATKbdGetDta()) dane |= 0x04;
i++;
break;
case 4 :
if(ATKbdGetDta()) dane |= 0x08;
i++;
break;
case 5 :
if(ATKbdGetDta()) dane |= 0x10;
i++;
break;
case 6 :
if(ATKbdGetDta()) dane |= 0x20;
i++;
break;
case 7 :
if(ATKbdGetDta()) dane |= 0x40;
i++;
break;
case 8 :
if(ATKbdGetDta()) dane |= 0x80;
i++;
break;
case 9 :
i++;
break;
case 10 :
nowy = 1;
i = 0;
break;
}
}
// funkcja inicjalizująca porty oraz przerwania
// wykorzystywane przy obsłudze klawiatury.
void initATkbd(void)
{
ATKbdDtaIn(); // linia DATA pracuje jako wejście
ATKbdSetDta();// właczenie rezystora podciągajacego linii DATA
ATKbdClkIn(); // linia CLK pracuje jako wejście
ATKbdSetClk();// właczenie rezystora podciągającego lini CLK
#ifdef USE_INT0
GICR |= (1 << INT0); // zezwolenie na przerwanie INT0
MCUCR |= (1 << ISC01); // przerwanie INT0 wyzwalane zboczem opadającym
#endif
#ifdef USE_INT1
GICR |= (1 << INT1); // zezwolenie na przerwanie INT1
MCUCR |= (1 << ISC11); // przerwanie INT1 wyzwalane zboczem opadającym
#endif
sei(); // globalne odblokowanie przerwań
}
// funkcja odczytujaca kod naciśniętego klawisza
unsigned char getATkbd(void)
{
while(!nowy); // oczekiwanie na odebranie nowego znaku
nowy = 0; // zerowanie flagi odebrania znaku
return dane;
}
int main(void)
{
DDRA= 0b11111111; //Porty A jako wyjścia
while(1); // petla glowna
{
unsigned char key;
key=getATkbd(); // program będzie czakal az nacisniesz jakis klawisz
if (key==0x29)
{
PORTA= 0b00000010; //Na port A1 daj stan wysoki na pozostałe stan niski
}
else;
{
PORTA= 0b00000000; //Na porty A daj stan niski
}
}
return 0;
}
[ Dodano: 2010-09-01, 11:01 ]
Tylko czy ta biblioteka będzie działać pod atmega32 ??