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