Witam,
Jestem w trakcie budowy komunikacji między ATmega32 a klawiatura PS/2. Wykorzystuje biblioteki zamieszczone na stronie Link
Tutaj zamieszczam cały projekt Link
Wykorzystuję zestaw uruchomieniowy ZL3AVR. ATmega32 jest taktowana zewnętrznym kwarcem 16MHz.
Po skompilowaniu programu i wgraniu pliku .hex na mikrokontroler na wyświetlaczu LCD nie pojawia się żaden znak.
Może ktoś zna powód, dla którego nie można uzyskać kodu wciśniętego klawisza klawiatury PS/2. Może wykorzystywaliście już tą bibliotekę??
Jestem w trakcie budowy komunikacji między ATmega32 a klawiatura PS/2. Wykorzystuje biblioteki zamieszczone na stronie Link
//klawiatura.c
#include <avr/io.h>
//#include <avr/interrupt.h>
#include <string.h>
#include <inttypes.h>
#include <stdlib.h>
//#include <stdio>
#include "hd44780.h"
#include "atkeyboard.h"
//#include "scancodes.h"
char intt[20];
int main(void)
{
LCD_Initalize();
void initATkbd(void);
unsigned char c = 2;
while(1)
{
c = getATkbd();
LCD_GoTo(1,0);
LCD_WriteText(intt);
itoa(c,intt,10);
}
}
//atkeyboard////
#include <avr/io.h>
#include <avr/interrupt.h>
//
#define ATKbdPort PORTD
#define ATKbdPin PIND
#define ATKbdDir DDRD
//
#define ATKbdClk PD2
//
#define ATKbdDta PD0
//
#define ATKbdGetDta() (ATKbdPin & (1 << ATKbdDta))
#define ATKbdGetClk() (ATKbdPin & (1 << ATKbdClk))
//
//#define ATKbdSetDta() ATKbdPort |= (1 << ATKbdDta)
#define ATKbdClrDta() ATKbdPort &= ~(1 << ATKbdDta)
//
//#define ATKbdSetClk() ATKbdPort |= (1 << ATKbdClk)
#define ATKbdClrClk() ATKbdPort &= ~(1 << ATKbdClk)
#define ATKbdDtaOut() ATKbdDir |= (1 << ATKbdDta)
#define ATKbdDtaIn() ATKbdDir &= ~(1 << ATKbdDta)
#define ATKbdClkOut() ATKbdDir |= (1 << ATKbdClk)
#define ATKbdClkIn() ATKbdDir &= ~(1 << ATKbdClk)
unsigned char getATkbd(void);
void initATkbd(void);
////atkeyboard.c///
#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;
}
Tutaj zamieszczam cały projekt Link
Wykorzystuję zestaw uruchomieniowy ZL3AVR. ATmega32 jest taktowana zewnętrznym kwarcem 16MHz.
Po skompilowaniu programu i wgraniu pliku .hex na mikrokontroler na wyświetlaczu LCD nie pojawia się żaden znak.
Może ktoś zna powód, dla którego nie można uzyskać kodu wciśniętego klawisza klawiatury PS/2. Może wykorzystywaliście już tą bibliotekę??