1

Dependencies:   mbed TextLCD

Ovo je jednostavna igra, ne previše zanimljiva, napravljena od mbed LPC1768 mikrokontrolera, 16x2 LCD-a i jedne tipke.

/media/uploads/kyzo/shema.gif

Napravljena su 3 custom charactera za animaciju lika i izgled neprijatelja, koji se na početku koda zapisuju u memoriju LCD-a.

Priključivanjem mbed-a na napajanje kod prvo poziva funkciju čitaj iz „spremanje.cpp“ koja povlači trenutni highscore iz datoteke log.txt koja se nalazi u flashu mbeda-a, sprema ga u varijablu i prikazuje na ekranu.

Nakon toga poziva se funkcija koja zapiše custom charactere iz arraya u memoriju LCD-a. Obzirom da se jedan segment LCD-a sastoji od 5x8px, custom znakove je moguće kreirati na način da se na mjesto svakog bita u bajtu koji želimo prikazati stavi 1.

Primjer kvadrat:

1 1 1 1 1
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
1 1 1 1 1

Od toga dobijemo niz od 8 byteova ({0x1F,0x11,0x11,0x11,0x11,0x11,0x11,0x1F})koji možemo zapisati kao custom char.

U beskonačnoj petlji istovremeno se vrši animacija i manipulacija likom, crtanje i animacija prepreke, sve dok ne dođe do kolizije i kraja igre, ispisuje se rezultat i igra se vraća na početni ekran.

Za mjerenje rezultata u sekundama je zadužen timer koji resetiramo svakom novom igrom, nakon što je igra gotova vrši se provjera da li je oboren highscore, ako je zapisuje se u log.txt u flashu putem funkcije upis.

Files at this revision

API Documentation at this revision

Comitter:
kyzo
Date:
Mon Nov 19 13:22:48 2018 +0000
Commit message:
Prva verzija

Changed in this revision

