/*
 * File:   Digitalanzeige.c
 * Author: Talla
 *
 * Created on 26. Januar 2017, 14:46
 */

#include <xc.h>
#include"Digitalanzeige.h"
#include <pic18f1320.h>
#include<stdio.h>
#include<stdlib.h>
#include<htc.h>
#include<string.h>

//unsigned char value[25];
unsigned char value_[5];
bit dir, sys;
unsigned int  zeit,md2,md3,a ;
unsigned char i,testbit,iw,na;
unsigned char  STELLE_MAP[7] = {0x05,0x09,0x07,0x00,0x02,0x04,0xFF};
unsigned char  SEGMENT_MAP[11] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xFF};


void  interrupt isr(void){
   GIE = 0;
   if (testbit){ 
        if (iw<17){
         md3 |= DATPIN << (iw-1);    
        }
        else{
        if (iw==21){
        dir = DATPIN;         // read bit  
        }            
        if (iw==23){
        __delay_us(175);
        sys = DATPIN;         // read bit  
        }    
          
        }
        iw++;    
    CCP1IF=0;
        if (iw>24){
        iw=0;
        testbit=0;
        md2 = (md3<<1); // Wertverdopplung
        //md2 = md3; //normal
       }
   }
   else{
      if (CCP1IF){
       TMR0=zeit; 
       CCP1IF=0;
      }//CCP1IF

      if (TMR0IF){
        testbit=1;
        md3=0;
        TMR0IF=0; 
      }//TMR0IF 
   }//testbit
   GIE = 1;  
}



void main(void) {
    
        IRCF0 = 1;
        IRCF1 = 1;
        IRCF2 = 1;
          
        while (! IOFS) {   
        }
        ADCON1      = 0b01111111;      // Enable AN0 - AN4 (VREF+- = VDD-VSS)
        TRISA       = 0b00100000;      // 
        PORTA       = 0b00000000;
        TRISB       = 0b00001100;      // 
        PORTB       = 0b00000000; 
        LATB4=1;  //DP 
        TMR3CS = 0;
        T3CKPS0 = 0;
        T3CKPS1 = 0; //11=1:8/01=1:4/10=1:2/00=1:1/
        T3CCP1 = 1;

        CCP1CON = 0b00000000; //CCP1-MODUS aus
        CCP1CON = 0b00000100; //falling
        T08BIT = 0;
        PSA=0;
        T0PS0 = 0;
        T0PS1 = 0;
        T0PS2 = 1;
        T0CS=0;
        TMR0=0;
        iw=0;
        testbit=0;
        CCP1IE=1;
        CCP1IF=0;
        TMR0IE=1;
        TMR0IF=0;
        PEIE=1;
        GIE=1;
        zeit=35535;
        //zeit=60000;
        TMR0ON=1;
        md2=0;
        md3=0; 
        //testbit=1;
    while(1){ 
        
             AUSGABE(md2);
    }//while
}//main

