WebElektronika

LCD (4x20)-as kijelző alkalmazása ATmega8-as mikrovezérlőnél

person access_time 2016.04.11.
Korábban bemutattuk a 2x20-as LCD használatát. Most a 4x20-as LCD alkalmazásához készítünk el egy alapprojektet, amelyet a későbbiekben is használni fogunk különböző megjelenítésekhez. Az ATmega8-as mikrovezérlővel készítjük el a projektünket, mert a WebElektronikán bemutatott ATmega-s tesztpanelünk jelenleg ezt tartalmazza.


Elkészítünk most egy újabb LCD-s projektet, amelyhez a WebElektronikán már ismertetett fejlesztő panelt használunk fel, illetve az alkalmazott LCD 4x20 soros.

Az LCD vezérléséhez szükséges függvények (lcdXXX) külön forrásfile-ban (lcd4.c), ezeknek a függvényeknek a "fejlécei" az "lcdfgv.h" header file-ban, illetve a különböző definíciók (pl.: Melyik portra van csatlakoztatva az LCD adatbemenete?, stb) az "lcd4.h" file-ban találhatók.

Ennél a projektnél a lábkiosztás a következő :

LCD Port
RS PD4
EN PD5
D4 PD0
D5 PD1
D6 PD2
D7 PD3

 

Az LCD-t meghajtó projekt Atmel Studio-ban készült el, a projektet tartalmazó Solution Explorer az első ábrán látható.

kep
1. ábra   Az alapprojekt felépítése
 

 

lcd4.h

Itt találjuk meg az LCD adatbemeneteinek, illetve a vezérlőjeleknek a "lábkiosztását".

#ifndef LCD_ROUTINES_H
#define LCD_ROUTINES_H

#ifndef F_CPU
#define F_CPU 12000000
#endif

#define LCDPort         PORTD
#define LCDPortDir  DDRD

#define RS                      PD4
#define EN                     PD5

#endif

 

lcd4.c

Az LCD vezérléséhez találjuk ebben a file-ban a különböző függvényeket. 

#include <avr/io.h>
#include "lcd4.h"
#include "lcdfgv.h"
#include <util/delay.h>

void lcdInit()
{
    LCDPortDir = 0xFF;
    _delay_ms(20);
    
    lcdOut(10);
    _delay_ms(5);
    
    lcdEN();
    _delay_ms(5);
    
    lcdEN();
    _delay_ms(5);
    
    lcdOut(0x20);
    _delay_ms(5);
    
    lcdCmd(0x20 | 0x08);
    
    lcdCmd(0x08 | 0x04);
    
    lcdCmd(0x04 | 0x02);
    
    lcdCmd(0x01);
    _delay_ms(5);
}

void lcdEN()
{
    LCDPort |= (1 << EN);
    _delay_us(50);
    LCDPort &= ~(1 << EN);
}

void lcdOut(unsigned char ch)
{
    ch &= 0xF0;
    
    LCDPort &= ~(0xF0 >> (4));
    LCDPort |= (ch >> (4));
    lcdEN();
}

void lcdOperate(unsigned char ch)
{
    LCDPort |= (1 << RS);
    lcdOut(ch);
    lcdOut(ch << 4 );
    _delay_us(50);
}

void lcdCmd(unsigned char ch)
{
    LCDPort &= ~(1 << RS);
    lcdOut(ch);
    lcdOut(ch << 4 );
    _delay_us(50);
}

void gotoXY(uint8_t x, uint8_t y)
{
    if(y == 0)
        lcdCmd(0x80 + 0x00 + x);
    else if(y == 1)
        lcdCmd(0x80 + 0x40 + x);
    else if(y == 2)
        lcdCmd(0x80 + 0x14 + x);
    else
        lcdCmd(0x80 + 0x54 + x);
}

void prints(const char *ch)
{
    while(*ch)
    lcdOperate(*ch++);
}

 

lcdfgv.h

Az LCD vezérléséhez, konfigurálásához szükséges függvények fejlécei szerepelnek ebben a header file-ban. Ezek elhagyhatók a projektben, a fordításkor "csak" warning-okat kapunk.

#ifndef LCDFGV_H_
#define LCDFGV_H_

void lcdInit();
void lcdEN();
void lcdOut(unsigned char ch);
void lcdOperate(unsigned char ch);
void lcdCmd(unsigned char ch);
void gotoXY(uint8_t x, uint8_t y);
void prints(const char *ch);

#endif /* LCDFGV_H_ */

 

lcdmain.c

Itt találjuk a main() függvényt, ez a projekt "belépési" pontja. Először az lcdInit() függvényt hívjuk meg, hogy az LCD-t beállítsuk 4x20-as módba, 4 bites adatmódba, ne legyen villogás, stb.

#include <avr/io.h>
#include <util/delay.h>
#include "lcd4.h"
#include "lcdfgv.h"

void main()
{
    lcdInit();
    
    gotoXY(0,0);
    prints("WebElektronika.com");
    
    gotoXY(0,1);
    prints("PIC, AVR, ARM, FPGA");
    
    gotoXY(0,2);
    prints("C, C#, JAVA, VHDL");
    
    gotoXY(0,3);
    prints("ASP.NET, WCF, WPF");

    while(1);
}

 

A main() függvényben a gotoXY() és a prints() függvényekkel a négy sorba kiírjuk a WebElektronika.com-ot, illetve azokat a fő témákat, amellyel az újságunk foglalkozik.