
#include "lcd4x16.h"
extern unsigned char poz;
//------------------------- Ékezetes betűk ---------------------------------------------------------
const unsigned char betwk[] = {0x02,0x04,0x0E,0x01,0x0F,0x11,0x0F,0x00,    //á
0x02,0x04,0x0E,0x11,0x1F,0x10,0x0E,0x00,    //é
0x02,0x04,0x0C,0x04,0x04,0x04,0x0E,0x00,    //í
0x02,0x04,0x0E,0x11,0x11,0x11,0x0E,0x00,    //ó
0x02,0x04,0x11,0x11,0x11,0x13,0x0D,0x00,    //ú
0x0A,0x00,0x11,0x11,0x11,0x13,0x0D,0x00,    //ü
0x05,0x0A,0x11,0x11,0x11,0x13,0x0D,0x00,    //ű
0x05,0x0A,0x0E,0x11,0x11,0x11,0x0E,0x00};   //ő

const unsigned char nyil[] = {0x18, 0x1c, 0x16, 0x13, 0x13, 0x16, 0x1c, 0x18};   // nyíl

//------------------------ Lcd command -------------------------------------------------------------
void lcdcmd(unsigned char Data){
  RS = 0;
  EN = 0;
  P1OUT &= 0xF0;
  P1OUT |= ((Data >> 4) & 0x0F);
  EN = 1;
  waitlcd(2);
  EN = 0;
  P1OUT &= 0xF0;
  P1OUT  |= (Data & 0x0F);
  EN = 1;
  waitlcd(2);
  EN = 0;
}
//----------------------- Lcd adat -----------------------------------------------------------------
void lcdData(unsigned char l){
  RS = 1;
  EN = 0;
  P1OUT &= 0xF0;
  P1OUT |=((l >> 4) & 0x0F);
  EN = 1;
  waitlcd(2);          // várunk
  EN = 0;
  P1OUT &=  0xF0;
  P1OUT  |= (l & 0x0F);
  EN = 1;
  waitlcd(2);          // várunk
  EN = 0;
}
//---------------------- Lcd inicializálás ---------------------------------------------------------
void lcdinit(void){
  P2SEL = 0;
  RS = 0;
  RS_DIR = 1;
  EN = 0;
  EN_DIR = 1;
  RS = 0;
  EN = 0;
  P1OUT |= 0x3;
  waitlcd(40);                  // várunk
  EN = 1;
  __delay_cycles(500);          // várunk
  EN = 0;
  waitlcd(5);                   // várunk
  EN = 1;
  __delay_cycles(500);          // várunk
  EN = 0;
  waitlcd(5);                   // várunk
  EN = 1;
  __delay_cycles(500);          // várunk
  EN = 0;
  waitlcd(2);                   // várunk
  P1OUT &= 0xF2;
  EN = 1;
  __delay_cycles(500);          // várunk
  EN = 0;
  waitlcd(5);                   // várunk
  lcdcmd(0x28);          // display mód beállítás
  waitlcd(250);                 // várunk
  lcdcmd(0x0C);          // display be, cursor, és villogás ki
  waitlcd(250);                 // várunk
  lcdcmd(0x01);          // képernyőtörlés
  waitlcd(250);                 // várunk
}
//--------------------- Lcd késleltetés ------------------------------------------------------------
void waitlcd(volatile unsigned int x){
  volatile unsigned int i;
  for (x ;x>1;x--){
    for (i=0;i<=110;i++);
    }
  }
//--------------------- Lcd-re szöveg írás ---------------------------------------------------------
void print(char *s){
  while (*s){  
    lcdData(*s);
    s++;
  }
}
//--------------------- Lcd sorváltás --------------------------------------------------------------
void sor(unsigned char a){
  if(a==1){
    a=0x80;
    poz=1;
  }
  if(a==2){
    a=0xc0;
    poz=2;
  }
  if(a==3){
    a=0x90;
    poz=3;
  }
  if(a==4){
    a=0xd0;
    poz=4;
  }
  lcdcmd(a);
}
//--------------------- Lcd képernyő törlés --------------------------------------------------------
void lcdclear(void){
  lcdcmd(tor);
  waitlcd(5);
}
//--------------------- Lcd értékek kiírása max 100 ------------------------------------------------
void ertek_lcd(int integer ){
//  unsigned char thousands,hundreds,tens,ones;
//  thousands = integer / 1000;
//  lcdData(thousands + 0x30);
//  hundreds = ((integer - thousands*1000)-1) / 100;
  unsigned char hundreds,tens,ones;
  hundreds = integer / 100;
  lcdData( hundreds + 0x30);
  tens=(integer%100)/10;
  lcdData( tens + 0x30);
  ones=integer%10;
  lcdData( ones + 0x30);
}
//--------------------- Lcd ékezetes betük kiírása -------------------------------------------------
void lcd_putc(unsigned char data) {
         char c;
         if (c=data) {
           switch(c) {
             case 'á':  c = 0x00; break;
             case 'é':  c = 0x01; break;
             case 'í':  c = 0x02; break;
             case 'ó':  c = 0x03; break;
             case 'ú':  c = 0x04; break;
             case 'ü':  c = 0x05; break;
             case 'ű':  c = 0x06; break;
             case 'ő':  c = 0x07; break;
             case 'ö':  c = 0xEF; break;
           }
           lcdData(c);
         }
}
//-------------------- Lcd cgram feltöltése ékezetes betükkel --------------------------------------
void lcd_cgram_init(void) {
  unsigned char i;
         lcdcmd(0x40);                   // kurzor a CGRAM elejére
         for(i=0; i<64; i++) {
           lcdData(betwk[i]);            // karakterek feltöltése
         }                               // ékezetes karakterekkel
         lcdcmd(0x80);                   // kurzor a DDRAM elejére
}
void lcd_menu_nyil(char sr) {
  unsigned char i;
         lcdcmd(0x68);                  // kurzor a CGRAM elejére
         for(i=0; i<8; i++) {
           lcdData(nyil[i]);            // karakterek feltöltése
         }                              // ékezetes karakterekkel
         sor(sr);                       // kurzor a DDRAM elejére
         waitlcd(1);
         lcdData(0x05);
}