Teksta izvade uz 16x2 LCD

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
                _delay_ms(10);
                LCD_cmd(0x30);
                _delay_ms(200);
                LCD_cmd(0x30);
                _delay_ms(200);
                LCD_cmd(0x38);                                                                                                                                                                                                                          
                // Izvelas 8 bitu rezimu
                _delay_ms(50);
                LCD_cmd(0x08);                                                                                                                                                                              

                 // Izsledz LCD
                _delay_ms(80);
                LCD_cmd(0x08);                                                                                                                                                                                                                         
                // Izsledz LCD
                _delay_ms(50); 
                LCD_cmd(0x01);                                                                                                                                                                                                                          
                // Tiek notirits LCD
                _delay_ms(5);
                LCD_cmd(0x06);                                                                                                                                                                                                                          
               // Entry mode
                _delay_ms(80);
                LCD_cmd(0x0C);                                                                                                                                                                                                                          
              // 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 
                _delay_ms(1); 
                LCD_cmd(0x08);                                                                                                                                                                                                                          
             // 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++; 
    }
}




UZ SĀKUMU