
#include "mcf5213.h"

void init_pto_AN(void);
void init_uart_0(void);
static void init_clock_config (void);
void envia_letra(unsigned char letra);
void enviar_char(void);
void time_1s(void);
void time5s(void);
void time_5ms(void);
void time_100us(void);
void time_1us(void);
void act_data_lcd(void);
void act_ctrl_lcd(void);
void clock_E_lcd(void); 
void iniciar_lcd(void); 
void cursor_inicio(void);
void parpadea_cursor(void);
void apagar_cursor(void);
void clrscr(void);
void desplaza_izq(void);


 int main (void) {
		init_pto_AN();
		init_clock_config();
	 	iniciar_lcd();

		clrscr();	
		cursor_inicio();
		parpadea_cursor();

		enviar_char();	
		return 0;
	}

void init_pto_AN(void)
	{		
		MCF_GPIO_PANPAR=0x00;	  				// funcion 1 GPIO
		MCF_GPIO_DDRAN=0xff;   					// direccion:  salida
		MCF_GPIO_PORTAN &= ~MCF_GPIO_CLRAN_CLRAN6;	// desactiva LCD
	}


static void init_clock_config (void)
{
    // Clock source is 7.3728 MHz external crystal
    // Clock mode: Normal PLL mode
    // Processor/Bus clock frequency = 9.22 MHz
    // Loss of clock detection disabled
    // Reset on loss of lock disabled

 	MCF_CLOCK_SYNCR = 0x3403;                    
    	while ((MCF_CLOCK_SYNSR & 0x08) == 0)         
    	MCF_CLOCK_SYNCR = 0x3303;                     
    	while ((MCF_CLOCK_SYNSR & 0x08) == 0)         
    	MCF_CLOCK_SYNCR = 0x3307;                    

}

void envia_letra(unsigned char letra)
	{
		unsigned char aux;

		act_data_lcd();				// Activa la senal de datos
		
		aux = letra;				// se guarda el dato en una variable AUX
		aux >>= 4;					// corrimiento de 4 bit a la derecha
		aux &= 0x0f;				// se pone en cero los 4 MSB

		MCF_GPIO_PORTAN	&= 0xf0;		// se pone en 0 los 4 LSB del puerto AN
		MCF_GPIO_PORTAN |= aux;			// PARTE ALTA bus de 4 bits
		clock_E_lcd();		
		
		aux =  0x0f;				// se pone en 0 los 4 MSB de AUX
		aux &= letra;				// se pone en 0 los 4 MSB de LETRA
	

		MCF_GPIO_PORTAN	&= 0xf0;		
		MCF_GPIO_PORTAN |= aux;			// PARTE BAJA bus de 4 bits
		clock_E_lcd();	
	}


void enviar_char(void)   
	{
		unsigned char ascii; 		
		while (1)
			{	
				ascii=48;
				while	 (ascii < 123)
	       		{		       		
	       	    		envia_letra(ascii);						  
					ascii++;     
					time_1s();	       
				}
			}
	}

void time_1s(void)
	{
       	unsigned long  contador;	  
     
     	  	contador=0;       
      	while (contador < 766400) // 1 SEGUNDO
			{
              		contador++;
       		}       
	}

void time5s(void)
	{
       	time_1s();
		time_1s();
		time_1s();
		time_1s();
		time_1s();
	}


void time_5ms(void)
	{
       	unsigned long  contador;	  
     
     	  	contador=0;       
      	while (contador < 7800)  
			{
              		contador++;
       		}       
	}


void time_100us(void)
	{
       	unsigned long  contador;	  
     
     	  	contador=0;       
      	while (contador < 300)  
			{
              		contador++;
       		}       
	}

void time_1us(void)
	{
       	unsigned long  contador;	  
     
     	  	contador=0;       
      	while (contador < 40)  
			{
              		contador++;
       		}       
	}


void act_data_lcd(void) 

	{		
	MCF_GPIO_PORTAN |= MCF_GPIO_SETAN_SETAN4;  //RS=1
	MCF_GPIO_PORTAN &=~MCF_GPIO_CLRAN_CLRAN5;	//RW=0
	}


void act_ctrl_lcd(void) 
	{	
 	MCF_GPIO_PORTAN &=~MCF_GPIO_CLRAN_CLRAN4;	//RS=0
	MCF_GPIO_PORTAN &=~MCF_GPIO_CLRAN_CLRAN5;	//RW=0	
	}


