POLITECHNIKA LUBELSKA
Wydział Elektrotechniki i Informatyki
Laboratorium układów mikroprocesorowych
Krzysztof Lewandowski ED 9.8
„Atmega 32: Klawiatura 4x4, diody LED, wyświetlacz LCD”
Program:
Program miał za zadanie odczytywać naciśniety klawisz, zapalać odpowiadającą mu diode (do każdej przypisane są dwa klawisze) oraz wyświetlać jaki to klawisz na wyświetlaczu. Naciśnięcie dwóch klawiszy (w wierszu lub kolumnie) powoduje wyświetlenie kodu blędu i zapalenie układu diod. Wprowadzono system sprawdzania czy klawisz jest nadal wciskany, w przypadku ciągłego trzymania klawisza program czeka na jego zwolnienie.
#include <avr\io.h>
#define gw 0x2A;
#define p1 0x31;
#define p2 0x32;
#define p3 0x33;
#define p4 0x34;
#define p5 0x35;
#define p6 0x36;
#define p7 0x37;
#define p8 0x38;
#define p9 0x39;
#define pA 0x41;
#define pB 0x42;
#define pC 0x43;
#define pD 0x44;
#define p0 0x30;
#define hasz 0x23;
#define nic 0x01;
#define blad 0x21;
void czekaj(int czas)
{ int i;
for (i=0;i<czas;i++)
asm ("nop");
}
void wyswietlacz(int kod)
{ if (kod!=0)
{
czekaj(1000);
PORTD=0b00000011+(kod & 0b11110000); //transmisja starszych bitow - E=1
czekaj(1000);
PORTD=(PORTD & 0b11111101); //transmisja starszych bitow - E=0 (zapis)
czekaj(1000);
PORTD=0b00000011+kod*16; //transmisja mlodszych bitow - E=1
czekaj(1000);
PORTD=(PORTD & 0b11111101); //transmisja mlodszych bitow - E=0(zapis)
czekaj(1000);
}
}
int klawisz()
{
int k1,k2=0;
int od;
od=PINA;
czekaj(1000);
switch (PORTA)
{
case 0b11101111: //Wiersz pierwszy
switch (od)
{ case 0b11101111: k1=nic; break;
case 0b11100111: k1=pA; break;
case 0b11101011: k1=p3; break;
case 0b11101101: k1=p2; break;
case 0b11101110: k1=p1; break;
default: k1=blad;break;
};
if ((k2==0)&&(k1!=0))
k2=k1;
else
k2=blad;
break;
case 0b11011111: //Wiersz drugi
switch (od)
{ case 0b11011111: k1=nic; break;
case 0b11010111: k1=pB; break;
case 0b11011011: k1=p6; break;
case 0b11011101: k1=p5; break;
case 0b11011110: k1=p4; break;
default: k1=blad;break;
};
if ((k2==0)&&(k1!=0))
k2=k1;
else
k2=blad;
break;
case 0b10111111: //Wiersz trzeci
switch (od)
{ case 0b10111111: k1=nic; break;
case 0b10110111: k1=pC; break;
case 0b10111011: k1=p9; break;
case 0b10111101: k1=p8; break;
case 0b10111110: k1=p7; break;
default: k1=blad;break;
};
if ((k2==0)&&(k1!=0))
k2=k1;
else
k2=blad;
break;
case 0b01111111: //Wiersz czwarty
switch (od)
{ case 0b01111111: k1=nic; break;
case 0b01110111: k1=pD; break;
case 0b01111011: k1=hasz;break;
case 0b01111101: k1=p0; break;
case 0b01111110: k1=gw; break;
default: k1=blad;break;
};
if ((k2==0)&&(k1!=0))
k2=k1;
else
k2=blad;
break;
default: k2=blad; break;
};
return k2;
}
void diody(int key)
{ int k=0;
DDRB=0xFF;
k = key;
switch (k)
{
case (0x44) : PORTB=0b10000000; break;
case (0x31) : PORTB=0b00000001; break;
case (0x32) : PORTB=0b00000001; break;
case (0x33) : PORTB=0b00000010; break;
case (0x41) : PORTB=0b00000010; break;
case (0x34) : PORTB=0b00000100; break;
case (0x35) : PORTB=0b00000100; break;
case (0x36) : PORTB=0b00001000; break;
case (0x42) : PORTB=0b00001000; break;
case (0x37) : PORTB=0b00010000; break;
case (0x38) : PORTB=0b00010000; break;
case (0x39) : PORTB=0b00100000; break;
case (0x43) : PORTB=0b00100000; break;
case (0x2A) : PORTB=0b01000000; break;
case (0x45) : PORTB=0b01000000; break;
case (0x46) : PORTB=0b10000000; break;
case (0x21) : PORTB=0b10111101; break;
case (0x01) : PORTB=0b00000000; break;
};
}
void main()
{ int kod,kod1;
DDRB=0b11111111;
DDRD=0b11111111;
DDRA=0b11111111;
PORTA=0b11111111;
DDRA=0b11110000;
//inicjalizacja wyświetlacza
//ustawienie interfejsu 4-bitowego
PORTD=0b00100010;
czekaj(1000);
PORTD=0b00100000;
//włączenie wyświetlacza, kursora, wyłączenie migania
czekaj(1000);
PORTD=0b00000010;
czekaj(1000);
PORTD=0b00000000;
czekaj(1000);
PORTD=0b11100010;
czekaj(1000);
PORTD=0b11100000;
//czyszczenie wyświetlacza
czekaj(1000);
PORTD=0b00000010;
czekaj(1000);
PORTD=0b00000000;
czekaj(1000);
PORTD=0b00010010;
czekaj(1000);
PORTD=0b00010000;
//konfiguracja wyświetlacza
czekaj(1000);
PORTD=0b00000010;
czekaj(1000);
PORTD=0b00000000;
czekaj(1000);
PORTD=0b01100010;
czekaj(1000);
PORTD=0b01100000;
while (1)
{
PORTA = 0b11101111; //sprawdzanie pierwszego wiersza
kod = klawisz(); //odczytanie klawisza
diody(kod); //zapalenie odpowiedniej diody
kod1=klawisz(); //ponowne odczytanie klawisza
if (kod!=0x01) //czy klawisz był naciśniety
{ wyswietlacz(kod); //wyświeltenie kodu klawisza
while (kod1==kod) //jeżeli przycisk wciśniety - czekaj
{ czekaj(1000);
kod1=klawisz();
}
}
PORTA = 0b11011111; //sprawdzanie drugiego wiersza
kod = klawisz();
diody(kod);
kod1=klawisz();
if (kod!=0x01)
{ wyswietlacz(kod);
while (kod1==kod)
{ czekaj(1000);
kod1=klawisz();
}
}
PORTA = 0b10111111; //sprawdzanie trzeciego wiersza
kod = klawisz();
diody(kod);
kod1=klawisz();
if (kod!=0x01)
{ wyswietlacz(kod);
while (kod1==kod)
{ czekaj(1000);
kod1=klawisz();
}
}
PORTA = 0b01111111; //sprawdzanie czwartego wiersza
kod = klawisz();
diody(kod);
kod1=klawisz();
if (kod!=0x01)
{ wyswietlacz(kod);
while (kod1==kod)
{ czekaj(1000);
kod1=klawisz();
}
}
}
}