![]() ![]() INFO - FAQ - CC2-Forum - CCPro-Forum |
|
' =========================================================================== ' Spiel "Meteor-Mess" auf dem I²C-LCD einer Open-Maxi ' In OCBASIC 1.12a_e1 von Dietmar Harlos am 29. September 2018 ' =========================================================================== ' "Meteor-Mess" ist der Name eines Spiels, das ich um 1990 aus der Zeit- ' schrift "Pocket Computer" der Firma Fischel aus Berlin abgetippt habe. Es ' lief auf einem CASIO FX-850P. Ich habe es 2012 auf die Open-Macro umgesetzt, ' um die I2C-LCD-Routinen zu testen. Hier nun eine Version für die Open-Maxi. ' Gesteuert wird das Programm mit den Tasten im Terminalfenster des PCs. ' "8" oder "4" für "hoch" und "2" oder "6" für "runter". Unter neueren ' Windowsversionen sollte als Terminal das Terminal32.exe eingesetzt werden. ' Es liegt dem ZIP-Archiv "Übertragungstools für Windows und DOS" bei. ' Verwendet wird das "LCD 204B LED" von Reichelt mit 4*20 Zeichen, das mit ' dem Portexpander PCF8574 auf die gleiche Weise verbunden ist wie bei dem ' I2C-LCD von Conrad Electronic (Bestellnr. 198330). Eine kleine Platine ' mit 16-pol. Wannenstecker für das LCD und Sockel für den PCF ist schnell ' auf einem Stück Lochrasterplatine aufgebaut. ' In der Bedienungsanleitung zur Open-Macro und Open-Maxi ist beschrieben, ' wie das LCD mittels Portexpander PCF8574 mit dem I²C-Bus der Open-Maxi ' zu verbinden ist: ' http://om.dharlos.de/doku_omax/index.html ' --- Definitionen für das System ------------------------------------------- INCLUDE "omax.def" 'Definitionen für die Open-Maxi ' --- Definitionen des Anwenders -------------------------------------------- DEFINE bufstart &h2aa 'Hinter dem User-RAM liegt der 4*20=80 Zeichen große ' Buffer. Er wird per PEEK und POKE angesprochen. DIM a,b,c BYTE 'Ein paar Variablen DIM position BYTE DIM punkte WORD ' --- Hauptprogramm --------------------------------------------------------- End2Host=ON 'Nach Programmende in den Host-Modus ' I²C-Adresse vom PCF8574 für das I²C-LCD und I²C-Bustakt setzen: POKE i2clcdadr,&h40 'Das sind die Defaultwerte POKE i2cdelay,20 ' nach Programmstart ' I²C-LCD ansprechen und initialisieren: PAUSE 2 'Vorgeschriebene Verzögerung für das LCD LcdLight=ON 'Die Hintergrundbeleuchtung könnte invertiert sein LCDINIT 'Setzt LcdErr auf OFF bei ACK vom PCF8574, IF LcdErr THEN ' sonst auf ON PRINT "NoAck vom I2C-LCD" END END IF LCDCLS 'Löscht den Bildschirm RANDOMIZE 0 'Eventuell ändern für andere Meteoriten-Verteilung! init 'Initialisierung REPEAT PAUSE 6 'Verzögerung, da Open-Maxi zu schnell ist output handlekeys ADD punkte,1 UNTIL nextstep LCDLOCATE 1,3 'Ende: Erreichte Punktzahl ausgeben LCDPRINT " Punkte: " LCDPRINT punkte LCDPUT ASC(" ") END 'Programmende, Neustart mit der Enter-Taste ' --- Subroutinen und Funktionen -------------------------------------------- ' einige Initialisierungen durchführen PROCEDURE init position=0 punkte=0 initbuffer ' die drei LCD-Zeichen definieren: LCDCMD &b01000000 '"Set CG-RAM address" FOR b=0 TO 2 FOR a=0 TO 7 LCDPUT LOOKTABBYTE(defzeichen,a+b*8) NEXT a NEXT b RETURN END PROCEDURE ' Buffer initialisieren PROCEDURE initbuffer FOR a=0 TO 79 POKE bufstart+a,ASC(" ") NEXT a RETURN END PROCEDURE ' Buffer auf dem LCD ausgeben PROCEDURE output FOR b=0 TO 3 LCDLOCATE b,0 FOR a=0 TO 19 LCDPUT PEEK(bufstart+a+b*20) NEXT a NEXT b RETURN END PROCEDURE ' Buffer nach links scrollen PROCEDURE scroll FOR a=0 TO 78 POKE bufstart+a,PEEK(bufstart+a+1) NEXT a RETURN END PROCEDURE ' Den nächsten Schritt ausführen ' bei einer Kollision wird der Wert 1 zurückgeliefert, sonst 0 FUNCTION nextstep scroll 'Buffer nach links scrollen FOR b=0 TO 3 'rechten Rand mit SPACE überschreiben POKE bufstart+b*20+19,ASC(" ") NEXT b IF RAND>(24000-punkte*10) THEN 'Zahl ändern für mehr oder weniger Meteore! b=(RAND SHR 14) AND 3 '0..3 POKE bufstart+b*20+19,0 'zufallsbedingt Meteore setzen END IF IF PEEK(bufstart+position*20)=0 THEN 'Kollisionen feststellen POKE bufstart+position*20,2 '"Blitz" output RETURN 1 END IF POKE bufstart+position*20,1 'Raumschiff im Buffer positionieren RETURN 0 END FUNCTION ' Tasten abfragen ' Es werden die Tastendrücke im Terminalprogramm Terminal32.exe ausgewertet PROCEDURE handlekeys IF RXD THEN GET c IF c=ASC("8") OR c=ASC("4") THEN IF position THEN SUB position,1 ELSE IF c=ASC("2") OR c=ASC("6") THEN IF position<3 THEN ADD position,1 END IF END IF RETURN END PROCEDURE ' --- Tabellen -------------------------------------------------------------- TABLE defzeichen BYTE &b00000100 '1. selbstdefiniertes Zeichen: "Meteor", Character 0 &b00001110 &b00011111 'nur die unteren 5 Bits definieren das Aussehen &b00011111 &b00011111 &b00001110 &b00000100 &b00000000 &b00001000 '2. selbstdefiniertes Zeichen: "Raumschiff", Character 1 &b00001100 &b00001110 &b00011111 &b00001110 &b00001100 &b00001000 &b00000000 &b00000001 '3. selbstdefiniertes Zeichen: "Blitz", Character 2 &b00000010 &b00000100 &b00001111 &b00000010 &b00010100 &b00011000 &b00011100 END TABLE ' --- Programmende --------------------------------------------------------- Passender Link: Bedienungsanleitung zur Open-Macro und Open-Maxi Meine Homepage: http://ccintern.dharlos.de |
Antwort schreiben |