tim004 tim004
/
PAI_Projekat_2014_Calculator
Zugor Ediba Gazetic Elma Projekat iz PAI-a , Tema : Calculator
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(); } }