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 :
#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");
}
}
#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);
}
// 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.
Megismerjük most a PIC18F mikrovezérlők megszakításkezelését, és készítünk két egyszerű példaprogramot is. Ezek az egy- és a kétszintű megszakításkezelést mutatják be, de sablonként is jól használhatók saját fejlesztéseknél is.. . . .
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.. . . .