INFO - FAQ - CC2-Forum - CCPro-Forum |
|
Hallo Dietmar, ein spannendes Geschicklichkeitsspiel! Leider haben wir nur ein 16x2 LC-Display mit Arduino-kompatibler Anschlussbelegung. Doch zum Glück gibt es ja den Treiber-Patch fuer Arduino- I2C-LCD Module im Downloadbereich. Nach Einfuegen von drei kurzen Programmzeilen, welche den Treiber aktivieren läuft das Programm ohne Probleme auch am Arduino LCD. Ansonsten haben wir lediglich die X,Y-Grenzen im Quelltext von ursprünglich 40x2 auf 16x2 Zeichen geändert und man kann auch mit den Tasten WASD steuern, falls kein Ziffernblock vorhanden ist. Ein schönes Kurzweil. Vielen Dank für dieses Programm! das |_ Team ' =========================================================================== ' Demoprogramm: Spiel "Nibbles" auf dem I2C-LCD ' In OCBASIC 1.12a_e1 fuer Open-Maxi von Dietmar Harlos am 31. Januar 2021 ' =========================================================================== ' In diesem Programm wird demonstriert, wie Felder auf den Mikrocontrollern ' der OM-Familie realisiert werden koennen. Ausserdem werden die Befehle des ' I2C-LCD veranschaulicht. ' Dieses Beispielprogramm setzt einen I2C-Portexpander PCF8574A voraus, mit ' dessen Hilfe das LCD angesprochen wird. Bei einem PCF8574 muss das "&h70" ' in ein "&h40" geaendert werden. ' Gesteuert wird das Programm mit den Tasten im Terminalfenster des PCs. ' 8 fuer hoch, 2 fuer runter, 4 fuer links und 6 fuer rechts. Unter neueren ' Windowsversionen sollte als Terminal das Terminal32.exe eingesetzt werden. ' Es liegt dem ZIP-Archiv "Uebertragungstools fuer Windows und DOS" bei. ' Das Programm benoetigt nur 840 Bytes im Programmspeicher und 14 Bytes RAM. ' An dieser Stelle moechte ich mich bei Norbert Klein und bei Dirk von "das ' |_ Team" fuer ihre Unterststuetzung bedanken. ' --------------------------------------------------------------------------- ' '+ Adaptiert fuer I2C-LCD's mit Arduinoanschluss-Belegung am 4.Februar 2021 ' '+ von "das |_ Team" (Adaptionen markiert:'+ (hinzu),'- (weg) '~ (geandert) ' '+ Steuerung der Schlange auch ueber die WASD - Tasten moeglich, falls kein ' '+ Ziffernblock vorhanden ist. (s.a.https://de.wikipedia.org/wiki/WASD) ' '+ WICHTIG: Zum erfoglreichen Kompilieren muessen die Dateien "ommax.def" & '+ "omax_ilp.iia" und dieser Quelltext im selben Verzeichnis vorhanden sein. '+ Das Programm benoetigt 970 Bytes im Programmspeicher und 14 Bytes im RAM. ' --- Definitionen ---------------------------------------------------------- INCLUDE "omax.def" 'Definitionen fuer die Open-Maxi ' --- System-Erweiterungen einbinden ----------------------------------------'+ INCLUDE "omax_ilp.iia" 'I²C-LCD-Patch einbinden fuer Arduino-Typ LCD ' --- Das Hauptprogramm -----------------------------------------------------'+ #main UIRSwi=ON '\ Patch fuer I²C-LCD mit Arduino Anschluss- '+ i2clcdpatch_init '/ belegung aktivieren. '+ DEFINE MAXLENGTH 64 'maximale Laenge der Schlange (Snake) '~ DEFINE snake &h2aa 'Buffer an 1. Adresse hinter dem USER-RAM 'MAXLENGTH*2 Bytes lang DIM bitarray BYTE 'ein Bitarray DIM gotgadget BIT[1] OF bitarray 'wird HIGH, wenn altes Gadget eingesammelt DIM leer BIT[2] OF bitarray 'wird HIGH, wenn Feld fuer Gadget frei DIM length BYTE 'Variablen fuer die Schlange (Snake) DIM head BYTE DIM tail BYTE DIM direction BYTE 'in welche Richtung sich die Schlange bewegt DIM ygadget BYTE 'Koordinaten des einzusammelnden Gadgets DIM xgadget BYTE DIM a,b,x,y BYTE 'temporaere Byte-Variablen DIM punkte WORD 'eine 16-Bit-Wordvariable ' --- Hauptprogramm --------------------------------------------------------- PrintSpc=ON 'SPACE vor einem dezimalen PRINT End2Host=ON 'Bei Programmende gleich in den Host-Modus wechseln ' I2C-Adresse vom PCF8574A fuer das I2C-LCD und I2C-Bustakt setzen: POKE i2clcdadr,&h4e '&h70 'Fuer PCF8574A mit Adresspins A2:A1:A0 gleich 0:0:0 POKE i2cdelay,20 'Defaultwert nach Programmstart ' I2C-LCD ansprechen und initialisieren: PAUSE 2 'Vorgeschriebene Verzoegerung fuer das LCD LcdLight=ON 'Die Hintergrundbeleuchtung koennte invertiert sein LCDINIT 'Setzt LcdErr auf OFF bei ACK vom PCF8574A, IF LcdErr THEN ' sonst auf ON PRINT "NoAck vom I2C-LCD" END END IF LCDCLS 'Loescht den Bildschirm ' Titel: LCDLOCATE 0,0 '1,2 '~ LCDPRINT "Nibbles von D.H." '~ LCDLOCATE 1,0 '2,3 LCDPRINT "Taste druecken" GET a 'beliebige Taste im Terminalprogramm druecken LCDCLS ' Initialisierungen: RANDOMIZE 0 'Hier Zufallsgenerator initialisieren head=0 'Schlange (Snake) initialisieren tail=1 length=2 POKE snake,1 POKE snake+1,9 POKE snake+2,1 POKE snake+3,10 direction=3 FOR a=0 TO length-1 'Auf dem LCD darstellen LCDLOCATE PEEK(snake+2*a),PEEK(snake+2*a+1) LCDPUT ASC("*") NEXT a ygadget=1 'einzusammelndes Gadget initialisieren xgadget=4 LCDLOCATE ygadget,xgadget 'und darstellen LCDPUT ASC("+") ' Hauptschleife WHILE TRUE direction=getdirection(direction) 'Tastatur abfragen a=goforward(direction) 'einen Schritt machen ' ?"return"a ' ?"head"head ' ?"tail"tail ' ? IF a THEN LCDLOCATE 0,0 '1,2 '~ LCDPRINT "Ende des Spiels " '~ LCDPRINT " Ende des Spiels " LCDLOCATE 1,0 '2,3 'Ende: Erreichte Punktzahl ausgeben '~ LCDPRINT "Punkte:" '~ LCDPRINT " Punkte:" LCDPRINT punkte LCDPUT ASC(" ") GOTO abbruch END IF IF gotgadget THEN gotgadget=OFF ADD punkte,length newgadget END IF PAUSE 32-length 'progressive Geschwindigkeit der Schlange 'PAUSE 25 '~ WEND #abbruch END 'Zurueck in den Hostmodus. Neustart mit RETURN-Taste. ' --- Subroutinen und Funktionen -------------------------------------------- ' Tastatureingaben empfangen und auswerten FUNCTION getdirection(a) IF RXD THEN b=GET IF (b="8" OR b="w") AND a<>2 THEN a=1 ' ( OR b="w") '~+ IF (b="2" OR b="s") AND a<>1 THEN a=2 ' ( OR b="s") '~+ IF (b="4" OR b="a") AND a<>4 THEN a=3 ' ( OR b="a") '~+ IF (b="6" OR b="d") AND a<>3 THEN a=4 ' ( OR b="d") '~+ END IF RETURN a END FUNCTION ' Einen Schritt nach vorne ausfuehren FUNCTION goforward(a) y=PEEK(snake+2*head) x=PEEK(snake+2*head+1) IF a=1 THEN SUB y,1 ELSE IF a=2 THEN ADD y,1 ELSE IF a=3 THEN SUB x,1 ELSE IF a=4 THEN ADD x,1 END IF IF y>1 OR x>15 THEN ' IF y>3 OR x>19 THEN '~ RETURN 255 'ausserhalb des Bildschirms ELSE IF y=ygadget AND x=xgadget THEN ADD length,1 IF length>=MAXLENGTH THEN RETURN 1 'das Gadget, aber Schlange hat maximale Groesse erreicht END IF gotgadget=ON ELSE FOR a=0 TO length-1 IF y=PEEK(snake+2*((head+a) MOD MAXLENGTH)) AND x=PEEK(snake+2*((head+a) MOD MAXLENGTH)+1) THEN RETURN 2 'auf der Schlange END IF NEXT a LCDLOCATE PEEK(snake+2*tail),PEEK(snake+2*tail+1) LCDPUT ASC(" ") IF tail=0 THEN tail=MAXLENGTH SUB tail,1 END IF IF head=0 THEN head=MAXLENGTH SUB head,1 POKE snake+2*head,y POKE snake+2*head+1,x LCDLOCATE PEEK(snake+2*head),PEEK(snake+2*head+1) LCDPUT ASC("*") RETURN 0 'normales Feld END FUNCTION ' Ein neues Gadget auf das Spielfeld setzen PROCEDURE newgadget leer=OFF WHILE leer=OFF y=((RAND SHR 1)+16384)/ 16384 '0..1 /8192 '0..3 '~ x=((RAND SHR 1)+16384)/ 2184'0..15 /1639 '0..19 '~ FOR a=0 TO length-1 IF y<>PEEK(snake+2*((head+a) MOD MAXLENGTH)) OR x<>PEEK(snake+2*((head+a) MOD MAXLENGTH)+1) THEN leer=ON END IF NEXT a WEND ygadget=y xgadget=x LCDLOCATE ygadget,xgadget 'und darstellen LCDPUT ASC("+") RETURN END PROCEDURE ' --- Programmende ---------------------------------------------------------- Passender Link: Verwandt: Arduino-LCD an Open-Micro mit OCBASIC ansteuern, von Joe Fenk. Meine Homepage: http://visit.ghn-sensorik.de |
Antwort schreiben |