180 likes | 296 Views
Az LCD kijelző programozása. Az ismeretszerzés menete. 2X16 karakter Lábkiosztás: Interface Pin Function. Mikroprocesszor. A data lábakon ami megjelenik az adat? Vagy utasítás? Adat jön: RS High, azaz logikai 1 Utasítás jön: RS Low, azaz logikai 0 Hogyan jeleníti meg a karaktereket:
E N D
2X16 karakter Lábkiosztás: Interface Pin Function
A data lábakon ami megjelenik az adat? Vagy utasítás? Adat jön: RS High, azaz logikai 1 Utasítás jön: RS Low, azaz logikai 0 Hogyan jeleníti meg a karaktereket: 2X16 bd karakter: ennyi memóriacím a DisplayDataRAM-ban. Képernyő memória. AC regiszter: A DDRAM egy címére mutat. Pld: bal felső karakter kezdőcíme: 00 Baloldali szomszéd: 01 (látszik, hogy egy karakter 8 bitből van felépítve.) Alsó sor kezdete balról: 40, jobb alsó sarok 4F Hogyan lesz a 8 bites kódból karakter? CGROM – beépített karakterek CGRAM - átprogramozható
Ha adat érkezik (RS bit H vagy L) és R/W akkor az adat a DDRAM megfelelő helyére (ahol a kurzor éppen áll) kerül és az adatnak megfelelő karakter megjelenik. Ha utasítás érkezik akkor valami történik a kurzorral, a képernyővel stb.
A próbapanel kapcsolási rajzán megnézzük, hol az LCD A föld és a logikai áramköröknek az 5V be van kötve, elvileg. Az A i/O porthoz van kötve az LCD. R/W földelve van. Csak írhatunk az LCD-re. PA0 és PA1 a vezérlő bitek, PA2,3,4,5 a 4 bites adatátvitelre használható. Egy karaktert (8 bit) két részletben kell küldeni. PA 6,7 nem használt. Van egy poti ami a fényerőt szabályozza, (PT1) de lehet, hogy jumperelni kell.
/***************************************************************************//***************************************************************************/ /* */ /* LCD kijelzo kezelo fuggvenyei */ /* */ /***************************************************************************/ /* PA0 - az LCD kijelzo RS (Reset / Torlo) laba (4 lab) */ /* Fold - R/~W (Read / ~Write) csak irni tudunk az LCD kijelzobe(5 lab) */ /* PA1 - E (Enable / Engedelyezo) lab (6 lab) */ /* PA2-PA5 - az LCD kijelzo DB4-DB7 adatbemenetei */ /***************************************************************************/ #include <avr/io.h> #include <util/delay.h> #include "lcd.h" /* #define RS PA0 //Az LCD kijelzo RS jelenek az azonositoja #define EN PA1 //Az LCD kijelzo E jelenek az azonositoja #define TIME 5 //Alapkesleltetes az MCU (1 * 8) MHz-es orajelnel */
/*-----------------Az LCD kijelzo adatbeirasanak fuggvenye-----------------*/ void lcd4_dat(unsigned char p) //"p" az adat byte-ja { PORTA |= _BV(RS) | _BV(EN); //RS = EN = 1 jel PORTA &= 0xC3; //A 8 bites adat felso nibble-jenek kiadasa a DB4-DB7 adatsinre PORTA |= ((p & 0xF0) >> 2); _delay_ms(TIME / 2); //Az EN jel idotartartamanak megadasa PORTA &= ~_BV(EN); //EN = 0. Az LCD kijelzo-utasitas beirasanak frontja _delay_ms(5 * TIME / 2); //A kijelzo-utasitas vegrehajtasi idonek megadasa PORTA |= _BV(EN); //EN = 1 jel PORTA &= 0xC3; //A 8 bites adat also nibble-jenek kiadasa a DB4-DB7 adatsinre PORTA |= ((p & 0x0F) << 2); _delay_ms(TIME / 2); //Az EN jel idotartartamanak megadasa PORTA &= ~_BV(EN); //EN = 0. Az LCD kijelzo-utasitas beirasanak frontja _delay_ms(5 * TIME / 2); //A kijelzo-utasitas vegrehajtasi idonek megadasa } //Az "lcd4_dat" fuggveny vege
/*----------------Az LCD kijelzo utasitasbeirasanak fuggvenye--------------*/ void lcd4_com(unsigned char p) //"p" az utasitas byte-ja { PORTA &= ~_BV(RS); //RS = 0 jel PORTA |= _BV(EN); //EN = 1 jel PORTA &= 0xC2; //A 8 bites LCD kijelzo-utasitas felso nibble-jenek kiadasa a //DB4-DB7 adatsinre PORTA |= ((p & 0xF0) >> 2); _delay_ms(TIME); //Az EN jel idotartartamanak megadasa PORTA &= ~_BV(EN); //EN = 0. Az LCD kijelzo-utasitas beirasanak frontja _delay_ms(5 * TIME); //A kijelzo-utasitas vegrehajtasi idonek megadasa PORTA |= _BV(EN); //EN = 1 jel PORTA &= 0xC2; //A 8 bites LCD kijelzo-utasitas also nibble-jenek kiadasa a //DB4-DB7 adatsinre PORTA |= ((p & 0x0F) << 2); _delay_ms(TIME); //Az EN jel idotartartamanak megadasa PORTA &= ~_BV(EN); //EN = 0. Az LCD kijelzo-utasitas beirasanak frontja _delay_ms(5 * TIME); //A kijelzo-utasitas vegrehajtasi idonek megadasa } //Az "lcd4_com" fuggveny vege
/*---------------------------Az LCD kijelzo inicializalasa----------------*/ void lcd4_init(void) //4 bites uzemmod, villogo kurzor { lcd4_com(0x33); //Elokeszites _delay_ms(10 * TIME); lcd4_com(0x32); //4 bit, 2 sor lcd4_com(0x28); lcd4_com(0x08); //Az LCD kijelzo teljes kikapcsolasa lcd4_com(0x01); //Az LCD kijelzo torlese _delay_ms(10 * TIME); lcd4_com(0x06); //A kurzor eltolasa jobbra lcd4_com(0x0D); //Az LCD kijelzo bekapcsolasa, villogo kurzor } //Az "lcd4_init" fuggveny vege
MintaprojektAz lcd.c kerüljön a makefile SRC sorába! #include <avr/io.h> //Az I/O konyvtar #include <util/delay.h> //A kesleltetes-beallitas konyvtar #include <avr/sleep.h> #include "lcd.h"
int main(void) //A foprogram kezdete { DDRA = 0xFF; //A PORT A kimenet PORTA = 0xC0; //A PORT A (PA0-PA5) kimeneteit 0-ra allitjuk, a (PA6-PA7) - 1-re lcd4_init(); //Az LCD kijelzo inicializalasa (4 bit, 2 sor) //A szoveg kezdete lcd4_dat('H'); lcd4_dat('e'); lcd4_dat('l'); lcd4_dat('l'); lcd4_dat('o'); lcd4_dat(','); lcd4_dat(' '); lcd4_dat('v'); lcd4_dat('i'); lcd4_dat('l'); lcd4_dat('a'); lcd4_dat('g'); lcd4_dat('!'); //A szoveg vege lcd4_com(0xC0); //Beiras az LCD kijelzo masodik soraba lcd4_dat('H'); lcd4_dat('e'); lcd4_dat('l'); lcd4_dat('l'); lcd4_dat('o'); lcd4_dat(','); lcd4_dat(' '); lcd4_dat('v'); lcd4_dat('i'); lcd4_dat('l'); lcd4_dat('a'); lcd4_dat('g'); lcd4_dat('!'); sleep_cpu(); //A MPU "elaltatasa" return(0); //A "main" program sikeres befejezese }
Feladatok: • Mozgassunk egy karaktert az LCD-n. • Az lcd-n írjuk ki, ha a futófény balra vagy jobbra megy.