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

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
tim004
Date:
Wed Jun 11 19:07:17 2014 +0000
Commit message:
PAI_Projekat_2014_Calculator

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r dc2c50156436 main.cpp
--- /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();
+        }
+
+}
diff -r 000000000000 -r dc2c50156436 mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Wed Jun 11 19:07:17 2014 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/024bf7f99721
\ No newline at end of file