void clock_E_lcd(void) 
	{
				
		MCF_GPIO_PORTAN |=MCF_GPIO_SETAN_SETAN6;
	     	time_1us();       		
       
  		MCF_GPIO_PORTAN &=~MCF_GPIO_CLRAN_CLRAN6;
	      time_1us();  
		
	}


void iniciar_lcd(void) 
	{

		act_ctrl_lcd();		// activo senal de control
	
		MCF_GPIO_PORTAN	&= 0xf0;		
		MCF_GPIO_PORTAN |= 0x03;	
		clock_E_lcd();	

		time_5ms();
				
		MCF_GPIO_PORTAN	&= 0xf0;
		MCF_GPIO_PORTAN |= 0x03;
		clock_E_lcd();

		time_100us();
			
		MCF_GPIO_PORTAN	&= 0xf0;
		MCF_GPIO_PORTAN |= 0x03;
		clock_E_lcd();

		time_100us();

/**************BUS DE 4 BITS***********************************/


		MCF_GPIO_PORTAN	&= 0xf0;		
		MCF_GPIO_PORTAN |= 0x02;		//PARTE ALTA bus de 4 bits
		clock_E_lcd();

		time_100us();

/**************BUS DE 4 BITS Y FONT 5x8 DOTS ******************/

		MCF_GPIO_PORTAN	&= 0xf0;		
		MCF_GPIO_PORTAN |= 0x02;		//PARTE ALTA bus de 4 bits
		clock_E_lcd();

		time_100us();
			
		MCF_GPIO_PORTAN	&= 0xf0;		
		MCF_GPIO_PORTAN |= 0x08;		//PARTE BAJA bus de 4 bits
		clock_E_lcd();	

/**************DISPLAY NO DESPLAZADO***************/
		
		MCF_GPIO_PORTAN	&= 0xf0;		//PARTE ALTA bus de 4 bits
		clock_E_lcd();

		MCF_GPIO_PORTAN	&= 0xf0;		
		MCF_GPIO_PORTAN |= 0x06;		//PARTE BAJA  bus de 4 bits
		clock_E_lcd();	
	}


void cursor_inicio(void)
	{
		act_ctrl_lcd();		// activo senal de control

		MCF_GPIO_PORTAN	&= 0xf0;		//PARTE ALTA bus de 4 bits
		clock_E_lcd();

		MCF_GPIO_PORTAN	&= 0xf0;		
		MCF_GPIO_PORTAN |= 0x02;		//PARTE BAJA  bus de 4 bitss
		clock_E_lcd();	

	}

void parpadea_cursor(void)
	{
		act_ctrl_lcd();		// activo senal de control

		MCF_GPIO_PORTAN	&= 0xf0;		//PARTE ALTA bus de 4 bits
		clock_E_lcd();

		MCF_GPIO_PORTAN	&= 0xf0;		
		MCF_GPIO_PORTAN |= 0x0f;		//PARTE BAJA  bus de 4 bitss
		clock_E_lcd();	

	}

void apagar_cursor(void)
	{
		act_ctrl_lcd();		// activo senal de control

		MCF_GPIO_PORTAN	&= 0xf0;		//PARTE ALTA bus de 4 bits
		clock_E_lcd();

		MCF_GPIO_PORTAN	&= 0xf0;		
		MCF_GPIO_PORTAN |= 0x0c;		//PARTE BAJA  bus de 4 bitsss
		clock_E_lcd();	

	}

void clrscr(void)	{		
		act_ctrl_lcd();		// activo senal de control
		MCF_GPIO_PORTAN	&= 0xf0;		//PARTE ALTA bus de 4 bits
		clock_E_lcd();

		MCF_GPIO_PORTAN	&= 0xf0;		
		MCF_GPIO_PORTAN |= 0x01;		//PARTE BAJA  bus de 4 bitssss
		clock_E_lcd();	

	}

void desplaza_izq(void)
	{
		act_ctrl_lcd();		// activo senal de control

		MCF_GPIO_PORTAN	&= 0xf0;		//PARTE ALTA bus de 4 bits
		MCF_GPIO_PORTAN |= 0x0;;
		clock_E_lcd();

		MCF_GPIO_PORTAN	&= 0xf0;		
		MCF_GPIO_PORTAN |= 0x08;		//PARTE BAJA  bus de 4 bitsss
		clock_E_lcd();	
		
	}	
