POLITECHNIKA LUBELSKA
Laboratorium układów mikroprocesorowych
Temat: Atmega32.
Wykonał: Data wykonania:
Krzysztof Kuć ED9.8 08.01.2008
W powyższym ćwiczeniu należało napisać program obsługujący wyświetlacz LCD i klawiature
#include <avr/io.h> -zdefiniowanie biblioteki
#define PORT_KEY PORTB; -zdefiniowanie zmiennych
#define DDR_KEY DDRB;
#define PIN_KEY PINB;
#define R1 0b01111111;
#define R2 0b10111111;
#define R3 0b11011111;
#define R4 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 brak 0x00;
#define blad 0x21;
void zwloka(int x) -funkcja powodująca zwłokę czasową
{
int i;
for (i=0;i<x;i++)
asm ("nop");
};
void wysw(int znak) -funkcja wyświetlająca dane na wyswietlaczu LCD
{
if (znak!=0)
{
zwloka(1000); -opóźnienie
PORTD=0b00000011+(znak & 0b11110000); -transmisja starszych bitów
zwloka(1000); -opóźnienie
PORTD=(PORTD & 0b11111101); -zapis starszych bitów
zwloka(1000); -opóźnienie
PORTD=0b00000011+znak*16; -transmisja młodszych bitów
zwloka(1000); -opóźnienie
PORTD=(PORTD & 0b11111101); -zapis młodszych bitów
}
};
int klaw() -funkcja obsługująca klawiaturę
{int znak=0,znak2=0,key;
PORTA=R1; -zdefiniowanie klawiszy dla rzędu 1
key=PINA;
zwloka(1000);
switch (key)
{
case 0b01111111:znak=brak;break;
case 0b01111110:znak=key1;break;
case 0b01111101:znak=key2;break;
case 0b01111011:znak=key3;break;
case 0b01110111:znak=key4;break;
default:znak=blad;
};
if(znak!=0x21)
{PORTA=R2; -zdefiniowanie klawiszy dla rzędu 2
key=PINA;
zwloka(1000);
switch (key)
{
case 0b10111111:znak2=brak;break;
case 0b10111110:znak2=key5;break;
case 0b10111101:znak2=key6;break;
case 0b10111011:znak2=key7;break;
case 0b10110111:znak2=key8;break;
default:znak2=blad;
};
if (znak*znak2==0)
{if (znak==0) znak=znak2;
}
else znak=blad;
};
if(znak!=0x21)
{PORTA=R3; -zdefiniowanie klawiszy dla rzędu 3
key=PINA;
zwloka(1000);
switch (key)
{
case 0b11011111:znak2=brak;break;
case 0b11011110:znak2=key9;break;
case 0b11011101:znak2=key0;break;
case 0b11011011:znak2=keyA;break;
case 0b11010111:znak2=keyB;break;
default:znak=blad;
}
if (znak*znak2==0)
{if (znak==0) znak=znak2;
}
else znak=blad;
};
if(znak!=0x21)
{PORTA=R4; -zdefiniowanie klawiszy dla rzędu 4
key=PINA;
zwloka(1000);
switch (key)
{
case 0b11101111:znak2=brak;break;
case 0b11101110:znak2=keyC;break;
case 0b11101101:znak2=keyD;break;
case 0b11101011:znak2=keyE;break;
case 0b11100111:znak2=keyF;break;
default:znak=blad;
}
if (znak*znak2==0)
{if (znak==0) znak=znak2;
}
else znak=blad;
};
return znak;
};
int main() -program główny
{DDRB=0b11111111; -ustawienie portów
DDRD=0b11111111;
DDRA=0b11111111;
PORTA=0b11111111;
DDRA=0b11110000;
-ustawienie interfejsu 4-bitowego
PORTD=0b00100010; -przesyłanie starszych bitów
zwloka(1000); -opóźnienie
PORTD=0b00100000; -przesyłanie starszych bitów -zapis
-włączenie wyświetlacza, wyłączenie migania kursora
zwloka(1000); -opóźnienie
PORTD=0b00000010; -przesyłanie starszych bitów
zwloka(1000); -opóźnienie
PORTD=0b00000000; -przesyłanie starszych bitów -zapis
zwloka(1000); -opóźnienie
PORTD=0b11100010; -przesyłanie młodszych bitów
zwloka(1000); -opóźnienie
PORTD=0b11100000; -przesyłanie młodszych bitów -zapis
-czyszczenie wyświetlacza
zwloka(1000); -opóźnienie
PORTD=0b00000010; -przesyłanie starszych bitów
zwloka(1000); -opóźnienie
PORTD=0b00000000; -przesyłanie starszych bitów -zapis
zwloka(1000); -opóźnienie
PORTD=0b00010010; -przesyłanie młodszych bitów
zwloka(1000); -opóźnienie
PORTD=0b00010000; -przesyłanie młodszych bitów -zapis
-konfiguracja wyświetlacza
zwloka(1000); -opóźnienie
PORTD=0b00000010; -przesyłanie starszych bitów
zwloka(1000); -opóźnienie
PORTD=0b00000000; -przesyłanie starszych bitów -zapis
zwloka(1000); -opóźnienie
PORTD=0b01100010; -przesyłanie młodszych bitów
zwloka(1000); -opóźnienie
PORTD=0b01100000; -przesyłanie młodszych bitów -zapis
while (1) -pętla nieskończona
{int znak; -zdefiniowanie zmiennych
znak=klaw(); -przypisanie zmiennej znak wartości funkcji klaw()
PORTB=znak; -przypisanie dla PORTB wartości zmiennej znak
wysw(znak); -przypisanie funkcji wysw() wartości zmiennej znak
};
};