WebElektronika

Kétsoros LCD kijelző használata

person access_time 2014.02.26.
Ebben a cikkben egy kétsoros LCD felprogramozását és a hozzátartozó sajátfüggvényeket, makrókat mutatjuk be. Nem térünk ki viszont az LCD-k felépítésére, vezérlésére.


A Microchip által forgalmazott PICDEM 2 Plus tesztpanelt használtuk fel. Igaz, hogy nem egy mai darab, de ennek az elterjedt tesztpanelnek több változata is létezik és remek gyakorlási lehetőséget kínál az LCD-k megismerésére.

Az LCD bekötése látható az 1. ábrán. Nem 8 bites a vezérlés, hanem csak 4, azaz a DB4-7 adatjelekre csatlakozik a PIC18F4550-es mikrovezérlő D0-3 portja.


1. ábra   Az LCD bekötése
 

A projekt három fileból áll. A main.c program tartalmazza a main() függvényt, amelyben inicializáljuk az LCD-t, majd while(1) végtelen ciklusban állandóan kiírjuk a "WebElektronika" és az "online ujsag" szavakat. Ezeknek a szavaknak a pozícionálása az lcdGoto() függvénnyel történik.

Az lcd.c file-ban találjuk meg a különböző sajátfüggvényeket, az lcd.h header file-ban pedig a különböző definíciókat (panelfüggő) és makrókat.
Természetesen a makrók helyett írhattunk volna akár sajátfüggvényeket is, de nem csak az volt a cél, hogy működőképes kódokat közöljünk, hanem az is, hogy makrók készítését is megnézzük gyakorlati szinten.

Az eredmény :


 

Megjegyzések a kódokhoz : 

  1. A "C" fordító nem ismeri a "byte" típust, ezért használunk "unsigned char"-t, amely megfelel a "byte"-nak.
  2. Az lcdSzovegRom() függvénynél a "const" elhagyható.
  3. A makrók (lcd.h-ban találhatók) helyett használhatunk sajátfüggvényeket, de azoknak a használata megnöveli a működési időt a plusz stackműveletek miatt.

main.c

#include <p18f4550.h>
#include "lcd.h"

#pragma config WDT = OFF
#pragma config LVP = OFF

void main(void)
{
    lcdInit();
    while(1)
    {
        lcdGoto(0);
        lcdSzovegRom("WebElektronika");
        lcdGoto(40);
        lcdSzovegRom("online ujsag");
    }
}

lcd.c

#include "lcd.h"
#include "delays.h"

void lcdIras(unsigned char ch)
{
    Delay10TCYx(20);
    lcdADAT = (((ch >> 4 & 0x0F))|(lcdADAT & 0xF0));
    lcdEN_Tuske();
    lcdADAT = ((ch & 0x0F)|(lcdADAT & 0xF0));
    lcdEN_Tuske();
}

void lcdTorles()
{
    lcdRS = 0;
    lcdIras(0x01);
    Delay1KTCYx(20);
}

void lcdSzovegRom(const rom char *ch)
{
    lcdRS = 1;
    while(*ch)
        lcdIras(*ch++);
}

void lcdGoto(unsigned char pos)
{
    lcdRS = 0;
        lcdIras(0x80 + pos);
}

void lcdInit()
{
    ADCON1 = 0x0F;

    InitAdatAllapot();
    InitAdatIrany();
    InitVezerloIrany();
    InitVezerloAllapot();

    lcdADAT = ((lcdADAT & 0xF0) | 0x03);
    lcdEN_Tuske();
    Delay1KTCYx(40);
    lcdADAT = ((lcdADAT & 0xF0) | 0x02);
    lcdEN_Tuske();
    lcdIras(0x28);
    lcdIras(0x0C);
    lcdTorles();
    lcdIras(0x6);
}

 

lcd.h

// Adatjelek az LCD-re
#define PRD0_T    TRISDbits.TRISD0
#define PRD1_T    TRISDbits.TRISD1
#define PRD2_T    TRISDbits.TRISD2
#define PRD3_T    TRISDbits.TRISD3

#define PRD0    LATDbits.LATD0
#define PRD1    LATDbits.LATD1
#define PRD2    LATDbits.LATD2
#define PRD3    LATDbits.LATD3

// Makrók az adatjelekre
#define InitAdatIrany()      {PRD0_T = 0; PRD1_T = 0; PRD2_T = 0; PRD3_T = 0;}

#define InitAdatAllapot()    {PRD0 = 0; PRD1 = 0; PRD2 = 0; PRD3 = 0;}

#define lcdADAT LATD

// A vezérlőjelek iránya
#define lcdRS_T    TRISAbits.TRISA3
#define lcdEN_T    TRISAbits.TRISA1
#define lcdRW_T    TRISAbits.TRISA2

// A vezérlőjelek elnevezése
#define lcdRS LATAbits.LATA3
#define lcdEN LATAbits.LATA1
#define lcdRW LATAbits.LATA2

// Makrók a vezérlőjelekre
#define InitVezerloIrany()      {lcdRS_T = 0; lcdEN_T = 0; lcdRW_T = 0;}

#define InitVezerloAllapot()    {lcdRS = 0; lcdEN = 0; lcdRW = 0;}

#define lcdEN_Tuske()    { lcdEN = 1; Nop(); Nop(); Nop(); lcdEN = 0; }


És ha ide kattintunk, akkor egy LCD szimulátorral ismerkedhetünk meg.