POLITECHNIKA LUBELSKA
LABORATORIUM UKŁADÓW MIKROPROCESOROWYCH
SPRAWOZDANIE
TEMAT: Odczyt klawiatury i obsługa wyświetlacza LCD - ATmega32
Wykonał: Konrad Kępa ED 9.8 I3
Data: 15 stycznia 2008r
Celem ćwiczenia było zapoznanie się z działaniem mikrokontrolera ATmega32 oraz napisanie programu w języku C obsługującego wyświetlacz LCD oraz klawiaturę.
Kod programu.
#include <avr/io.h>
// deniniowanie kodów klawiszy oraz wierszów do obsługi klawiatury
#define ROW1 0b01111111;
#define ROW2 0b10111111;
#define ROW3 0b11011111;
#define ROW4 0b11101111;
#define key0 0x30;
#define key1 0x31;
#define key2 0x32;
#define key3 0x33;
#define key4 0x34;
#define key5 0x35;
#define key6 0x36;
#define key7 0x37;
#define key8 0x38;
#define key9 0x39;
#define keyA 0x41;
#define keyB 0x42;
#define keyC 0x43;
#define keyD 0x44;
#define keyE 0x45;
#define keyF 0x46;
#define none 0x00;
#define error 0x21;
// funkcja służąca do opóźniania działa wykonywanego programu
void czekaj(int czas)
{int i;
for (i=0;i<czas;i++)
asm ("nop");
};
// funkcja służąca do obsługi wyświetlacza LCD podpiętego do portu D mikrokontrolera
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)
}
};
// funkcja służąca do wykrywania naciśniętego klawisza oraz sygnalizowania błędów (dwa naciśniete klawisze)
// sprawdzanie jest wykonywane poprzez zastosowanie pętli switch();
int klawiatura()
{int kod=0,kod2=0,key;
PORTA=ROW1; //wiersz pierwszy
key=PINA;
czekaj(1000);
switch (key)
{case 0b01111111:kod=none;break;
case 0b01111110:kod=key1;break;
case 0b01111101:kod=key2;break;
case 0b01111011:kod=key3;break;
case 0b01110111:kod=key4;break;
default:kod=error;
};
if(kod!=0x21)
{PORTA=ROW2; //wiersz drugi;
key=PINA;
czekaj(1000);
switch (key)
{case 0b10111111:kod2=none;break;
case 0b10111110:kod2=key5;break;
case 0b10111101:kod2=key6;break;
case 0b10111011:kod2=key7;break;
case 0b10110111:kod2=key8;break;
default:kod2=error;
};
if (kod*kod2==0)
{if (kod==0) kod=kod2;
}
else kod=error;
};
if(kod!=0x21)
{PORTA=ROW3; //wiersz trzeci;
key=PINA;
czekaj(1000);
switch (key)
{case 0b11011111:kod2=none;break;
case 0b11011110:kod2=key9;break;
case 0b11011101:kod2=key0;break;
case 0b11011011:kod2=keyA;break;
case 0b11010111:kod2=keyB;break;
default:kod=error;
}
if (kod*kod2==0)
{if (kod==0) kod=kod2;
}
else kod=error;
};
if(kod!=0x21)
{PORTA=ROW4; //wiersz czwarty;
key=PINA;
czekaj(1000);
switch (key)
{case 0b11101111:kod2=none;break;
case 0b11101110:kod2=keyC;break;
case 0b11101101:kod2=keyD;break;
case 0b11101011:kod2=keyE;break;
case 0b11100111:kod2=keyF;break;
default:kod=error;
}
if (kod*kod2==0)
{if (kod==0) kod=kod2;
}
else kod=error;
};
return kod;
};
// główna pętla programu
void main()
{DDRB=0b11111111;
DDRD=0b11111111;
DDRA=0b11111111;
PORTA=0b11111111;
DDRA=0b11110000;
//ustawienie interfejsu 4-bitowego
PORTD=0b00100010; //transmisja starszych bitow - E=1
czekaj(1000);
PORTD=0b00100000; //transmisja starszych bitow - E=0 (zapis)
//włączenie wyświetlacza,kursora, wyłączenie migania
czekaj(1000);
PORTD=0b00000010; //transmisja starszych bitow - E=1
czekaj(1000);
PORTD=0b00000000; //transmisja starszych bitow - E=0 (zapis)
czekaj(1000);
PORTD=0b11100010; //transmisja mlodszych bitow - E=1
czekaj(1000);
PORTD=0b11100000; //transmisja mlodszych bitow - E=0 (zapis)
//czyszczenie wyswietlacza
czekaj(1000);
PORTD=0b00000010; //transmisja starszych bitow - E=1
czekaj(1000);
PORTD=0b00000000; //transmisja starszych bitow - E=0 (zapis)
czekaj(1000);
PORTD=0b00010010; //transmisja mlodszych bitow
czekaj(1000);
PORTD=0b00010000; //transmisja mlodszych bitow - E=0 (zapis)
//konfiguracja wyswietlacza (kierunek+1, przesow-brak)
czekaj(1000);
PORTD=0b00000010; //transmisja starszych bitow - E=1
czekaj(1000);
PORTD=0b00000000; //transmisja starszych bitow - E=0 (zapis)
czekaj(1000);
PORTD=0b01100010; //transmisja mlodszych bitow - E=1
czekaj(1000);
PORTD=0b01100000; //transmisja mlodszych bitow - E=0 (zapis)
while (1)
{int kod;
kod=klawiatura();
PORTB=kod;
wyswietlacz(kod);
};
};
4