TextLCD.lib Show annotated file Show diff for this revision Revisions of this file
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
spremanje.cpp Show annotated file Show diff for this revision Revisions of this file
spremanje.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TextLCD.lib	Mon Nov 19 13:22:48 2018 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/simon/code/TextLCD/#308d188a2d3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Nov 19 13:22:48 2018 +0000
@@ -0,0 +1,252 @@
+#include "mbed.h"
+#include "TextLCD.h"
+#include "spremanje.h"
+
+
+TextLCD lcd(p19, p20, p21, p22, p23, p24); //rs,e,d0,d1,d2,d3 Definiranje lcd pinova
+
+////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////// Definiranje custom charactera////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////
+char custom_char[4][8] = {
+    {0x0C,0x0C,0x00,0x0E,0x1C,0x0C,0x1A,0x13},      // čovječuljak trk 1
+    {0x0C,0x0C,0x00,0x0C,0x0C,0x0C,0x0C,0x0E},      // čovječuljak trk 2
+    {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},      // prazan char
+    {0x00,0x01,0x02,0x7C,0x81,0x7C,0x02,0x01}       // neprijatelj
+         
+};
+ 
+ 
+////////////////////////////////////////////////////////////////////////////////////////
+///////////////////////////// Definiranje varijabli, I/O////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////
+
+BusOut Lcd_pins(p21, p22, p23, p24);                // d4, d5, d6, d7 Definiranje lcd sabirnice za upis charactera
+Timer timer1;                                       // Timer za izračun rezultata
+DigitalOut rs_pin(p19);                             // LCD pin rs (register select.)
+DigitalOut e_pin(p20);                              // LCD pin e (enable).
+DigitalIn tipka(p14);                               // Tipka za kontrolu
+int red = 1;                                        // Varijabla za trenutačni red
+int tempRed= 0;                                     // pomoćna temp varijabla za stanje reda
+int stupac = 15;                                    // broj stupaca u igri
+int rezultat = 0;                                   // varijabla za rezultat u igri
+int highScore = 0;                                  // varijabla za highscore (čitanje/upis -> local/log.txt)
+float brzinaLika = 0.20;                            // brzina lika/neprijatelja
+bool posBit = false;                                // flag za lokaciju lika na ekranu
+bool gameOver = true;                               // flag za kraj igre
+
+
+void igra(void);                                    // funkcija igre
+
+
+
+////////////////////////////////////////////////////////////////////////////////////////
+// funkcija za upis custom charactera u memoriju lcd-a, u 2 koraka jer se piše 4+4 bita/
+////////////////////////////////////////////////////////////////////////////////////////
+
+void writePort(int value) {                         // slanje u 2 koraka jer koristimo 4bit na lcd
+ 
+    Lcd_pins = value >> 4;                          // shiftaj 4 bita u desno
+    wait(0.000040f); 
+    e_pin = 0;
+    wait(0.000040f);
+    e_pin = 1;
+    Lcd_pins = value;
+    wait(0.000040f);
+    e_pin = 0;
+    wait(0.000040f);
+    e_pin = 1;
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////Pojava prepreka/////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+void prepreka(void){
+      
+    
+      
+     tempRed = red;                                     //pospremi aktualnu vrijednost reda u temp(radi manipulacije likom)
+     red = 1;                                           //prebaci se u donji red 
+
+///////////////punjenje donjeg reda/////////////////     
+         lcd.locate(stupac+1,red);                      //lociraj se na sljedeći stupac
+         lcd.putc(2);                                   //obriši znak/ stavi prazan char
+         lcd.locate(stupac,red);                        //lociraj se na sljedeći stupac
+         lcd.putc(3);                                   //stavi char neprijatelja
+         
+          
+         
+       
+     red = tempRed;                                     //radi povratka u main vrati staru vrijednost reda
+     stupac = stupac--;                                 //umanji vrijednost stupca za 1
+     
+     if(stupac == 0 && posBit == false){                //ako je neprijatelj na poziciji i lik je gore = (udarac u lika)
+         
+             rezultat = timer1.read_ms()/1000;          // pročitaj vrijednost timera i spremi kao rez
+             lcd.cls();                                 // briši ekran
+             lcd.locate(3,0);                           // postavi kursor
+             lcd.printf("Game over!");                  // poruka
+             lcd.locate(3,1);                           // kursor novi red
+             lcd.printf("Rezultat:%i", rezultat);       // poruka
+             
+             
+             wait(2);                                   // pričekaj da se poruka stigne pročitati
+             
+             if(rezultat > highScore){                  // ako je trenutni rez veći od rekorda spremi ga kao novi rekord
+                 highScore = rezultat;
+                 upis(highScore);
+                 lcd.cls();
+                 
+                     
+                     lcd.locate(0,0);                    // postavi kursor
+                     lcd.printf("Novi highscore!!");     // ispiši novi rekord
+                     lcd.locate(6,1);                    
+                     lcd.printf("%i",highScore);
+                     wait(2);                            // pričekaj da se poruka stigne pročitati
+                                                       
+                                  }  
+                 
+             rezultat = 0;                               // poništi trenutni rezultat
+             gameOver = true;                            // aktiviraj gameover flag
+      
+         igra();                                         // skoči u funkciju igra i kreni ispočetka
+        
+         
+         }
+
+////////////////////////////////////////////////////////////////////////////////////////         
+///////////////brisanje zaostalih znakova///////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////
+          
+     if(stupac < 0){                                //ako je kursor došao na prvo mjesto(0)
+         
+         lcd.locate(0,1);                           //lociraj se na sljedeći stupac
+         lcd.putc(2);  
+         lcd.locate(4,0);                           //lociraj se na sljedeći stupac
+         lcd.putc(2);  
+         stupac = 15;                               //vrati ga natrag na početak
+         
+         
+         }
+ 
+ } 
+ 
+////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////Funkcija igre//////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////
+ 
+void igra(void){
+    
+    
+    lcd.cls();
+    wait(0.010); 
+    lcd.locate(1,0);                                // postavi kursor
+    lcd.printf("Pritisni tipku");                   // ispiši poruku
+    lcd.locate(4,1);                                
+    lcd.printf("za start"); 
+    
+    while(tipka != 1){                              // ne radi ništa dok se ne pritisne tipka za start
+        }  
+    
+    lcd.cls();
+    wait(0.010);    
+    gameOver = false;                               // resetiraj gameover flag
+    
+    timer1.reset();                                 // resetiraj timer za rezultat
+    timer1.start();                                 // ponovo ga pokreni
+    
+    while(gameOver == false){                       // vrti petlju dok god nije kraj igre
+    
+////////////////////////////////////////////////////////////////////////////////////////       
+///////////////////////////////Animacija lika///////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////      
+            lcd.locate(1,red);
+            lcd.putc(0);
+            wait(brzinaLika);
+            lcd.locate(1,red);
+            lcd.putc(1);
+            wait(brzinaLika);
+            
+////////////////////////////////////////////////////////////////////////////////////////            
+//////////////////////////////Manipulacija likom////////////////////////////////////////  
+////////////////////////////////////////////////////////////////////////////////////////          
+
+            if(tipka == 1){                         //ako je pritisnuta tipka
+                lcd.locate(1,red);                  //zadrži lokaciju na liku
+                lcd.putc(2);                        //obriši ga (upiši prazan char)
+                red = 0;                            //skoči u gornji red
+                posBit = true;                      //aktiviraj flag za poziciju
+                }
+               
+            if(tipka != 1 && posBit == true){       //ako tipka više nije aktivna, a posBit je (bio je u gornjem redu)
+                lcd.locate(1,red);                  //zadrži lokaciju na liku
+                lcd.putc(2);                        //obriši ga (upiši prazan char)
+                posBit = false;                     //resetiraj posbit
+                red = 1;                            //vrati lika u donji red
+                }   
+ 
+////////////////////////////////////////////////////////////////////////////////////////
+////////////////////Poziv funkcije za pojavu prepreka///////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////        
+            
+            prepreka(); 
+            
+            
+            
+        
+        }
+ 
+ } 
+
+////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////Main funkcija//////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////
+ 
+int main() {
+    
+    highScore = citaj();                            // pročitaj aktualni rekord iz log.txt i spremi u varijablu
+    lcd.cls();
+    lcd.locate(2,0);                                // postavi kursor
+    lcd.printf("Ucitavanje..");
+    wait(2);
+    lcd.cls();
+    lcd.locate(2,0);                                
+    lcd.printf("Highscore:%d", highScore);          // ispiši highscore
+    wait(2);
+    
+
+////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////Upis custom charactera u mem lcd-a/////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////
+
+    for (int j=0; j<8; j++) {
+ 
+        rs_pin = 0;                                 // slanje komande
+ 
+       
+        writePort(0x40+8*j);                        // 0x40 je početna adresa, za svaki char je potrebno 8 mem lokacija
+ 
+ 
+
+        rs_pin = 1;                                 // slanje charova
+ 
+ 
+        for (int i=0; i<8; i++) {
+            writePort(custom_char[j][i]);
+        }
+    }
+ 
+ 
+ 
+    lcd.cls();
+    wait(0.010);
+ 
+
+    lcd.locate(0,1);
+ 
+        igra();                                     // skoči u funkciju igre
+
+
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Mon Nov 19 13:22:48 2018 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/mbed_official/code/mbed/builds/e95d10626187
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/spremanje.cpp	Mon Nov 19 13:22:48 2018 +0000
@@ -0,0 +1,57 @@
+#include "spremanje.h"
+#include "mbed.h"
+
+LocalFileSystem local("local");                 // kreuranje local file system za r/w filea
+int rekord;                                     // varijabla za upis()
+Serial pc(USBTX,USBRX);                         // serijska komunikacija za debug
+
+
+////////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////Funkcija za upis rekorda//////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////
+
+void upis(int rekord) {                                         
+
+
+
+    FILE *logFile = NULL;                       // pointer za file
+    
+    
+ 
+
+  logFile = fopen("/local/log.txt", "w");       // otvori log.txt file za pisanje
+                                     
+  if (logFile == NULL) {                        // ako nije moguće otvoriti
+    pc.printf("Ne mogu otvoriti file.\n");      // javi err na teraterm
+    while (1) {
+      wait(100);
+    }
+  }else (pc.printf("OTVOREN FILE."));           // inače javi da je ok
+ 
+ 
+ 
+  
+  fprintf(logFile, "%d\r\n", rekord);           // upiši var rekord u file log.txt
+ 
+  fclose(logFile);                              // zatvori file
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////
+///////////////////////////Funkcija za čitanje rekorda//////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////
+    
+int citaj(void) {
+    
+    
+    FILE *set = fopen("/local/log.txt", "r");      // otvori log.txt za čitanje
+    
+    fscanf(set,"%i", &rekord);                     // pročitaj i spremi u rekord var
+   
+    fclose(set);                                   // zatvori file 
+    pc.printf("Iz varijable je procitano: %i", rekord);     // javi podatak u teraterm
+    return(rekord);                                         // vrati info glavnoj funkciji
+    
+}
+    
+    
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/spremanje.h	Mon Nov 19 13:22:48 2018 +0000
@@ -0,0 +1,10 @@
+#ifndef SPREMANJE_H
+#define SPREMANJE_H
+#include "mbed.h"
+
+
+void upis(int);         // prototip funkcije upis - prima int var
+int citaj(void);        // prototip funkcije citaj - vraća int
+
+
+#endif 
\ No newline at end of file