![]() ![]() INFO - FAQ - CC2-Forum - CCPro-Forum |
|
' =========================================================================== ' Demoprogramm: Spiel "Nibbles" auf dem I2C-LCD ' In OCBASIC 1.12a_e1 für Open-Maxi von Dietmar Harlos am 31. Januar 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. ' 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 840 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 gotgadget BIT[1] OF bitarray 'wird HIGH, wenn altes Gadget eingesammelt DIM leer BIT[2] OF bitarray 'wird HIGH, wenn Feld für Gadget frei 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("+") ' Hauptschleife: WHILE TRUE direction=getdirection(direction) 'Tastatur abfragen a=goforward(direction) 'einen Schritt machen ' ?"return"a ' ?"head"head ' ?"tail"tail ' 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 gotgadget THEN 'evtl. neues Gadget gotgadget=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 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)/8192 '0..3 x=((RAND SHR 1)+16384)/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: Offizielle Infosite zu den OM-Mikrocontrollern Meine Homepage: http://ccintern.dharlos.de |
Antwort schreiben |