Zugor Ediba Gazetic Elma Projekat iz PAI-a , Tema : Calculator

Dependencies:   mbed

main.cpp

Committer:
tim004
Date:
2014-06-11
Revision:
0:dc2c50156436

File content as of revision 0:dc2c50156436:

#include "mbed.h"

//BusInOut display(dp26, dp27, dp5,dp6, dp28,dp1, dp2);
BusOut display(PTE21,PTE20,PTB10,PTE5,PTE4,PTE3,PTE2,PTB11);
//DigitalOut point(dp4);
DigitalOut point(PTB11);
BusOut digits(PTE30,PTE29,PTE23,PTE22);
int numbers[16]= {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x04,0x2F,0x23,0x63,0x0E,0x3F};


//BusOut digits(dp23,dp24,dp25);

//Serial pc(USBTX, USBRX);

//DigitalOut rows[4]= {dp18,dp17,dp15,dp16};
//DigitalIn kol1(dp9), kol2(dp10),kol3(dp11),kol4(dp13);
DigitalOut rows[4]= {PTC5,PTC6,PTC10,PTC11};
DigitalIn kol4(PTC12), kol3(PTC13),kol2(PTC16),kol1(PTA16);

Timer Dbnc;
Ticker T,provjeraUlaza;

float cuvam=0; //"cuva" vrijednost u memoriji
float broj1=0;
float broj2=0;
bool drugi=false, treci=false,poc=false;
bool minus=false;
bool greska=false;
bool bin=false;
bool mem=false;

int decimala=0;
int counter=0;

char trenutniZnak=' ';
void showDisplay(int input)
{
        display=numbers[input];
}


void pocetnoStanje(){
 broj1 = broj2 = 0.;
    trenutniZnak = ' ';
    drugi = treci = poc = minus = greska = bin = mem = false;
    cuvam=0.0;
    decimala =0;
     counter = 0;
}
void izvrsiOperaciju(){ 
    if(trenutniZnak == '+')
        broj1 = broj1 + broj2;
    else
     if(trenutniZnak == '-')
        broj1 = broj1 - broj2;
    else if(trenutniZnak == '*')
        broj1 = broj1 * broj2;
    else if(trenutniZnak == '/')
    {
        if(broj2==0) greska = true;
        else broj1 = broj1 / broj2;
    }
    else if(trenutniZnak == 's')
    {
        for(int i=0;i<broj2 - 1;i++)
            broj1 = broj1 * broj1;
    }
}

int binToDec()
{
       if(counter==1) izvrsiOperaciju();
        
        if(int(broj1) != broj1){ greska = true;
        return -1;
        }
            if(broj1 < 0 ) greska = true;
            int pomocni=broj1;
            if(pomocni%10 !=1 || ((pomocni%10) != 0)) greska = true;
            if( (int)broj1/10 % 10 !=1 || (int)broj1/10 % 10 != 0) greska = true;
            if( (int)broj1/100 % 10 !=1 || (int)broj1/100 % 10 != 0) greska = true;
            
            if(greska) return;
    
            int var = int(broj1);
            
            broj1 =(var / 100)*4 + ((var%100)/10)*2 + var%10;
            bin= false;
}


int decToBin()
{
       if(bin) binToDec();
    if(counter==1) izvrsiOperaciju();
        
        if(int(broj1) != broj1) greska = true;
        if(broj1 > 7 || broj1 < 0) greska = true;
        
        if(greska) return;
        
        int var=int(broj1); int zbir[3]= {0,0,0} ;
        for(int i=0;i <3;i++){
            if(var==1) {zbir[2]=1; break;}
            zbir[i]=(var%2);
            var=var/2;
        }
        broj1= zbir[2]*100 + zbir[1]*10 + zbir[0];   
        bin = true;      
}


        
  char ocitajTast()
{
    rows[0]=0;
    rows[3]=1;
    rows[2]=1;
    rows[1]=1;

    if (kol1== 0) return '1';
    if (kol2 == 0) return '2';
    if (kol3 == 0) return '3';
    if (kol4 == 0) return 'A';

    rows[3]=1;
    rows[2]=1;
    rows[1]=0;
    rows[0]=1;
    if (kol1 == 0) return '4';
    if (kol2 == 0) return '5';
    if (kol3 == 0) return '6';
    if (kol4 == 0) return 'B';

    rows[3]=1;
    rows[2]=0;
    rows[1]=1;
    rows[0]=1;
    if (kol1 == 0) return '7';
    if (kol2 == 0) return '8';
    if (kol3 == 0) return '9';
    if (kol4 == 0) return 'C';

    rows[3]=0;
    rows[2]=1;
    rows[1]=1;
    rows[0]=1;

    if (kol1 == 0) return '*';
    if (kol2 == 0) return '0';
    if (kol3 == 0) return '#';
    if (kol4 == 0) return 'D';

    return ' ';
}

