www.eprace.edu.pl » automatyka-basenowa » Opis oprogramowania mikrokontrolera » oprogramowanie główne

oprogramowanie główne

Przedstawiona poniżej procedura odpowiedzialna jest za inicjalizację wyświetlacza po uruchomieniu urządzenia. Wykonuje ona sekwencję resetującą wewnętrzny procesor wyświetlacza oraz ustawia wstępne parametry pracy (tabela nr 3).


Interfejs 4-ro bitowy
Ilość linii 2
Rozmiar czcionki 5 x 7 pikseli
Wyświetlacz włączony Tak
Wyświetlacz wyczyszczony Tak
Auto inkrementacja nadchodzących danych Tak

Tabela 3 - parametry wstępnej inicjalizacji wyświetlacza

void LCDinit(void) //inicjalizacja LCD
{
 RSDDR|=(1<  D5DDR|=(1<  CLR_RS;
 CLR_E;
 waitms(20);
 CLR_D7;
 CLR_D6;
 SET_D4;
 SET_D5;
 unsigned char i;
 for(i=0;i<3;i++) {SET_E;CLR_E;waitms(5);}
 CLR_D4;
 SET_E;
 CLR_E;
 LCDcmd(0x28); //function set - interface=4 bit,line=2,font=5x7
 LCDcmd(ONDISP); //display ctrl - display on
 LCDcmd(0x06); //entry mode set - increment
 LCDcmd(0x01); //clear display
}

Podstawowe procedury obsługi wyświetlacza zaczerpnięte zostały z materiałów dostępnych na stronie www.avrfreaks.net. Jednak podczas pisania programu uległy tak poważnym zmianom, że obecnie tworzą bibliotekę stanowiącą własność autora niniejszej pracy.

LCDinit() wykorzystuje jedną z dwóch funkcji:

void LCDcmd(char d) //Wyślij komendę do LCD
{
 CLR_RS;
 LCDwrite(d);
}
void LCDchr(char d) //Wyślij 1 znak do LCD
{
 SET_RS;
 LCDwrite(d);
}

Wyświetlacz rozróżnia nadsyłane dane (znak lub komenda) poprzez stan linii RS w momencie nadawania danej. Aby w ogóle możliwe było wysłanie danych do wyświetlacza, potrzebna jest funkcja, która podzieli wysyłany bajt na dwie części po 4 bity, po czym kolejno je nada. Do tego celu służy LCDwrite(...):

void LCDresetdata(void) //wyzeruj szynę danych LCD
{
CLR_D4;
CLR_D5;
CLR_D6;
CLR_D7;
}
void LCDwrite(char d) //zapis bajtu do LCD
{
LCDresetdata();
if(d & 0x10){SET_D4;}
if(d & 0x20){SET_D5;}
if(d & 0x40){SET_D6;}
if(d & 0x80){SET_D7;}
SET_E;CLR_E;
LCDresetdata();
if(d & 0x01){SET_D4;}
if(d & 0x02){SET_D5;}
if(d & 0x04){SET_D6;}
if(d & 0x08){SET_D7;}
SET_E;CLR_E;
waitms(3); }

Kolejna z funkcji umożliwia ustawienie kursora w wybranej pozycji na ekranie:

void
LCDxy(char x,char y)
{
unsigned char com=0x80;
void LCDxy(char x,char y)
{
unsigned char com=0x80;
com|=(x|(y<<6));
LCDcmd(com);
}

Współpracuje ona z funkcją wyświetlającą tekst:

void LCDtext(char *txt)
{
while(*txt) {LCDchr(*txt++);}
}

Pozostałe funkcje służące do obsługi wyświetlacza są modyfikacją komendy LCDcmd(...).W pliku programu zdefiniowane są stałe (tabela nr 4), po których wysłaniu za pomocą LCDcmd() następuje żądana przez nas reakcja wyświetlacza.


CLRDISP 0x01 //czysc wyswietlacz
HOMEDISP 0x02 //kursor na pozycje 0,0
OFFDISP 0x08 //wylacz ekran
ONDISP 0x0c //wlacz ekran
SHIFT 0x9f // przesuwanie kursora

Tabela 4 - pomocnicze stałe do obsługi wyświetlacza

Funkcje typu LCD_CURSOR, LCD_BLINK, LCD_SHIFT to jedynie uproszczenie dla programisty. Równie dobrze w pętli programu można np. zamiast komendy LCD_BLINK(0) użyć komendy LCDcmd(dana), tylko że przy wielokrotnym używaniu tego typu zapisów program w końcu staje się całkowicie nieczytelny nawet dla jego twórcy.

//wlączanie kurosra
//a=1 wł
//a=0 wył
void LCD_CURSOR(char a)
{
if (a) {LCDcmd(ONDISP | 0x02);}
else {LCDcmd(ONDISP);}
}
//******************************************************************************
//miganie kursora
//a=1 wł
//a=0 wył
void LCD_BLINK(char a)
{
if (a) {LCDcmd(ONDISP | 0x01);}
else {LCDcmd(ONDISP);}
}
//******************************************************************************
//przesuwanie tekstu
//a=1 w prawo
//a=2 w lewo
//a=0 wył
void LCD_SHIFT(char a)
{
if (a == 1) {LCDcmd(SHIFT | 0x04);} //w prawo
else if (a == 2){LCDcmd(SHIFT);} // w lewo
else {LCDcmd(ONDISP);} // wyłączenie przesuwania
}
//******************************************************************************

Copyright © 2008-2010 EPrace oraz autorzy prac.