void AUSGABE( unsigned long int DATEN){
    unsigned char A,B;

    
       
    if (sys){
        
        DATEN=DATEN*1; // Wertverdopplung
        //DATEN=DATEN*10; //normal
        DATEN=DATEN>>1;
        for (i=0;i<5;i++){
        value_[i]=DATEN%10;
        if (i<4) {
        DATEN=(DATEN/10);    
        }
        } 
        
     LATB4=0;  //DP
     LATA2=1;
     LATB0=1;
     LATB1=1;
     LATA3=1;
     B=STELLE_MAP[3] ;  //The pattern to return
     LATB5=(B & (1<<0)) >>0;  //A
     LATA0=(B & (1<<1)) >>1;  //B
     LATA1=(B & (1<<2)) >>2;  //C
     LATA4=(B & (1<<3)) >>3;  //D 
     __delay_us(50);
     LATB4=1;  //DP
     //B=STELLE_MAP[6] ;  //The pattern to return
     LATB5=1;
     LATA0=1;
     LATA1=1;
     LATA4=1;
    
    
     LATA2=1;
     LATB0=1;
     LATB1=1;
     LATA3=1;
     B=STELLE_MAP[5] ;  //The pattern to return
     LATB5=(B & (1<<0)) >>0;  //A
     LATA0=(B & (1<<1)) >>1;  //B
     LATA1=(B & (1<<2)) >>2;  //C
     LATA4=(B & (1<<3)) >>3;  //D 
     __delay_us(50);
     LATB4=1;  //DP
     //B=STELLE_MAP[6] ;  //The pattern to return
     LATB5=1;
     LATA0=1;
     LATA1=1;
     LATA4=1;
        
        
        
    }
    else{
  
       
        for (i=0;i<5;i++){
        value_[i]=DATEN%10;
        if (i<4) {
        DATEN=(DATEN/10);    
        }
        } 
     LATB4=0;  //DP
     LATA2=1;
     LATB0=1;
     LATB1=1;
     LATA3=1;
     //B=STELLE_MAP[3] ;  //The pattern to return
     B=STELLE_MAP[2] ;  //The pattern to return
     LATB5=(B & (1<<0)) >>0;  //A
     LATA0=(B & (1<<1)) >>1;  //B
     LATA1=(B & (1<<2)) >>2;  //C
     LATA4=(B & (1<<3)) >>3;  //D 
     __delay_us(50);
     LATB4=1;  //DP
     //B=STELLE_MAP[6] ;  //The pattern to return
     LATB5=1;
     LATA0=1;
     LATA1=1;
     LATA4=1;
    
    
     LATA2=1;
     LATB0=1;
     LATB1=1;
     LATA3=1;
     B=STELLE_MAP[5] ;  //The pattern to return
     LATB5=(B & (1<<0)) >>0;  //A
     LATA0=(B & (1<<1)) >>1;  //B
     LATA1=(B & (1<<2)) >>2;  //C
     LATA4=(B & (1<<3)) >>3;  //D 
     __delay_us(50);
     LATB4=1;  //DP
     //B=STELLE_MAP[6] ;  //The pattern to return
     LATB5=1;
     LATA0=1;
     LATA1=1;
     LATA4=1;
    }
    if (dir){
        value_[5]=3;
    }
    else{
        value_[5]=0;
    }
     
    for (i=0;i<6;i++){  
     
     if(sys){
         
     }   
     else{
     if ((i==4)&(value_[i]==0)){
       na=1;   
     } 
      if ((i==3)&(value_[i]==0)){
       if (value_[4]==0){
        na=1;    
       } 
      }   
     }
    
     
     if (na){
      na=0;   
     }
     else{   
     A=SEGMENT_MAP[value_[i]] ;  //The pattern to return
     LATA2=(A & (1<<0)) >>0;  //A
     LATB0=(A & (1<<1)) >>1;  //B
     LATB1=(A & (1<<2)) >>2;  //C
     LATA3=(A & (1<<3)) >>3;  //D
     //Stelle 1=5   /2=9   /3=7   /4=0  /5=2  /6=4 
     B=STELLE_MAP[i] ;  //The pattern to return
     LATB5=(B & (1<<0)) >>0;  //A
     LATA0=(B & (1<<1)) >>1;  //B
     LATA1=(B & (1<<2)) >>2;  //C
     LATA4=(B & (1<<3)) >>3;  //D 
     if (i==2){
         __delay_us(175);
     }
     switch (A){
         case 0:
         __delay_us(600);
         break;
         case 1:
         __delay_us(200);
         break;
         case 2:
         __delay_us(500);
         break;
         case 3:
         __delay_us(500);
         break;
         case 4:
         __delay_us(400);
         break;
         case 5:
         __delay_us(500);
         break;
         case 6:
         __delay_us(600);
         break;
         case 7:
         __delay_us(300);
         break;
         case 8:
         __delay_us(700);
         break;
         case 9:
         __delay_us(600);
         break;
         
         default:   
         __delay_us(500);   
     }
     
      
     
     //B=STELLE_MAP[6] ;  //The pattern to return
     LATB5=1;
     LATA0=1;
     LATA1=1;
     LATA4=1;
     
     
     
     } 
    }
   
    
    
    
    
}