void ispisiNaDisplej()
{
    int treca(0),druga(0),prva(0);
    float ispis;
    
     if(counter==0 || (counter==1 && !poc) || counter==2) ispis = broj1;
    else ispis = broj2;
    
    ispis = ispis * 100;
    ispis = int(ispis);
    ispis = ispis / 100.0;
    int mjestoZareza(0), mjestoMinusa(0);

  if(int(ispis) == ispis)
    {
        if(ispis < 0) 
        {
            if(ispis <= -1 && ispis >= -9) mjestoMinusa = 2;
            else if(ispis <= -10 && ispis >= -99) mjestoMinusa = 1;
            ispis = abs(ispis);
        }
    }
   else
    {
        if(ispis > 0.0)
        {
            if(ispis < 10.0)
            {
                ispis = ispis * 100;
                mjestoZareza = 1;
                if(int(ispis)%10 == 0)
                {
                    ispis = ispis / 10;
                    mjestoZareza = 2;
                }
            }
            else
            {
                mjestoZareza = 2;
                ispis = ispis * 10;
            }
        }
        else        
        {
            mjestoZareza = 2;
            ispis = ispis * 10;
            ispis = fabs(ispis);
        }
    }
    bool flag(false);
            treca = (int)abs(ispis) % 10;
            druga = (int)abs(ispis / 10) % 10;
            prva  = (int)abs(ispis / 100) % 10;
        if(ispis==0)
        {
            digits = 3;
            showDisplay(0);
             wait_ms(1);    
        }
        else 
        {
            if(prva == 0 && !flag)
            {
                if(mjestoZareza == 1)
                {   
                     digits=15;
                showDisplay(0);
                digits = 13;
                 wait_ms(1);
                 digits=15;
                    point = 0;
                }
                if(mjestoMinusa == 1)
                {
                    digits=15;
                showDisplay(15);
                digits = 13;
                 wait_ms(1);
            digits=15;
                    point = 1;
                   
                }
            } 
            else
            {
                digits=15;
                showDisplay(prva);
                digits = 13;
                 wait_ms(1);
            digits=15;
               if(mjestoZareza == 1) point = 0;
                else point = 1;
                if(mjestoMinusa == 1) showDisplay(15);
                flag = true;   
            }
           // wait_ms(1);
            
            if(druga == 0 && !flag)
            {
                if(mjestoZareza == 2)
                {   
                     digits=15;
                showDisplay(prva);
                digits = 11;
                 wait_ms(1);
            digits=15;
                    point = 0;  
                }
                if(mjestoMinusa == 2)
                {
                    digits=15;
                showDisplay(prva);
                digits = 11;
                 wait_ms(1);
            digits=15;
                    point = 1;
                }
            } 
            else
            {
                 digits=15;
                showDisplay(druga);
                digits = 11;
                 wait_ms(1);
            digits=15;
                if(mjestoZareza == 2) point = 0;
                else point = 1;
                if(mjestoMinusa == 2)showDisplay(15);
                flag = true;
            }
           // wait_ms(1); 
            if(treca == 0 && !flag) 
                point=1;
            else
            {
                 digits=15;
                showDisplay(treca);
                digits = 7;
                 wait_ms(1);
            digits=15;
                flag = true;
            }
          // wait_ms(1);
        }
}
        
        
void prebaciZnak(int broj)
{

float var;
if (counter ==0) var=broj1;
else if (counter ==1){
     var = broj2;       
     poc = true;
     decimala=0;
     minus=false;
    }
else if (counter==2){
    pocetnoStanje();
    var=broj1;
    }
if ((decimala==0 ||decimala==1) && (var>=100 ||var<=-10)) return ;
if (decimala==2 && ((int)var>=10 || (int)var<0)) return;
if (decimala==3) return ;

if (decimala ==0)
    if (!minus) 
    var=var*10+broj;
    else var=var*10 -broj;
else if (decimala==1){
    if (!minus) var=var+broj/10.0;
    else var=var-broj/10.0;
    decimala++;
    }
else if (decimala==2){
    if (!minus)var=var+broj/100.0;
    else var=var-broj/100.0;
    decimala++;
    }
if (counter==0 ||counter==2) broj1=var;
else if (counter==1) broj2=var;
}



