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

Dependencies:   mbed

Revision:
0:dc2c50156436
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Jun 11 19:07:17 2014 +0000
@@ -0,0 +1,492 @@
+#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();
+        }
+
+}