Das Open-Control-Projekt - Die Alternative zur C-Control-I


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Ein Spiel auf dem I²C-LCD: "Meteor-Mess" Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Dietmar, Homepage - 29.09.2018 19:41)
Dietmar nutzt:  Open-Micro, Open-Mini, Open-Midi, Open-Macro, Open-Maxi, Open-Mini M-Unit, Open-Mini Station
' ===========================================================================
' 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

Bisherige Antworten: