/*************************************************************************
Title:    testing output to a HD44780 based LCD display.
Author:   Peter Fleury  <pfleury@gmx.ch>  http://jump.to/fleury
File:     $Id: test_lcd.c,v 1.6 2004/12/10 13:53:59 peter Exp $
Software: AVR-GCC 3.3
Hardware: HD44780 compatible LCD text display
          ATS90S8515/ATmega if memory-mapped LCD interface is used
          any AVR with 7 free I/O pins if 4-bit IO port mode is used
**************************************************************************/
#include <stdlib.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include "lcd.h"
unsigned int uart_putc(unsigned char c)
{
  while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
  {
  }
 
  UDR = c;                      /* sende Zeichen */
  return 0;
}

//---------------------------------------------------------------------------
int sendx(void)
{
  while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
  {
  }
 
  UDR = 'x';                      /* sende Zeichen */
}
int senda(void)
{
  while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
  {
  }
 
  UDR = 'a';                      /* sende Zeichen */
}

//---------------------------------------------------------------------------

void uart_puts (unsigned char *s)
{
  while (*s)
  {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
    uart_putc(*s);
    s++;
  }
}
//-------------------------------------------------------------------------------
unsigned int wandle(unsigned int y)
{
unsigned char Buffer[20];
  unsigned int i = y;

  sprintf( Buffer, "%u", i );

  uart_puts( Buffer );

}

/*
** constant definitions
*/
static const PROGMEM unsigned char copyRightChar[] =
{
	0x07, 0x08, 0x13, 0x14, 0x14, 0x13, 0x08, 0x07,
	0x00, 0x10, 0x08, 0x08, 0x08, 0x08, 0x10, 0x00
};


/*
** function prototypes
*/ 
void wait_until_key_pressed(void);


void wait_until_key_pressed(void)
{
    unsigned char temp1, temp2;
    unsigned int i;
    
    do {
        temp1 = PIND;                  // read input
        for(i=0;i<65535;i++);
        temp2 = PIND;                  // read input
        temp1 = (temp1 & temp2);       // debounce input
    } while ( temp1 & _BV(PIND2) );
    
    loop_until_bit_is_set(PIND,PIND2);            /* wait until key is released */
}







int main(void)
{
    char buffer[7];
    int  num=134;
    
    
    
    DDRD &=~ (1 << PD2);        /* Pin PD2 input              */
    PORTD |= (1 << PD2);        /* Pin PD2 pull-up enabled    */


    /* initialize display, cursor off */
    lcd_init(LCD_DISP_ON);

     unsigned int overflow = 0;
  	unsigned int ubergabe[40] = {0};
	unsigned int reg[40] = {0};
	unsigned int Sicherheitsloop = 0;
	unsigned short iZaehl = 0;
	unsigned char i = 0;
	unsigned short AnzahlDurchlaufe = 0;
	
	DDRD =0xFF; 												//UART
	DDRB =0x00; 												//Lichtschranken
	DDRA =0xFF;												//Port für LCD
	DDRC =0x00; 												//Port für div. Steuer-Taster


	PORTA = 0x00;


	//TCCR0 |=  (1<<CS00)|(1<<CS02);							//Prescaler für Timer auf 1024					

	UCSRB |= (1<<TXEN);              							//Senden aktivieren
	UCSRC |= (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);  

	UBRRH = 00;                      							//Baudrate einstellen 9600 bei 8 MHz
	UBRRL = 51;

	       
         
        lcd_clrscr();											//Display löschen
        lcd_puts("Mit SCROLLtaster\nDurchlauf wahlen");							//Ausgangstext auf dem Display
       	                                           //Steuerbefehl an das Display senden


	for(;;)
	{
		
		if (PINC==0xFE)											//wenn Scroll-Taster gedrückt...
		{
			lcd_clrscr();
			lcd_puts("jetz!");			                //erhöhe AnzahlDurchlaufe auf EINS
		}		
			
	}}
/*		}
	if (TIFR &(1<<TOV0)) 									//wenn generell Überlauf, erhöhe Variable "uberlauf" um eins
  		{
  			overflow++;
  			TIFR = 1<<TOV0;
  		}

 	  	switch(PINB)
	  	{
        
            case 0xFE:
				TCCR0 |=  (1<<CS00)|(1<<CS02);	             	//Timer starten                  
    			reg[0]=TCNT0;
    			ubergabe[0]=overflow;
			break;



			case 0xFD:
				reg[1]=TCNT0;
                ubergabe[1]=overflow;
			break;



			case 0xFB:
				reg[2]=TCNT0;
				ubergabe[2]=overflow;
			break;



			case 0xF7:
				reg[3]=TCNT0;
				ubergabe[3]=overflow;
			break;



			case 0xEF:
				reg[4]=TCNT0;
				ubergabe[4]=overflow;
			break;



			case 0xDF:
				reg[5]=TCNT0;
				ubergabe[5]=overflow;
			break;
			
			
				
			case 0xBF:
				reg[6]=TCNT0;
				ubergabe[6]=overflow;
			break;



			case 0x7F:
				reg[7]=TCNT0;
				ubergabe[7]=overflow;
			break;
	
		}															//Ab hier Sendevorgang über RS232

	if (PINC==0xFE)													//wenn Send-Taster gedrückt...
	{
		senda();													//schicke "a"...
		
		for(Sicherheitsloop=0;Sicherheitsloop<50;Sicherheitsloop++) //Schickt das Ganze 50x an das VB-Programm (aus Sicherheitsgründen)
		{
			for(iZaehl=0; iZaehl <= 7; iZaehl++)                    //schickt die einzelnen Reg./Überlauf-Einträge an das VB-Programm
			{
				wandle(reg[iZaehl+AnzahlDurchlaufe]);
				sendx();
				wandle(ubergabe[iZaehl+AnzahlDurchlaufe]);
			}
		  TCCR0=0;													//Timer-Reg. auf NULL
		}	


	

}
}}

