Der Nachfolger des WDR-Computerclub mit Wolfgang Back und Wolfgang Rudolph - ...und immer ein Bit Řbrigbehalten!


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 

 Korrigierte Version Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Dietmar, Homepage - 15.02.2021 16:03)
 Als Antwort auf Demoprogramm: Spiel "Nibbles" auf dem I2C-LCD von Dietmar - 3.02.2021 0:20
Dietmar nutzt:  Open-Micro, Open-Mini, Open-Midi, Open-Macro, Open-Maxi, Open-Mini Station
' ===========================================================================
' Demoprogramm: Spiel "Nibbles" auf dem I2C-LCD - Korrigierte Version 1.1
' In OCBASIC 1.12a_e1 f├╝r Open-Maxi von Dietmar Harlos am 15. Februar 2021
' ===========================================================================

' In diesem Programm wird demonstriert, wie Felder auf der Open-Maxi
' realisiert werden k├Ânnen. Au├čerdem werden die Befehle des I┬▓C-LCDs
' veranschaulicht.

' Es handelt sich um die fehlerkorrigierte Version. In der bisherigen Version
' konnte das aufzusammelnde Gadget auf der Schlange liegen. Die Prozedur
' "newgadget" wurde ├╝berarbeitet.

' Verwendet wird das "LCD 204B LED" von Reichelt mit 4*20 Zeichen, das mit
' dem Portexpander PCF8574A 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 PCF8574A mit dem I┬▓C-Bus der Open-Maxi
' zu verbinden ist:

' http://om.dharlos.de/doku_omax/index.html

' Dieses Beispielprogramm setzt einen I2C-Portexpander PCF8574A voraus, mit
' dessen Hilfe das LCD angesprochen wird. Bei einem PCF8574 mu├č das "&h70"
' in ein "&h40" ge├Ąndert werden.

' Gesteuert wird das Programm mit den Tasten im Terminalfenster des PCs.
' 8 f├╝r hoch, 2 f├╝r runter, 4 f├╝r links und 6 f├╝r rechts. Unter neueren
' Windowsversionen sollte als Terminal das Terminal32.exe eingesetzt werden.
' Es liegt dem ZIP-Archiv "├ťbertragungstools f├╝r Windows und DOS" bei.

' Das Programm ben├Âtigt nur 842 Bytes Programmspeicher und 14 Bytes USER-RAM.

' An dieser Stelle m├Âchte ich mich bei Norbert Klein und bei Dirk von "das
' |_ Team" f├╝r ihre Unterst├╝tzung bedanken.

' --- Definitionen ----------------------------------------------------------

INCLUDE "omax.def"              'Definitionen f├╝r die Open-Maxi

DEFINE MAXLENGTH 32             'maximale L├Ąnge der Schlange (Snake)

DEFINE snake &h2aa              'Buffer an 1. Adresse hinter dem USER-RAM
                                'MAXLENGTH*2 Bytes lang

DIM bitarray BYTE               'ein Bitarray
DIM gotit  BIT[1] OF bitarray   'wird HIGH, wenn altes Gadget eingesammelt
DIM belegt BIT[2] OF bitarray   'wird HIGH, wenn Gadget auf Schlange liegen w├╝rde

DIM length BYTE                 'Variablen f├╝r 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                'tempor├Ąre 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

' I┬▓C-Adresse vom PCF8574A f├╝r das I┬▓C-LCD und I┬▓C-Bustakt setzen:

POKE i2clcdadr,&h70 'F├╝r PCF8574A mit Adre├čpins A2:A1:A0 gleich 0:0:0
POKE i2cdelay,20    'Defaultwert 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 PCF8574A,
IF LcdErr THEN      '  sonst auf ON
  PRINT "NoAck vom I2C-LCD"
  END
END IF
LCDCLS              'L├Âscht den Bildschirm

' Titel:

LCDLOCATE 1,2
LCDPRINT "Nibbles von D.H."
LCDLOCATE 2,3
LCDPRINT "Taste druecken"
GET a               'beliebige Taste im Terminalprogramm dr├╝cken
LCDCLS

' Initialisierungen:

RANDOMIZE 0         'Zufallsgenerator initialisieren (z.B. RANDOMIZE TIMER)

head=0              'Schlange (Snake) initialisieren
tail=1
length=2
POKE snake,1        'y-Koordinate
POKE snake+1,9      'x-Koordinate
POKE snake+2,1      'jeweils 2 Bytes bilden einen Punkt der Schlange
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("+")

bitarray=0          'einige Variablen initialisieren
punkte=0

' Hauptschleife:

WHILE TRUE

  direction=getdirection(direction)   'Tastatur abfragen

  a=goforward(direction)              'einen Schritt machen
'   ?"return"a                          'Debugging
'   ?"head"head
'   ?"tail"tail
'   ?"ygadget"ygadget
'   ?"xgadget"xgadget
'   ?"direction"direction
'   ?"length"length
'   FOR b=0 TO MAXLENGTH-1
'     ?b;PEEK(snake+2*b);PEEK(snake+2*b+1)
'   NEXT b
'   ?
  IF a THEN
    LCDLOCATE 1,2
    LCDPRINT " Ende des Spiels "
    LCDLOCATE 2,3       'Ende: Erreichte Punktzahl ausgeben
    LCDPRINT " Punkte:"
    LCDPRINT punkte
    LCDPUT ASC(" ")
    GOTO abbruch
  END IF

  IF gotit THEN                       'evtl. neues Gadget
    gotit=OFF
    ADD punkte,length
    newgadget
  END IF

  PAUSE 25  'oder "32-length" f├╝r Beschleunigung w├Ąhrend des Spiels

WEND
#abbruch

END                 'Zur├╝ck 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" AND a<>2 THEN a=1
    IF b="2" AND a<>1 THEN a=2
    IF b="4" AND a<>4 THEN a=3
    IF b="6" AND a<>3 THEN a=4
  END IF

  RETURN a

END FUNCTION

' Einen Schritt nach vorne ausf├╝hren

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>3 OR x>19 THEN
    RETURN 255            'au├čerhalb 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 Gr├Â├če erreicht
    END IF
    gotit=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

  REPEAT
    y=((RAND SHR 1)+16384)/8192 '0..3
    x=((RAND SHR 1)+16384)/1639 '0..19

    ' Die Bitvariable "belegt" auf HIGH setzen, wenn irgendein Feld der Schlange gleich y,x ist:

    belegt=OFF
    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
        belegt=ON
      END IF
    NEXT a

'     if belegt then            'Debugging
'       ?"belegt"belegt
'       ?y;x
'     end if
  UNTIL belegt=OFF ' Wiederhole die Schleife, bis "belegt=OFF" ist

  ygadget=y
  xgadget=x

  LCDLOCATE ygadget,xgadget   'und darstellen
  LCDPUT ASC("+")

  RETURN

END PROCEDURE

' --- Programmende ---------------------------------------------------------


Passender Link: Offizielle Infosite zu den OM-Mikrocontrollern

Meine Homepage: http://ccintern.dharlos.de

 Antwort schreiben

Bisherige Antworten: