képzés

A program válik olvashatóvá

Minél nagyobb a program, annál nehezebb irányítani, és szem előtt tartani. Breaking program funkcionális gyártott alkatrészek, mi hogy olvashatóbb és logikus. Minden funkció a kijelző fog koncentrálódni egy helyen.


Újrahasznosíthatóságának kód

Ha kell használni az LCD-kijelzőt egy másik eszköz, akkor nem kell kitépni darabokat a kód egy régi projekt. Csak csatlakoztassa az új projekt lcd_lib könyvtárban.


Lehetőség külön összeállítás

Amikor a program nagy lesz, ez növeli az idő a fordításra. Még ha teszünk egy kis változás, hogy a kódot, a fordító lapát a teljes fájl elejétől a végéig. Ha a program modulokra van osztva, akkor csak össze egy modul, amelyben a változások történtek.


A lehetőséget, hogy a projekt

Felosztása egy programot a modulok lehetővé teszi, hogy a projekten több programozó azonnal. Például egy programozó teszi az alap program, míg mások részt vesznek a könyvtárakban.

A globális változók az egyik modul nem lesz látható a többi, és fordítva. Ahhoz, hogy egy globális változót egy másik modul, meg kell írni a kulcsszó extern.


extern unsigned char kulcs = 0; // rossz. Hibát okozhat!

Funkciók nyilvánítják ugyanabban a modulban elérhető lesz más fájlokat. De a kulcsszavak segítségével, valamint a statikus régió része funkció láthatóságot korlátozza a modul, amelyben meg van határozva.

Próbálja használni ezt a funkciót egy másik fájlt okoz fordítási hibát.

A korábbi programok, szoktuk a legfontosabb, hogy Lövő statikus. hogy állapítsa meg egy statikus változót. Most már tudja, egy másik szó használata.