void skontajKojaFunkcija()
{
    char znak=ocitajTast(); //Ocitava sta smo unijeli
    if (znak==' ') return;
     if (Dbnc.read() > 0.2) {
      if (znak>='0' && znak <='9'){ // Ako je broj, onda ga ispisuje na displej
        prebaciZnak(int(znak-'0'));
       }
       


   else if (!drugi && !treci){
              
           if(counter==0 && !poc)
            {
                if(!drugi && !treci && trenutniZnak == '-')
                    minus = true;
                else if(drugi && trenutniZnak == 'D') {}
                else greska = true;
                
                counter=1;
                trenutniZnak=znak;
            }   
       
          if (znak=='#'){  
                   if(trenutniZnak==' ') return;    
                     if(trenutniZnak == 'A')
                     {           
                     
                     if (drugi){
                                
                                binToDec();
                             float var = broj1;
       
                            counter = 2;
                            return;
                         }    
                        else if (treci){
                           broj1=sin(broj1);
                       float var = broj1;
    
                         counter = 2;
                         return;
                         }
                         
                
                       if(counter==1)
                          izvrsiOperaciju();           
                     trenutniZnak = '+';
                         decimala=0;
                      minus=false;
                     poc=false;
                        counter = 1;
                        
                        
                      }
                
                 else if(trenutniZnak == 'B') // -
                  {
                       if(counter==1)
                         
                           izvrsiOperaciju();
                           float var = broj1;
                        //  pocetnoStanje();
                      //    broj1 = var;   
                       
                    
                        trenutniZnak = '-';
                    counter = 1;
                  }
            
              else if(trenutniZnak == 'C') 
                 {
                  if(counter==1)
                
                    izvrsiOperaciju();
                      float var = broj1;
                   // pocetnoStanje();
                  //  broj1 = var;
                    
                
                    
             trenutniZnak = '*';
            counter = 1;
            
                  }
            
        else if(trenutniZnak == 'D') 
        {
            if(counter==1)
                
                    izvrsiOperaciju();
                    float var = broj1;
                    //pocetnoStanje();
                  //  broj1 = var;   
                
                 
            trenutniZnak = '/';
            counter = 1;
             }
            
       
           /*     else if(trenutniZnak == '#') 
        {
            if(counter==1) izvrsiOperaciju();
            counter = 2;
            decimala=0;
            broj2=0;
            minus=poc=false;
         }*/
        
        izvrsiOperaciju();
          counter = 2;
            decimala=0;
            broj2=0;
            minus=poc=false;    
             
     }
     
        
    else if(trenutniZnak == '*') // dec. zarez
    {
     
     if (!drugi && !treci)   drugi=true;
     else if (drugi && !treci){
          drugi=false;
          treci=true;
          }  
    else if(!drugi && treci){
          treci=false;
          
          }
  
          
 } 
    }
  Dbnc.reset();   
 }
}

int main()
{  
    Dbnc.start();
     provjeraUlaza.attach(&ispisiNaDisplej,0.005);  
    
    while (7){
        skontajKojaFunkcija();
        }

}