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ó.
1. ábra Az alapprojekt felépítése
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
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++);
}
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_ */
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.
Október közepén elindítjuk az Atmel 8 bites mikrovezérlőkről szóló sorozatunkat. Ehhez használnunk kell természetesen egy fejlesztőkörnyezetet is. Több ilyen is létezik, például a WinAVR, vagy az Atmel Studio. Mi az Atmel Studio-t fogjuk használni, e. . . .
A PIC18F mikrovezérlők ma is népszerű a fejlesztők körében. Noha 8 bites architektúráról beszélünk, számos érdekes és hasznos alkalmazás megvalósítható vele. Elég csak az USB-re, vagy akár az Ethernetre gondolnunk. Ezért a Szerkesztőség egy sorozat k. . . .
Megnézzük most néhány példa segítségével a Watchog Timer (WDT) használatát. Írni fogunk közvetlenül regisztert, de használni fogunk makrókat is.. . . .