//----------------------------------------------------------------------
//                     LCD.C
//  Ce programme realise la fonction "print" sur un ecran LCD en
//    mode 8-bits d'une chaine de caractere (sur 1 ligne)
//                
//  Auteur: Zlati Lambov   
//----------------------------------------------------------------------                                           
#include <string.h>
//Ce fichier contient des declarations pour les registres du 68HC908GP32.
#include <iogp32.h>        
//Le fichier "pll_init.c" se trouve dans le paquet des fichiers du compilateur. 
#include "pll_init.c"

// definition des fonctions:
void delay_5ms(void);       // programmation d'un delay de 5 ms.
void enable_data(void);     // commande l'entree de validation de l'afficheur(E)
void initlcd(void);         // initialisation de l'ecran.
char printlcd(char *p);     // Affichage d'une chaine de caractere.

// ************************
// ** Fonction principal **
// ************************

 void main (void)
{
   CONFIG1=0x01;            //watchdog interdit.
   DDRA=0xff;               //PTA en sortie.
   DDRC=0xff;               //PTC en sortie.
   PTC=0x00;
   pll_init(2);             //determine la frequence du bus
                            //	1	32.768 kHz
						    //  2	2.4576 MHz
						    //  3	4.9152 MHz
						    //  4	7.3728 MHz
   initlcd();  						
   PTA=printlcd("1X16 CARACTERES");
                            //La chaine de caractere entre les parentheses
   while(1);                //est affichee sur l'ecran(16 symboles au maximum).
}
 
 
 void delay_5ms(void)       // 15*(255*3) =11475 Cycles
{                           // Dans le cas de 2.4576 MHz
                            // le delay est presque 5ms.
                            // __r0 est un "pseudo register"
                            // defini par le compilateur.

                            
 asm("\
      mov #15,*__r0    \n\
      psha             \n\
 del: lda #255         \n\
 decr:dbnza decr       \n\
      dbnz *__r0,del   \n\
      pula             \n\
	  ");
}
 
 void enable_data(void)
{
     PTC|=0x10;            // E=1;(PTC bit 4).
     PTC&=~0x10;           // E=0;
}
 
 void initlcd(void) 
{
 char init[7]={0x38 ,0x38, 0x38, 0x0C ,0x06 ,0x01};
 char i;
 PTC=0x00;                 // R/W=0;(0 = ecriture ,1 = lecture).
                           // RS=0; (0 = instruction ,1 = caractere).
 for(i=0;i<6;i++)          // 0x38-trois fois-mode 8 bits ,2 lignes validee.
  {                        // 0x0C-le curseur ne clignote pas.
 PTA=init[i];              
 enable_data();            // 0x06-l'affichage  hors fonction. 
 delay_5ms();              // 0x01-met le curseur en position "home",l'affichage 
  }                        // est remis a sa position d'origine.
 PTC|=0x04;                // RS=1(PTC bit 2)-operations avec des donnees.
}
   
  
 char printlcd(char *p)    // Pointeur vers la chaine de caractere à afficher.
{                        
 char i;
 char string[17];          //La taille est fixe à 17 pour avoir 16 caracteres 
 strcpy(string,p);         //plus le caractere nul de fin de chaine.
 for(i=0;i<string[i];i++)
   {                       //La chaine de caractere à afficher est copiee
   PTA=string[i];          //dans le tableau "string"et puis element par 
   enable_data();          //element vers l'afficheur(en utilisant PTA).
   delay_5ms();
    }
   return PTA;
}
 