
//*****************************************************
//Mohos Pál********************************************
#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>
#include <avr/interrupt.h>
 
//*************Makrtó definíciók***********************
#define t(x)  (_delay_ms((x)))
#define tu(x) (_delay_us((x)))
#define swap(c) (((c & 0xf0) >> 4) | ((c & 0x0f) << 4));
#define E0    (PORTF=(PORTF & 0b11110111)) //beírójel E pin=0
#define RW0   (PORTF=(PORTF & 0b11111011)) //Írás RW pin=0
#define RS0   (PORTF=(PORTF & 0b11111101)) //IR parancsregiszter kijelölése. RS pin=0
#define E1    (PORTF=(PORTF | 0b00001000)) //beírójel=1
#define RW1   (PORTF=(PORTF | 0b00000100)) //Olvasás
#define RS1   (PORTF=(PORTF | 0b00000010)) //DR adatregiszer kijelölése
#define IRW RS0;RW0;E0;                    //parancsregiszter írás vezérlojelek
#define DRW RS1;RW0;E0;                    //adartregiszer írás vezérlojelek
 
//*************Parancs konstansok**********************
#define FINIC 0x30
#define FUNKC 0x28
#define CLR      1
#define HOME     2
#define ENTRY    6
#define BEKAPCS 15
#define CURKI 0x0C
#define CURJOBBRA 0x24
#define BTOL  0x18
 
#define EGY   0x80 //LCD 1. sor címe
#define KETTO 0xC0 //LCD 2. sor címe
#define HAROM 0x90 //LCD 3. sor címe
#define NEGY  0xD0 //LCD 4. sor címe
 
//**************Idozítés konstansok********************
#define TN 3  //millisec idozítés
#define TK 3  //mikorsec idozítés (nem ismert az LCD vez. órajel frekije)
 
//**************Globális változók*********************
typedef unsigned char u8;
//         0123456789ABCDEF0123456789ABCDEF01234567|123456789ABCDEF
u8 i, s[]="   MOHOS PAL         Minta               2011. Nov. 20";
 
//**************Saját függvények***********************
 
//**************Beíró pulzus***************************
void wr()
      { t(TN);
        E1;            //Írás elokészítés EN=1
        tu(TK);
        E0;            //Beírás IR-be lefutó élre. PORTF3= 1-->0;
        tu(TK);
       
      }
 
//******IR vagy DR regiszter írása 4 bites üzemmódban**
void lcd(u8 x)
      { PORTE= (PORTE & 0x0F)| (x & 0xF0);
        wr(); //felso 4 bit írása       
        PORTE= (PORTE & 0x0F)|((x&15)<<4);
        wr(); //alsó 4 bit ki.
    }
 
//**************FOPROGRAM******************************
int main()
 
//************PORTIRÁNY********************************
      {DDRE=0xF0;  DDRF=0x0E; //-F3=E él beír; F2=RW=olvas -F2=ír  -F1=RS=parancs F1=ada
 
//************NÉGYBITES ADATÁTVITEL BEÁLLÍTÁSA*********
       IRW;                   //RW0;RS0;E0;  Parancsregiszterbe (IR) író jelek
             PORTE= (PORTE & 0x0F)| (FINIC & 0xF0); //Felso 4 bit módosítás
             wr(); //8 bitesre állás E=_-____
             wr(); //8 bitesre állás           //ha a kezdet 4 bites volt...
             PORTE= (PORTE & 0x0F)| (0X20 & 0xF0); wr();  // 4 bitesre állás
                  
//************LCD vezérlo alapbeállításai*************** 
             lcd(FUNKC);
             lcd(CLR);                   
             lcd(HOME);
             lcd(ENTRY);
//             lcd(BEKAPCS);
             lcd(CURKI);
//             lcd(CURJOBBRA);
             lcd(EGY);     
 
//************Szöveg megjelenítésa*********************             
       DRW;                         // DR adatregiszterbe írás
	   		 lcd('0');
	   		 lcd('1');
	   		 lcd('2');
	   		 lcd('3');
	   		 lcd('4');
//             i=0; while(s[i]) lcd(s[i++]); // string ki a displayre
 
//*************Szöveg mozgatása Eltolása***************
      // IRW;                         // parancs (IR) regiszterbe írás
      //       for(i=1;i<81;i++)
      //      //            {t(800);lcd(BTOL);}    //Szöveget balra tolja
      //            {t(800);lcd(BTOL);}    //Szöveget balra tolja
    
       while(1);  
       return 0;
}
