LABORATORIUM UKŁADÓW MIKROPROCESOROWYCH
Temat ćwiczenia: Obsługa klawiatury i wyświetlacza LCD
Michał Adamczuk
ED 9.8
Wtorek 1715
11.12.2007
Zadanie 1
// ***********************************************************
// Project: Laboratorium mikroprocesorów
// Author: Michał Adamczuk
// Module description:
// ***********************************************************
#include <avr\io.h>
#include <util/delay.h>
#define gwiazdka 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 wyswietlacz(int kod)
{ if (kod!=0)
{
_delay_us(500);
PORTD=0b00000011+(kod & 0b11110000);//transmisja starszych bitow - E=1
_delay_us(500);
PORTD=(PORTD & 0b11111101); //transmisja starszych bitow - E=0 (zapis)
_delay_us(500);
PORTD=0b00000011+kod*16; //transmisja mlodszych bitow - E=1
_delay_us(500);
PORTD=(PORTD & 0b11111101); //transmisja mlodszych bitow - E=0 (zapis)
_delay_us(500);
}
};
int klawisz()
{
int k1,k2=0;
int od;
od=PINA;
_delay_us(500);
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=gwiazdka; 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=0b01111110; break;
case (0x01) : PORTB=0b00000000; break;
};
}
void main()
{ int kod,kod1;
DDRB=0b11111111;
DDRD=0b11111111;
DDRA=0b11111111;
PORTA=0b11111111;
DDRA=0b11110000;
while (1)
{
PORTA = 0b11101111;
kod = klawisz();
diody(kod);
kod1=klawisz();
if (kod!=0x01)
{ wyswietlacz(kod);
while (kod1==kod)
{ _delay_us(500);
kod1=klawisz();
}
}
PORTA = 0b11011111;
kod = klawisz();
diody(kod);
kod1=klawisz();
if (kod!=0x01)
{ wyswietlacz(kod);
while (kod1==kod)
{ _delay_us(500);
kod1=klawisz();
}
}
PORTA = 0b10111111;
kod = klawisz();
diody(kod);
kod1=klawisz();
if (kod!=0x01)
{ wyswietlacz(kod);
while (kod1==kod)
{ _delay_us(500);
kod1=klawisz();
}
}
PORTA = 0b01111111;
kod = klawisz();
diody(kod);
kod1=klawisz();
if (kod!=0x01)
{ wyswietlacz(kod);
while (kod1==kod)
{ _delay_us(500);
kod1=klawisz();
}
}
}
}
1