Oké, elég elmélet eljárni.
Nyissa meg a régi projekt.
Alapítva IARe két fájl - lcd_lib.h és lcd_lib.c.
Mentse a fájlokat a projekt mappába.
Hozzáadása lcd_lib.c fájlt a projekthez. (Jobb egérgombbal kattintottak workspace`e és válassza az Új> Fájlok hozzáadása ... menüpontot).
A lcd_lib.c az include direktíva csatlakoztassa a header file -

A lcd_lib.h hozzá vonalak

#ifndef LCD_LIB_H
#define LCD_LIB_H

#ifndef és #endif - a feltételes fordítási direktívák. Mik azok számára? Tegyük fel, hogy van egy nagy projekt, és a mi könyvtár csatlakozik több helyen. A helyzet állhat elő, ha a tartalom lcd_lib.h szerepelni fog minden fájlt ismételten. Aztán, amikor összeállítja a projekt sikertelensége.

Ennek elkerülése érdekében, hogy ez a szabály a keret tartalmát a header file szerkezet felett. Amikor az előfeldolgozó megbotlik ezen a lemezen, ellenőrzi-e vagy sem LCD_LIB_H állandó meghatározása. Ha nincs megadva, ez fogja meghatározni a (#define LCD_LIB_H), és tartalmazni fogja a fájl tartalmát lcd_lib.h. Nos, ha az állandó meghatározása, akkor nem lehet bekapcsolni.


Most van egy olyan készítmény, és meg kell, hogy töltse ki a tartalmát.

lcd_lib.h - ez header fájlt, az interfész része a könyvtár. lcd_lib.c - végrehajtás fájlt. Annak érdekében, hogy tisztább, adok egy példát TV. Ő is egy interfész és a végrehajtás. Interface - a gombok a testén, amivel lehet bekapcsolni, beállítani és kiválaszthatja a csatornát. Megvalósítás - egy sor áramköri lapok, alkatrészek és kapcsolatait, amely a TV működését. Szeretem a végfelhasználó nem érdekel, hogy mi van benne, a lényeg, hogy ő vitte el funkciókat. Ezért az interfész a TV nem tartalmazhat végrehajtásának részleteit. Ugyanez vonatkozik a header fájlokat.

#include
#include

// port, amely kapcsolódik az LCD adatbusz
#define PORT_DATA PORTD
#define PIN_DATA PIND
#define DDRX_DATA DDRD

// port van kötve, amelyek szabályozzák az LCD következtetések
#define PORT_SIG PORTB
#define PIN_SIG PINB
#define DDRX_SIG DDRB

// Nem terminálok, amelyek kapcsolódnak az LCD vezérlő terminálok
#define RS 5
#define RW 6
#define HU 7

A makrók mikrokontroller órajel frekvenciája

#define F_CPU 8000000

void LCD_Init (void); // inicializálja port és LCD
void LCD_WriteData (unsigned char adatok); // vesz bájt adatot az LCD
void LCD_WriteCom (unsigned char adatok); // parancsot küld az LCD

Figyeljük meg azt átnevezte a nevét az összes funkciót. Ez az egyik a kódoló szabványoknak - felvenni a funkció nevét előtagként nevét a könyvtár fájl. Könyvtárunk hívják lcd_lib tehát, hogy a nevét, a függvények adunk LCD_. Ez az egyszerű szabály lehetővé teszi, hogy meghatározza, hogy milyen fájl tartalmazza a végrehajtását a funkciót.

Makrók dolgozó bitek és makrók programozásához késések

#define ClearBit (reg, bit) reg = (

(1<<(bit)))
#define SetBit (reg, bites) reg | = (1<<(bit))
#define _delay_us (US) __delay_cycles ((F_CPU / 1000000) * (US));
#define _delay_ms (ms) __delay_cycles ((F_CPU / 1000) * (ms));

Meghatározása minden funkcióját

// csapatok rögzítési funkció
void LCD_WriteCom (unsigned char adatok)
ClearBit (PORT_SIG, RS); // állítsa RS 0 - csapat
PORT_DATA = adatok; // kimeneti adatok a busz az indikátor
SetBit (PORT_SIG, EN); // set E 1
_delay_us (2);
ClearBit (PORT_SIG, EN); // set E 0 - a felvétel előtt
_delay_us (40);
>

// függvény adatok rögzítésére
void LCD_WriteData (unsigned char adatok)
SetBit (PORT_SIG, RS); // állítsa RS 1 - adatok
PORT_DATA = adatok; // kimeneti adatok a busz az indikátor
SetBit (PORT_SIG, EN); // set E 1
_delay_us (2);
ClearBit (PORT_SIG, EN); // set E 0 - a felvétel előtt
_delay_us (40);
>

// inicializálás funkció
void LCD_Init (void)
DDRX_DATA = 0xff;
PORT_DATA = 0xff;
DDRX_SIG = 0xff;
PORT_SIG | = (1< ClearBit (PORT_SIG, RW);

_delay_ms (40);
LCD_WriteCom (0x38); // 0b00111000 - 8 bites busszal 2
LCD_WriteCom (0xf); // 0b00001111 - kijelző, kurzor villogás benne
LCD_WriteCom (0x1); // 0b00000001 - kijelző tisztításához
_delay_ms (2);
LCD_WriteCom (0x6); // 0b00000110 - a kurzor jobbra, nincs váltás
>

Elvileg minden készen áll.
Mentsd mindkét fájlt.
Mi csatlakozni a könyvtár main.c. fájl

Vegye ki belőle minden felesleges. És adjuk hozzá a levezetése a „Test”.
Itt van, amit kellett volna.

#include
#include "lcd_lib.h"

Fordítsd projekt ... Én minden nélkül telt el hibákat. Remélem te is.

Nos, ez a szerkezet az új projekt.

képzés

ioavr.h és lcd_lib.h csatlakozik a fájl main.c kifejezetten (a program). A többi fejléc fájlok származott ioavr.h a fő fájl. Akkor átmászni, hogy megbizonyosodjon róla.

By lcd_lib.c összekötöttük lcd_lib.h, ioavr.h, intrinsics.h. A többi csatlakozott keresztül ioavr.h.

S.:
Ha a munka WINAVR, és a projekt keretében több fájl, a fordító kell adnia kézzel. Ez történik a Makefile - csak írja be a fájl nevét a résen.

# C lista forrásfájl itt. (C függőségek automatikusan létrejönnek.)
SRC = $ (TARGET) .c lcd_lib.c

Csak néztem main.c nem világos, honnan jött az egyik vagy másik * .c modult. * .h csatlakoztatva, a funkció prototípusok, és hol kell keresni a nagyon végrehajtás nem tisztázott. (Ha nem nézd meg a fa struktúra a bal oldalon, a IAR'e). Ez itt a kérdés. Miért nem írja alá fejléc után ProType funkciókat is

Magukban foglalják a fájl, nincs értelme main.c. Ez nem egy felosztás modulokat. Ha nem az első alkalommal használja a fejlesztői környezet, akkor tudni fogja, hogy hol keresse a végrehajtását a fájlokat. végrehajtási fájlokat jellemzően a projekt könyvtárban.

Használom AVRSTUDIO_5.1. Hasznosítsa SI után Asma. Nem értettem, hogyan kell megfogalmazni Pick lcd_lib.c fájlt. Írtam a projektben #include „lcd_lib.h”, hogy vegye fel a fájlt. A lcd_lib.c nem. Természetesen, ha a hívó függvény void LCD_Init (void); hibaüzenet jelenik meg, azt mondják, mi ez? lcd_lib.c fájlt egyszerűen tegye a könyvtárban a projekt. Tehát hogyan kell csinálni, így ez a fájl lcd_lib.c is volt a projekt?

Kapcsolódó cikkek