Elektronikā ļoti bieži tiek izmantoti dažādi displeji, lai nodrošinātu iekārtu saziņu ar lietotājiem un informācijas izvades iespējas. Zemāk redzamajā elektriskajā principiālajā shēmā tiek izmantots ATmega328P sērijas mikrokontrolleris un 16x2 LCD, lai nodrošinātu teksta izvadi.
Vēl video ir parādīts tas, ka, izmantojot LCD, ir iespējams mainīt tā rindas, kamēr tiek veikta teksta izvade.
1.1.att. Testa elektriskā principiālā shēma
#define F_CPU 16000000UL // 16 MHz takts signals
#include<avr/io.h> // Tiek pievienotas nepieciesamas bibliotekas
#include<util/delay.h>
#include <avr/interrupt.h>
#include <string.h>
#define LCD_datu_ports PORTD // Ports D tiek definets ka LCD datu ports
#define LCD_vadiba PORTB //
Ports B tiek definets ka LCD vadibas ports
#define en PB2 //
Takts signals
#define rw PB1 //
Lasit/rakstit
#define rs PB0 //
Registra izvele
/*
------------------- -----------
| ATmega328 | | LCD |
| | | |
|
PD7|---------------->|D7
|
|
PD6|---------------->|D6
|
| PD5|---------------->|D5 |
|
PD4|---------------->|D4
|
|
PD3|---------------->|D3
|
|
PD2|---------------->|D2
| // 8 bitu rezims
|
PD1|---------------->|D1 |
|
PD0|---------------->|D0
|
| | | |
|
PB2|---------------->|E
|
| PB1| GND------>|RW |
| PB0|---------------->|RS |
------------------ ----------
*/
void LCD_cmd(unsigned char cmd);
// Funkciju prototipi
void LCD_inicializacija();
void LCD_izvade(unsigned char dati);
void LCD_teksta_izvade(unsigned char *str,int index,int pozicija);
void Izsledz_LCD();
int main()
{
char
masivs1[]="Peteris Bitans";
char
masivs2[]="VeA ELEKTRONIKA";
char
masivs3[]="LCD zina";
char
masivs4[]="8 bitu rezima";
char
masivs5[]="FOR un WHILE";
char
masivs6[]=" cikli";
char
masivs7[]=" PALDIES";
char
masivs8[]="PAR UZMANIBU!";
char
masivs9[]="BEIGAS";
char
masivs0[]="******";
int i, j, a=2, b=1, skaits=0;
DDRB=0x07;
// B porta jaunakie tris biti jeb PB0, PB1 un PB2 tiek iestatiti uz
izeju --> LCD vadibai
DDRD=0xff; // Viss D ports ka izeja --> LCD datiem
LCD_inicializacija(); //
Tiek veikta LCD inicializesana
_delay_ms(100); //
Aizture 100 ms
while(1)
{
for(i=0; i<16;
i++)
{
_delay_ms(50);
LCD_cmd(0x01); //
Tiek notirits LCD
_delay_ms(5);
LCD_teksta_izvade(masivs2,a,i);
LCD_teksta_izvade(masivs1,b,i); // Funkcija teksta izvadei uz
LCD
_delay_ms(5000); //
Aizture 100 ms
if(i==15)
{
skaits++;
}
}
if(skaits == 1)
{
j=0;
while(
masivs3[j] != '\0')
{
strcpy(masivs1,
masivs3);
j++;
}
j=0;
while(
masivs4[j] != '\0')
{
strcpy(masivs2,
masivs4);
j++;
}
}
if(skaits == 2)
{
j=0;
while(
masivs5[j] != '\0')
{
strcpy(masivs1,
masivs5);
j++;
}
j=0;
while(
masivs6[j] != '\0')
{
strcpy(masivs2, masivs6);
j++;
}
}
if(skaits == 3)
{
j=0;
while(
masivs7[j] != '\0')
{
strcpy(masivs1, masivs7);
j++;
}
j=0;
while(
masivs8[j] != '\0')
{
strcpy(masivs2,
masivs8);
j++;
}
}
if(skaits == 4)
{
j=0;
while(
masivs9[j] != '\0')
{
strcpy(masivs1, masivs9);
j++;
}
j=0;
while(
masivs0[j] != '\0')
{
strcpy(masivs2, masivs0);
j++;
}
}
if(skaits == 5)
{
Izsledz_LCD();
}
}
return 0;
}
void LCD_inicializacija()
{
_delay_ms(100);
LCD_cmd(0x30);
// LCD tiek izmantots 8 bitu rezima // Tiek inicializets
// LCD tiek izmantots 8 bitu rezima // Tiek inicializets
_delay_ms(10);
LCD_cmd(0x30);
_delay_ms(200);
LCD_cmd(0x30);
_delay_ms(200);
LCD_cmd(0x38);
// Izvelas 8 bitu rezimu
// Izvelas 8 bitu rezimu
_delay_ms(50);
LCD_cmd(0x08);
// Izsledz LCD
// Izsledz LCD
_delay_ms(80);
LCD_cmd(0x08);
// Izsledz LCD
// Izsledz LCD
_delay_ms(50);
LCD_cmd(0x01);
// Tiek notirits LCD
// Tiek notirits LCD
_delay_ms(5);
LCD_cmd(0x06);
// Entry mode
// Entry mode
_delay_ms(80);
LCD_cmd(0x0C);
// Iesledz displeju
// Iesledz displeju
_delay_ms(80);
LCD_cmd(0x80);
// 8 norada uz
pirmo liniju, bet 0 uz pirmo poziciju (nulles pozicija) --> 0x80
_delay_ms(50);
}
void Izsledz_LCD()
{
LCD_cmd(0x01);
// Tiek notirits LCD
// Tiek notirits LCD
_delay_ms(1);
LCD_cmd(0x08);
// Izsledz LCD
// Izsledz LCD
_delay_ms(1);
}
void LCD_cmd(unsigned char cmd)
{
LCD_datu_ports =
cmd;
LCD_vadiba =
(0<<rs)|(0<<rw)|(1<<en);
_delay_ms(1);
LCD_vadiba =
(0<<rs)|(0<<rw)|(0<<en);
_delay_ms(50);
}
void LCD_izvade(unsigned char dati)
{
LCD_datu_ports =
dati;
LCD_vadiba =
(1<<rs)|(0<<rw)|(1<<en);
_delay_ms(1);
LCD_vadiba =
(1<<rs)|(0<<rw)|(0<<en);
_delay_ms(50);
}
void LCD_teksta_izvade(unsigned char *str,int index, int pozicija)
// Saglaba un izvada tekstu, uz kuru norada string tipa norade
{
int i=0;
if(index ==
2)
{
LCD_cmd((0x80+pozicija)|0x40);
// 8 norada uz pirmo liniju, 4 norada uz to, ka tiks izvaditi lietotaja
izraudziti simboli, bet 0 uz pirmo poziciju (nulles pozicija) --> 0x80
_delay_ms(1);
// Ja indekss bus 2, tad LCD sapratis, ka jaizvada lietotaja izveidots
simbols
}
if(index ==
1)
{
LCD_cmd(0x80+pozicija);
// 8 norada uz pirmo liniju, bet 0 uz pirmo poziciju (nulles
pozicija) --> 0x80
_delay_ms(1);
}
while(str[i] !=
'\0')
// Dati tiek izvaditi tik ilgi, kamer nonak pie masiva beigam, kuras
nosaka ar '\0'
{
LCD_izvade(str[i]);
// Datu izvade uz LCD, izmantojot WHILE ciklu
i++;
}
}