#include <16F877A.h>
//#include <18F452.h>

#device ICD=TRUE
#device adc=8
#fuses NOWDT,XT, NOPROTECT, NOBROWNOUT, NOPUT, NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7)

#include <2404.C>
#include "lcd.c"	// LCD-Routinen mit angepasster Pin Belegung


// ----- nicht verwendete auskommentieren
//#define Segment7
#define LCDAnzeige
#define EEPROM
#define Analog
#define LED8
#define RS232


byte segzae = 1;
byte zaesek = 0;
int8 wert1, wert2, wert3, wert4;
int16  time = 0;
int16 i=0;
char t=1;
int16 value;


#INT_TIMER2                               // naechste Fkt ist T0-Int
void TIMER2_isr()
{
#ifdef Segment7
  zaesek++;                              // Durchlaufzaehler --
  wert4 = 4;
  wert3 = 3;                    // 1. Segment
  wert2 = 2;              // 2. Segment
  wert1 = 1;                     // 3. Segment

  if(segzae == 1)
  {  segzae++;                         // Zaehler wieder auf 1 setzen
     output_d(wert1 << 4 | 0b00000001);
  }
  else if(segzae == 2)                        // jedes Segment fuer 5ms ansteuern
  {  segzae++;                           // Segmentzaehler erhöhen
     output_d(wert2 << 4 | 0b00000010);    // Wert ausgeben,
  }
  else if(segzae == 3)
  {  segzae++;
     output_d(wert3 << 4 | 0b00000100);
  }
  else if(segzae == 4)
  {  segzae = 1;                         // Zaehler wieder auf 1 setzen
     output_d(wert4 << 4 | 0b00001000);
  }

  if(zaesek == 200)   // Jede volle Sek
  {  time++;                            // Zeit - 1
     if(time == 999)
       time  = 0;                  // den Zeitzaehler neu setzen
     zaesek =0;                      // Sekundenzaehler neu einstellen
  }
#endif

}

void main()
{  char i;
   int d;

   setup_adc_ports(RA0_ANALOG);
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   //setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL | RTCC_DIV_32);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DIV_BY_16, 20, 15);
   enable_interrupts(INT_TIMER2);
   enable_interrupts(global);

   #ifdef eeprom
   init_ext_eeprom();
   #endif

   #ifdef LCDAnzeige
   lcd_init();
   lcd_gotoxy(1,1);
   lcd_putc("Komponententests");
   lcd_gotoxy(1,2);
   lcd_putc("0123456789012345");
   lcd.licht=1;
   delay_ms(1000);
   lcd.licht=0;
   lcd_gotoxy(1,2);
   lcd_putc("                ");
   #endif

   while(1)
   {

      for (i = 0; i < 8; i++)
      {
         #ifdef Analog
         set_adc_channel(0);
         value =read_adc();
         #endif

         #ifdef LCDAnzeige
         lcd_gotoxy(1,2);
         printf(lcd_putc,"A/D-Wert: %X",value );
         lcd_gotoxy(21,1);
         printf(lcd_putc,"Write EE: %X", i );
         #endif

         delay_ms(100);

         #ifdef eeprom
         write_ext_eeprom(i, i);        // adr/data
         d = read_ext_eeprom(i);
         #endif

         #ifdef LCDAnzeige
         lcd_gotoxy(21,2);
         printf(lcd_putc," Read EE: %X", d );
         #endif

         #ifdef LED8
         rotate_left( &t, 1);
         output_b(t);
         #endif

         #ifdef RS232
         printf("Hallo, ich bin da!!!\n\r");
         #endif

         delay_ms(500);
      }
   }
}

