Merisa Golić Armin Nogo
Dependencies: N5110 eeprom mbed
main.cpp
- Committer:
- pai2015arminnogo
- Date:
- 2015-06-02
- Revision:
- 0:ebc6a8996650
File content as of revision 0:ebc6a8996650:
#include "mbed.h" #include "N5110.h" #define dp23 P0_0 //kada posmatramo segment vodoravno #define SIRINA 11 #define VISINA 5 //ref. koordinata cifre je krajnji lijevi piksel gornjeg segmenta //definisemo i za svaku cifru #define xPrva 5 #define xDruga 24 #define xTreca 48 #define xCetvrta 67 #define yCifra 7 int xTrenutnaCifra = 67; //Nokia displej N5110 display(dp4,dp26,dp23,dp25,dp2,dp6,dp18); //dp24(pwmout) s dp26 //Džojstik AnalogIn VRx(dp11); AnalogIn VRy(dp10); //digitalni izlaz za aktivaciju LED buffera DigitalOut enable (dp14); InterruptIn taster1(dp1); PwmOut buzz(dp24); //STAVITI NOVI PIN, UMJESTO DP1, novi oslobodjeni pin Timer tVrijeme; //debounce kada je taster pritisnut Timer modTimer; // pomaže da oderedimo mod rada Timer tDzojstik; bool tasterP = false; //da li je taster pritisnut, pomocu nje cemo manipulirati ulazom i izlazom iz nekog moda bool vrijemeMod = false;//oznacavamo da li smo u nekom modu bool alarmMod = false; Ticker dvotacka; //prikaz dvotacke Ticker talarm; //attachat ce se funkcija alarm, pozivati svaku sekundu u minuti u kojoj je aktivan alarm bool alarmInverse = false; //varijabla pomocu koje prebacujemo sa normal na inverse mode displaya bool dvoTacka = false; //varijabla pomocu koje ili ispisujemo ili brisemo dvotacku static int prviBroj; //varijable u kojima se nalazi trenutno vrijeme static int drugiBroj; static int treciBroj; static int cetvrtiBroj; static int prviAlarm; //varijable u kojima se nalazi vrijeme namjestenog alarma static int drugiAlarm; static int treciAlarm; static int cetvrtiAlarm; Ticker mjeri; //pomocu njega cemo mjeriti vrijeme Ticker blinkanje; //omogućava da cifra blinka u alarm i vrijeme modu bool blink = false; //funkcije za iscrtavanje segmenata void crtajLinijuDesno(int x, int y, int duzina) { for(int i = x; i <= x + duzina; i++) { display.setPixel(i,y); } } void crtajLinijuDolje(int x, int y, int duzina) { for(int i = y; i <= y + duzina; i++) { display.setPixel(x,i); } } void segmentVodoravno(int x, int y) { crtajLinijuDesno(x+2, y-2, SIRINA-4); crtajLinijuDesno(x+1, y-1, SIRINA-2); crtajLinijuDesno(x, y, SIRINA); crtajLinijuDesno(x+1, y+1 ,SIRINA-2); crtajLinijuDesno(x+2, y+2 ,SIRINA-4); } void segmentUspravno(int x, int y) { crtajLinijuDolje(x-2, y+2, SIRINA-4); crtajLinijuDolje(x-1, y+1, SIRINA-2); crtajLinijuDolje(x, y, SIRINA); crtajLinijuDolje(x+1, y+1 ,SIRINA-2); crtajLinijuDolje(x+2, y+2 ,SIRINA-4); } //funkcija za iscrtavanje dvotacke void crtajDvotacku() { if(!dvoTacka) { for(int i = 41; i < 43; i++) { for(int j = 16; j < 25; j++) { if(j < 18 || j > 22) display.setPixel(i,j); display.refresh(); } } dvoTacka = true; } else if(dvoTacka) { for(int i = 41; i < 43; i++) { for(int j = 16; j < 25; j++) { if(j < 18 || j > 22) display.clearPixel(i,j); display.refresh(); } } dvoTacka = false; } } //funkcije koje iscrtavaju određeni broj pomoću segmenata void crtajNula(int x, int y) { segmentVodoravno(x,y); //gornji segmentVodoravno(x, y + 26); //donji segmentUspravno(x-1, y+1); //gornji lijevi segmentUspravno(x-1, y+14); //donji lijevi segmentUspravno(x+12, y+1); //gornji desni segmentUspravno(x+12, y+14); //donji desni } void crtajJedan(int x, int y) { segmentUspravno(x+12, y+1); //gornji desni segmentUspravno(x+12, y+14); //donji desni } void crtajDva(int x, int y) { segmentVodoravno(x, y); //gornji segmentVodoravno(x, y + 26); //donji segmentUspravno(x-1, y+14); //donji lijevi segmentUspravno(x+12, y+1); //gornji desni segmentVodoravno(x, y+13); //srednji } void crtajTri(int x, int y) { segmentVodoravno(x, y); //gornji segmentVodoravno(x, y + 26); //donji segmentUspravno(x+12, y+1); //gornji desni segmentUspravno(x+12, y+14); //donji desni segmentVodoravno(x, y+13); //srednji } void crtajCetiri(int x, int y) { segmentUspravno(x-1, y+1); //gornji lijevi segmentUspravno(x+12, y+1); //gornji desni segmentUspravno(x+12, y+14); //donji desni segmentVodoravno(x, y+13); //srednji } void crtajPet(int x, int y) { segmentVodoravno(x, y); //gornji segmentVodoravno(x, y + 26); //donji segmentVodoravno(x, y+13); //srednji segmentUspravno(x-1, y+1); //gornji lijevi segmentUspravno(x+12, y+14); //donji desni } void crtajSest(int x, int y) { segmentVodoravno(x, y); //gornji segmentVodoravno(x, y + 26); //donji segmentVodoravno(x, y+13); //srednji segmentUspravno(x-1, y+1); //gornji lijevi segmentUspravno(x-1, y+14); //donji lijevi segmentUspravno(x+12, y+14); //donji desni } void crtajSedam(int x, int y) { segmentVodoravno(x, y); //gornji segmentUspravno(x+12, y+1); //gornji desni segmentUspravno(x+12, y+14); //donji desni } void crtajOsam(int x, int y) { segmentVodoravno(x,y); //gornji segmentVodoravno(x, y+13); //srednji segmentVodoravno(x, y + 26); //donji segmentUspravno(x-1, y+1); //gornji lijevi segmentUspravno(x-1, y+14); //donji lijevi segmentUspravno(x+12, y+1); //gornji desni segmentUspravno(x+12, y+14); //donji desni } void crtajDevet(int x, int y) { segmentVodoravno(x,y); //gornji segmentVodoravno(x, y+13); //srednji segmentVodoravno(x, y + 26); //donji segmentUspravno(x-1, y+1); //gornji lijevi segmentUspravno(x+12, y+1); //gornji desni segmentUspravno(x+12, y+14); //donji desni } //funkcije koje brisu broj na trenutnoj cifri void brisiLinijuDesno(int x, int y, int duzina) { for(int i = x; i <= x + duzina; i++) { display.clearPixel(i,y); } } void brisiLinijuDolje(int x, int y, int duzina) { for(int i = y; i <= y + duzina; i++) { display.clearPixel(x,i); } } void segmentVodoravnoBrisi(int x, int y) { brisiLinijuDesno(x+2, y-2, SIRINA-4); brisiLinijuDesno(x+1, y-1, SIRINA-2); brisiLinijuDesno(x, y, SIRINA); brisiLinijuDesno(x+1, y+1 ,SIRINA-2); brisiLinijuDesno(x+2, y+2 ,SIRINA-4); } void segmentUspravnoBrisi(int x, int y) { brisiLinijuDolje(x-2, y+2, SIRINA-4); brisiLinijuDolje(x-1, y+1, SIRINA-2); brisiLinijuDolje(x, y, SIRINA); brisiLinijuDolje(x+1, y+1 ,SIRINA-2); brisiLinijuDolje(x+2, y+2 ,SIRINA-4); } void brisi(int x, int y) { segmentVodoravnoBrisi(x,y); //gornji segmentVodoravnoBrisi(x, y+13); //srednji segmentVodoravnoBrisi(x, y + 26); //donji segmentUspravnoBrisi(x-1, y+1); //gornji lijevi segmentUspravnoBrisi(x-1, y+14); //donji lijevi segmentUspravnoBrisi(x+12, y+1); //gornji desni segmentUspravnoBrisi(x+12, y+14); //donji desni } void ispisiPom(int broj, int pozicija) { switch(broj) { case 0: crtajNula(pozicija, yCifra); break; case 1: crtajJedan(pozicija, yCifra); break; case 2: crtajDva(pozicija, yCifra); break; case 3: crtajTri(pozicija, yCifra); break; case 4: crtajCetiri(pozicija, yCifra); break; case 5: crtajPet(pozicija, yCifra); break; case 6: crtajSest(pozicija, yCifra); break; case 7: crtajSedam(pozicija, yCifra); break; case 8: crtajOsam(pozicija, yCifra); break; case 9: crtajDevet(pozicija, yCifra); } } //funkcija upravljanja dzojstikom za vrijemeMod void dzojstikVrijeme() { if(tDzojstik.read()<0.5) return; if (VRx<1.0/3.0) { //&& VRy>1.0/3.0 && VRy<2.0/3.0 switch(xTrenutnaCifra) { case 67: xTrenutnaCifra = 48; break; case 48: xTrenutnaCifra = 24; break; case 24: xTrenutnaCifra = 5; break; case 5: break; } } else if (VRx>2.0/3.0) { //&& VRy>1.0/3.0 && VRy<2.0/3.0 switch(xTrenutnaCifra) { case 5: xTrenutnaCifra = 24; break; case 24: xTrenutnaCifra = 48; break; case 48: xTrenutnaCifra = 67; break; case 67: break; } } if (VRy<1.0/3.0) { switch(xTrenutnaCifra) { case 67: cetvrtiBroj--; if(cetvrtiBroj<0) cetvrtiBroj = 0; break; case 48: treciBroj--; if(treciBroj<0) treciBroj = 0; break; case 24: drugiBroj--; if(drugiBroj<0) drugiBroj = 0; break; case 5: prviBroj--; if(prviBroj<0) prviBroj = 0; } } else if (VRy>2.0/3.0) { switch(xTrenutnaCifra) { case 67: cetvrtiBroj++; if(cetvrtiBroj>9) cetvrtiBroj = 9; break; case 48: treciBroj++; if(treciBroj>5) treciBroj = 5; break; case 24: drugiBroj++; if(prviBroj == 2 && drugiBroj>3) drugiBroj = 3; if(drugiBroj>9) drugiBroj = 9; break; case 5: prviBroj++; if(drugiBroj>3 && prviBroj>1) prviBroj = 1; if(prviBroj>2) prviBroj = 2; } } tDzojstik.reset(); tDzojstik.start(); } //funkcija upravljanja dzojstikom za alarmMod void dzojstikAlarm() { if(tDzojstik.read()<0.5) return; if (VRx<1.0/3.0) { switch(xTrenutnaCifra) { case 67: xTrenutnaCifra = 48; break; case 48: xTrenutnaCifra = 24; break; case 24: xTrenutnaCifra = 5; break; case 5: break; } } else if (VRx>2.0/3.0) { switch(xTrenutnaCifra) { case 5: xTrenutnaCifra = 24; break; case 24: xTrenutnaCifra = 48; break; case 48: xTrenutnaCifra = 67; break; case 67: break; } } if (VRy<1.0/3.0) { switch(xTrenutnaCifra) { case 67: cetvrtiAlarm--; if(cetvrtiAlarm<0) cetvrtiAlarm = 0; break; case 48: treciAlarm--; if(treciAlarm<0) treciAlarm = 0; break; case 24: drugiAlarm--; if(drugiAlarm<0) drugiAlarm = 0; break; case 5: prviAlarm--; if(prviAlarm<0) prviAlarm = 0; } } else if (VRy>2.0/3.0) { switch(xTrenutnaCifra) { case 67: cetvrtiAlarm++; if(cetvrtiAlarm>9) cetvrtiAlarm = 9; break; case 48: treciAlarm++; if(treciAlarm>5) treciAlarm = 5; break; case 24: drugiAlarm++; if(prviAlarm == 2 && drugiAlarm>3) drugiAlarm = 3; if(drugiAlarm>9) drugiAlarm = 9; break; case 5: prviAlarm++; if(drugiAlarm>3 && prviAlarm>1) prviAlarm = 1; if(prviAlarm>2) prviAlarm = 2; } } tDzojstik.reset(); tDzojstik.start(); } //prikaz moda void crtajA() { display.setPixel(40, 30); display.setPixel(41, 30); display.setPixel(42, 30); display.setPixel(40, 31); display.setPixel(42, 31); display.setPixel(40, 32); display.setPixel(41, 32); display.setPixel(42, 32); display.setPixel(40, 33); display.setPixel(42, 33); display.setPixel(40, 34); display.setPixel(42, 34); } void crtajV() { display.setPixel(39, 31); display.setPixel(43, 31); display.setPixel(39, 32); display.setPixel(43, 32); display.setPixel(40, 33); display.setPixel(42, 33); display.setPixel(41, 34); } void brisiMod() { for(int i = 39; i < 44; i++) for(int j = 30; j < 35; j++) display.clearPixel(i, j); } void blinkaj() { //vrijeme mod if(vrijemeMod && !blink) { blink = true; switch(xTrenutnaCifra) { case 67: ispisiPom(cetvrtiBroj, 67); break; case 48: ispisiPom(treciBroj, 48); break; case 24: ispisiPom(drugiBroj, 24); break; case 5: ispisiPom(prviBroj, 5); } } else if(vrijemeMod && blink) { blink = false; switch(xTrenutnaCifra) { case 67: brisi(xCetvrta, yCifra); break; case 48: brisi(xTreca, yCifra); break; case 24: brisi(xDruga, yCifra); break; case 5: brisi(xPrva, yCifra); } } //alarm mod if(alarmMod && !blink) { blink = true; switch(xTrenutnaCifra) { case 67: ispisiPom(cetvrtiAlarm, 67); break; case 48: ispisiPom(treciAlarm, 48); break; case 24: ispisiPom(drugiAlarm, 24); break; case 5: ispisiPom(prviAlarm, 5); } } else if(alarmMod && blink) { blink = false; switch(xTrenutnaCifra) { case 67: brisi(xCetvrta, yCifra); break; case 48: brisi(xTreca, yCifra); break; case 24: brisi(xDruga, yCifra); break; case 5: brisi(xPrva, yCifra); } } } void odrediMod() { if(modTimer.read()>2 && vrijemeMod == false) { alarmMod = true; tDzojstik.reset(); tDzojstik.start(); } else if(alarmMod == false) { vrijemeMod = true; tDzojstik.reset(); tDzojstik.start(); } modTimer.reset(); if(alarmMod) { if(!tasterP) { if(tVrijeme.read() > 0.2) { //debouncing tVrijeme.reset(); tasterP = true; crtajA(); prviAlarm = prviBroj; drugiAlarm = drugiBroj; treciAlarm = treciBroj; cetvrtiAlarm = cetvrtiBroj; blinkanje.attach(&blinkaj, 1); //atachiramo blinkanje cifre koja se mijenja, povecati interval blinkanja ako bude potrebe } } else { blinkanje.detach(); tasterP = false; alarmMod = false; brisiMod(); } } else if(vrijemeMod) { if(!tasterP) { if(tVrijeme.read() > 0.2) { //debouncing tVrijeme.reset(); tasterP = true; crtajV(); blinkanje.attach(&blinkaj, 1); // povecati interval ako bude potrebno } } else { blinkanje.detach(); tasterP = false; vrijemeMod = false; brisiMod(); } } } void tasterPritisnut() // koristimo kao pomoc za određivanje moda { modTimer.start(); } //funkcija za paljenje alarma void alarm() { if(!alarmInverse) { display.inverseMode(); buzz = 0.5; //podesiti frekvenciju alarmInverse = true; } else { display.normalMode(); buzz = 0; //podesiti frekvenciju alarmInverse = false; } display.refresh(); } //funkcija za mjerenje vremena void mjeriVrijeme() { cetvrtiBroj++; if(cetvrtiBroj>9) { cetvrtiBroj = 0; treciBroj++; if(treciBroj>5) { treciBroj = 0; drugiBroj++; if(drugiBroj>9 || prviBroj == 2 && drugiBroj>3) { drugiBroj = 0; prviBroj++; if(prviBroj>2) { prviBroj = 0; } } } } if(!alarmMod) { brisi(xPrva, yCifra); brisi(xDruga, yCifra); brisi(xTreca, yCifra); brisi(xCetvrta, yCifra); ispisiPom(prviBroj, xPrva); ispisiPom(drugiBroj, xDruga); ispisiPom(treciBroj, xTreca); ispisiPom(cetvrtiBroj, xCetvrta); } if(prviBroj == prviAlarm && drugiBroj == drugiAlarm && treciBroj == treciAlarm && cetvrtiBroj == cetvrtiAlarm) { talarm.attach(&alarm, 1); prviAlarm = -1; drugiAlarm = -1; treciAlarm = -1; cetvrtiAlarm = -1; } else { talarm.detach(); display.normalMode(); buzz = 0; } display.refresh(); } int main() { enable = 1; display.init(); buzz.period_us(500); prviAlarm = -1; drugiAlarm = -1; treciAlarm = -1; cetvrtiAlarm = -1; //vratiti na nulu kad se zavrsi testiranje prviBroj = 1; drugiBroj = 9; treciBroj = 2; cetvrtiBroj = 2; ispisiPom(prviBroj, xPrva); ispisiPom(drugiBroj, xDruga); ispisiPom(treciBroj, xTreca); ispisiPom(cetvrtiBroj, xCetvrta); tVrijeme.start(); taster1.rise(&tasterPritisnut); taster1.fall(&odrediMod); //ovjde se postavlja funckija za određivanje moda tj. mjericemo vrijeme koje prodje od pritiska tastera do pustanja dvotacka.attach(&crtajDvotacku, 1); mjeri.attach(&mjeriVrijeme, 60); while(1) { if(alarmMod) dzojstikAlarm(); else if(vrijemeMod) dzojstikVrijeme(); } }