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 

 Demoprogramm: Zufällige Kreise auf dem Display Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Dietmar, Homepage - 12.09.2019 20:28)
 Als Antwort auf Text und Grafik mischen von Dietmar - 7.09.2019 1:54
Dietmar nutzt:  Open-Micro, Open-Mini, Open-Midi, Open-Macro, Open-Maxi, Open-Mini M-Unit, Open-Mini Station
' ============================================================================
' Das preiswerte 0.96 Inch OLED-I2C-Display von AZ-Delivery ansprechen.
' Dieses Programm zeichnet zufällige Kreise per Bresenham-Algorithmus.
' In OCBASIC auf der Open-Maxi von Dietmar Harlos am 10. September 2019.
' Version vom 12. September 2019: Fehler in PROCEDURE oled_clrscr behoben.
' ============================================================================

' Dieses Programm demonstriert, wie Zufallszahlen auf der OM erzeugt werden.

' Das Display ist grafikfähig und besitzt eine Auflösung von 128 mal 64 Pixel.
' Es kann über Amazon bezogen werden und kostet zur Zeit nur 5,99 EUR bei
' kostenlosem Versand:

' https://www.amazon.de/dp/B01L9GC470

' Das Display basiert auf der Controllertype SSD1306 und verfügt über einen
' I²C-Bus. Es wird an den I²C-Bus der Open-Maxi angeschlossen. Die Betriebs-
' spannung darf 3 bis 5 Volt betragen.

' Zum Erstellen der Demoprogramme zum Display habe ich diverse Quellen aus dem
' Internet verwendet. Unter anderem die folgende Diskussion in einem Forum:

' https://www.mikrocontroller.net/topic/415651

' Erst Betriebsspannung am Display anlegen, dann Open-Maxi-UB anlegen. Zum
' Resetten müssen beide Versorgungsspannungen getrennt werden.

' Der Bresenham-Algorithmus ist ein Algorithmus in der Computergrafik zum
' Zeichnen (Rastern) von Geraden oder Kreisen auf Rasteranzeigen:

' https://de.wikipedia.org/wiki/Bresenham-Algorithmus

' An dieser Stelle möchte ich mich bei Norbert Klein und bei Dirk vom L-Team
' für ihre Unterstützung bedanken.

' --- Definitionen für das System -------------------------------------------

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

' --- Definitionen des Anwenders --------------------------------------------

DEFINE bitarrayaddr &h02aa 'Startadresse des Buffers (1024 Byte)

DEFINE OLED_I2C_ADDR  &h78 'Konstanten für OLED-I2C-Display
DEFINE OLED_DISP_OFF  &hAE
DEFINE OLED_DISP_ON   &hAF
DEFINE DISPLAY_WIDTH  128
DEFINE DISPLAY_HEIGHT 64
DEFINE DISPLAYSIZE    1024

DEFINE maxx DISPLAY_WIDTH-1 'Bildschirmgröße
DEFINE maxy DISPLAY_HEIGHT-1

DIM a,b,c,d,data,x,y BYTE  'einige Variablen definieren
DIM w,actualIndex WORD

DIM x0,y0,x1,y1,dx,dy,sx,sy,e1,e2 INT 'Variablen für Bresenham-Algorithmus

DEFINE radius x1           'Variablen für Kreis
DEFINE f y1                '(belegen den gleichen Speicher)
DEFINE ddF_x dx            '(x1 hat jetzt den Alternativnamen radius, usw.)
DEFINE ddF_y dy
DEFINE xc sx
DEFINE yc sy

' --- Das Hauptprogramm -----------------------------------------------------

End2Host=ON                'nach Programmende in den Host-Modus

PRINT "OLED-I2C-Display: zufällige Kreise"

POKE i2cdelay,1            'Schnellerer I²C-Bus

i2c_init                   'I2C-Bus initialisieren
oled_init                  'OLED-I2C-Display initialisieren

RANDOMIZE 1000             'Zufallszahlengenerator neu initialisieren

' "(RAND SHR 1)+16384": Dadurch werden Zufallszahlen von 0 bis 32767 generiert.

FOR d=1 TO 20
  a=((RAND SHR 1)+16384)/256  'Zufallszahlen von 0 bis 127
  b=((RAND SHR 1)+16384)/512  'Zufallszahlen von 0 bis 63
  c=((RAND SHR 1)+16384)/1639 'Zufallszahlen von 0 bis 19
  circle a,b,c             'Kreis im Buffer zeichnen
  oled_refresh             'Buffer auf Display ausgeben
NEXT d

' oled_clrscr                'Prozedur oled_clrscr prüfen
' PAUSE 100
' line 0,0,127,63
' oled_refresh               'Buffer auf Display ausgeben

END                        'Programmende, Neustart mit der Enter-Taste

' ----------------------------------------------------------------------------

' Bresenham-Algorithmus zum Linienzeichnen

PROCEDURE line(x0, y0, x1, y1)
  dx =  ABS(x1-x0)
  IF x0<x1 THEN sx=1 ELSE sx=-1
  dy = -ABS(y1-y0)
  IF y0<y1 THEN sy=1 ELSE sy=-1
  e1 = dx+dy

  WHILE TRUE
    pset x0,y0
    if x0=x1 AND y0=y1 THEN GOTO line_break
    e2 = 2*e1
    if e2>dy THEN ADD e1,dy : ADD x0,sx
    if e2<dx THEN ADD e1,dx : ADD y0,sy
  WEND
  #line_break

  RETURN
END PROCEDURE

' ----------------------------------------------------------------------------

' Bresenham-Algorithmus zum Zeichnen von Kreisen

PROCEDURE circle(x0, y0, radius)
  f = 1 - radius
  ddF_x = 0
  ddF_y = -2 * radius
  xc = 0
  yc = radius

  pset x0, y0 + radius
  pset x0, y0 - radius
  pset x0 + radius, y0
  pset x0 - radius, y0

  WHILE (xc < yc)
    IF f >= 0 THEN
      SUB yc,1
      ADD ddF_y,2
      ADD f,ddF_y
    END IF

    ADD xc,1
    ADD ddF_x,2
    ADD f,ddF_x + 1

    pset x0 + xc, y0 + yc
    pset x0 - xc, y0 + yc
    pset x0 + xc, y0 - yc
    pset x0 - xc, y0 - yc
    pset x0 + yc, y0 + xc
    pset x0 - yc, y0 + xc
    pset x0 + yc, y0 - xc
    pset x0 - yc, y0 - xc
  WEND

  RETURN
END PROCEDURE

' ----------------------------------------------------------------------------

' Punkt im Buffer abfragen

FUNCTION point(x,y)
  IF x<0 OR x>maxx OR y<0 OR y>maxy THEN RETURN OFF
  RETURN bitarray_get(((y SHR 3) SHL 10)+(y AND 7)+(x SHL 3))
  'RETURN bitarray_get(y/8*1024+(y MOD 8)+x*8)
END FUNCTION

' Punkt im Buffer setzen

PROCEDURE pset(x,y)
  IF x<0 OR x>maxx OR y<0 OR y>maxy THEN RETURN
  bitarray_set(((y SHR 3) SHL 10)+(y AND 7)+(x SHL 3))
  RETURN
END PROCEDURE

' Punkt im Buffer löschen

PROCEDURE pclear(x,y)
  IF x<0 OR x>maxx OR y<0 OR y>maxy THEN RETURN
  bitarray_clear(((y SHR 3) SHL 10)+(y AND 7)+(x SHL 3))
  RETURN
END PROCEDURE

' ---------------------------------------------------------------------------
' Subroutinen für das OLED-I2C-Display
' ---------------------------------------------------------------------------

PROCEDURE oled_init
  PAUSE 2                  'etwas warten

  i2c_start
  IF i2c_write(OLED_I2C_ADDR)=0 THEN
    PRINT "OLED-I2C-Display reagiert nicht!"
    END
  END IF

  i2c_write &h00           '0x00 for command, 0x40 for data
  FOR a=0 TO 26
    i2c_write LOOKTABBYTE(init_sequence,a)
  NEXT a
  i2c_stop

  oled_command(OLED_DISP_ON)
  RETURN
END PROCEDURE

PROCEDURE oled_putc(c)
  c=c-32
  FOR a=0 TO 5
    POKE bitarrayaddr+actualIndex+a,LOOKTABBYTE(ssd1306oled_font6x8,c*6+a)
  NEXT a
  ADD actualIndex,6
  RETURN
END PROCEDURE

PROCEDURE oled_puts(c)
  w=0
  WHILE c                        'String in Tabelle suchen
    WHILE LOOKTABBYTE(texte,w)
      ADD w,1
    WEND
    ADD w,1
    SUB c,1
  WEND

  WHILE LOOKTABBYTE(texte,w)     'String Zeichen für Zeichen ausgeben
    oled_putc LOOKTABBYTE(texte,w)
    ADD w,1
  WEND

  RETURN
END PROCEDURE

PROCEDURE oled_command(c)
  i2c_start
  i2c_write OLED_I2C_ADDR
  i2c_write &h00           '0x00 for command, 0x40 for data
  i2c_write c
  i2c_stop
  RETURN
END PROCEDURE

PROCEDURE oled_data(data)
  i2c_start
  i2c_write OLED_I2C_ADDR
  i2c_write &h40           '0x00 for command, 0x40 for data
  i2c_write data
  i2c_stop
  RETURN
END PROCEDURE

' x von 0 bis 127, y von 0 bis 63 (in 8-er Schritten)

PROCEDURE oled_gotoxy(x,y)
  i2c_start
  i2c_write OLED_I2C_ADDR
  i2c_write &h00           '0x00 for command, 0x40 for data
  i2c_write &hb0+(y SHR 3)
  i2c_write &h21
  i2c_write x
  i2c_write &h7f
  i2c_stop
  RETURN
END PROCEDURE

' y von 0 bis 7, x von 0 bis 20

PROCEDURE oled_locate(y,x)
  IF x>20 OR y>7 THEN RETURN
  actualIndex = x*6+y*DISPLAY_WIDTH
  i2c_start
  i2c_write OLED_I2C_ADDR
  i2c_write &h00           '0x00 for command, 0x40 for data
  i2c_write &hb0+y
  i2c_write &h21
  i2c_write x*6            'one char: 6 pixel width
  i2c_write &h7f
  i2c_stop
  RETURN
END PROCEDURE

PROCEDURE oled_home
  oled_locate 0, 0
  RETURN
END PROCEDURE

PROCEDURE oled_clrscr
  FOR w=0 TO 1023
    POKE bitarrayaddr+w,0
  NEXT w
  oled_refresh
  oled_home
  RETURN
END PROCEDURE

PROCEDURE oled_refresh
  oled_home

  i2c_start
  i2c_write OLED_I2C_ADDR
  i2c_write &h40           '0x00 for command, 0x40 for data

  FOR w=0 TO 1023
    i2c_write PEEK(bitarrayaddr+w)
  NEXT w

  i2c_stop
  RETURN
END PROCEDURE

' ---------------------------------------------------------------------------
' Tabellen
' ---------------------------------------------------------------------------

' Initialization Sequence für OLED-I2C-Display
' nach lcd_text.zip

TABLE init_sequence BYTE
    OLED_DISP_OFF, ' Display OFF (sleep mode)
    &h20, &h00,   ' Set Memory Addressing Mode
                  ' 00=Horizontal Addressing Mode; 01=Vertical Addressing Mode;
                  ' 10=Page Addressing Mode (RESET); 11=Invalid
    &hB0,         ' Set Page Start Address for Page Addressing Mode, 0-7
    &hC8,         ' Set COM Output Scan Direction
    &h00,         ' --set low column address
    &h10,         ' --set high column address
    &h40,         ' --set start line address
    &h81, &h3F    ' Set contrast control register
    &hA1,         ' Set Segment Re-map. A0=address mapped; A1=address 127 mapped.
    &hA6,         ' Set display mode. A6=Normal; A7=Inverse
    &hA8, 63      ' DISPLAY_HEIGHT-1    ' Set multiplex ratio(1 to 64)
    &hA4,         ' Output RAM to Display
                  ' &hA4=Output follows RAM content; &hA5,Output ignores RAM content
    &hD3, &h00    ' Set display offset. 00 = no offset
    &hD5,         ' --set display clock divide ratio/oscillator frequency
    &hF0,         ' --set divide ratio
    &hD9, &h22    ' Set pre-charge period
    &hDA, &h12    ' Set com pins hardware configuration
    &hDB,         ' --set vcomh
    &h20,         ' &h20,0.77xVcc
    &h8D, &h14    ' Set DC-DC enable
END TABLE

' Font 6*8 für OLED-I2C-Display
' nach lcd_gfx.zip

TABLE ssd1306oled_font6x8 BYTE
    &h00, &h00, &h00, &h00, &h00, &h00, ' sp
    &h00, &h00, &h00, &h2f, &h00, &h00, ' !
    &h00, &h00, &h07, &h00, &h07, &h00, ' "
    &h00, &h14, &h7f, &h14, &h7f, &h14, ' #
    &h00, &h24, &h2a, &h7f, &h2a, &h12, ' $
    &h00, &h62, &h64, &h08, &h13, &h23, ' %
    &h00, &h36, &h49, &h55, &h22, &h50, ' &
    &h00, &h00, &h05, &h03, &h00, &h00, ' '
    &h00, &h00, &h1c, &h22, &h41, &h00, ' (
    &h00, &h00, &h41, &h22, &h1c, &h00, ' )
    &h00, &h14, &h08, &h3E, &h08, &h14, ' *
    &h00, &h08, &h08, &h3E, &h08, &h08, ' +
    &h00, &h00, &h00, &hA0, &h60, &h00, ' ,
    &h00, &h08, &h08, &h08, &h08, &h08, ' -
    &h00, &h00, &h60, &h60, &h00, &h00, ' .
    &h00, &h20, &h10, &h08, &h04, &h02, ' /
    &h00, &h3E, &h51, &h49, &h45, &h3E, ' 0
    &h00, &h00, &h42, &h7F, &h40, &h00, ' 1
    &h00, &h42, &h61, &h51, &h49, &h46, ' 2
    &h00, &h21, &h41, &h45, &h4B, &h31, ' 3
    &h00, &h18, &h14, &h12, &h7F, &h10, ' 4
    &h00, &h27, &h45, &h45, &h45, &h39, ' 5
    &h00, &h3C, &h4A, &h49, &h49, &h30, ' 6
    &h00, &h01, &h71, &h09, &h05, &h03, ' 7
    &h00, &h36, &h49, &h49, &h49, &h36, ' 8
    &h00, &h06, &h49, &h49, &h29, &h1E, ' 9
    &h00, &h00, &h36, &h36, &h00, &h00, ' :
    &h00, &h00, &h56, &h36, &h00, &h00, ' ;
    &h00, &h08, &h14, &h22, &h41, &h00, ' <
    &h00, &h14, &h14, &h14, &h14, &h14, ' =
    &h00, &h00, &h41, &h22, &h14, &h08, ' >
    &h00, &h02, &h01, &h51, &h09, &h06, ' ?
    &h00, &h32, &h49, &h59, &h51, &h3E, ' @
    &h00, &h7C, &h12, &h11, &h12, &h7C, ' A
    &h00, &h7F, &h49, &h49, &h49, &h36, ' B
    &h00, &h3E, &h41, &h41, &h41, &h22, ' C
    &h00, &h7F, &h41, &h41, &h22, &h1C, ' D
    &h00, &h7F, &h49, &h49, &h49, &h41, ' E
    &h00, &h7F, &h09, &h09, &h09, &h01, ' F
    &h00, &h3E, &h41, &h49, &h49, &h7A, ' G
    &h00, &h7F, &h08, &h08, &h08, &h7F, ' H
    &h00, &h00, &h41, &h7F, &h41, &h00, ' I
    &h00, &h20, &h40, &h41, &h3F, &h01, ' J
    &h00, &h7F, &h08, &h14, &h22, &h41, ' K
    &h00, &h7F, &h40, &h40, &h40, &h40, ' L
    &h00, &h7F, &h02, &h0C, &h02, &h7F, ' M
    &h00, &h7F, &h04, &h08, &h10, &h7F, ' N
    &h00, &h3E, &h41, &h41, &h41, &h3E, ' O
    &h00, &h7F, &h09, &h09, &h09, &h06, ' P
    &h00, &h3E, &h41, &h51, &h21, &h5E, ' Q
    &h00, &h7F, &h09, &h19, &h29, &h46, ' R
    &h00, &h46, &h49, &h49, &h49, &h31, ' S
    &h00, &h01, &h01, &h7F, &h01, &h01, ' T
    &h00, &h3F, &h40, &h40, &h40, &h3F, ' U
    &h00, &h1F, &h20, &h40, &h20, &h1F, ' V
    &h00, &h3F, &h40, &h38, &h40, &h3F, ' W
    &h00, &h63, &h14, &h08, &h14, &h63, ' X
    &h00, &h07, &h08, &h70, &h08, &h07, ' Y
    &h00, &h61, &h51, &h49, &h45, &h43, ' Z
    &h00, &h00, &h7F, &h41, &h41, &h00, ' [
    &h00, &h55, &h2A, &h55, &h2A, &h55, ' \
    &h00, &h00, &h41, &h41, &h7F, &h00, ' ]
    &h00, &h04, &h02, &h01, &h02, &h04, ' ^
    &h00, &h40, &h40, &h40, &h40, &h40, ' _
    &h00, &h00, &h01, &h02, &h04, &h00, ' '
    &h00, &h20, &h54, &h54, &h54, &h78, ' a
    &h00, &h7F, &h48, &h44, &h44, &h38, ' b
    &h00, &h38, &h44, &h44, &h44, &h20, ' c
    &h00, &h38, &h44, &h44, &h48, &h7F, ' d
    &h00, &h38, &h54, &h54, &h54, &h18, ' e
    &h00, &h08, &h7E, &h09, &h01, &h02, ' f
    &h00, &h18, &hA4, &hA4, &hA4, &h7C, ' g
    &h00, &h7F, &h08, &h04, &h04, &h78, ' h
    &h00, &h00, &h44, &h7D, &h40, &h00, ' i
    &h00, &h40, &h80, &h84, &h7D, &h00, ' j
    &h00, &h7F, &h10, &h28, &h44, &h00, ' k
    &h00, &h00, &h41, &h7F, &h40, &h00, ' l
    &h00, &h7C, &h04, &h18, &h04, &h78, ' m
    &h00, &h7C, &h08, &h04, &h04, &h78, ' n
    &h00, &h38, &h44, &h44, &h44, &h38, ' o
    &h00, &hFC, &h24, &h24, &h24, &h18, ' p
    &h00, &h18, &h24, &h24, &h18, &hFC, ' q
    &h00, &h7C, &h08, &h04, &h04, &h08, ' r
    &h00, &h48, &h54, &h54, &h54, &h20, ' s
    &h00, &h04, &h3F, &h44, &h40, &h20, ' t
    &h00, &h3C, &h40, &h40, &h20, &h7C, ' u
    &h00, &h1C, &h20, &h40, &h20, &h1C, ' v
    &h00, &h3C, &h40, &h30, &h40, &h3C, ' w
    &h00, &h44, &h28, &h10, &h28, &h44, ' x
    &h00, &h1C, &hA0, &hA0, &hA0, &h7C, ' y
    &h00, &h44, &h64, &h54, &h4C, &h44, ' z
    &h00, &h00, &h08, &h77, &h41, &h00, ' {
    &h00, &h00, &h00, &h63, &h00, &h00, ' ¦
    &h00, &h00, &h41, &h77, &h08, &h00, ' }
    &h00, &h08, &h04, &h08, &h08, &h04, ' ~
END TABLE

' Tabelle mit Texten/Strings

TABLE texte BYTE
  "Open-Maxi",0
  "Open-Control-Projekt",0
  "Dritter String",0
END TABLE

' ---------------------------------------------------------------------------
' Die I2C-Routinen einbinden
' ---------------------------------------------------------------------------

INCLUDE "omax_i2c.pro"

' ---------------------------------------------------------------------------
' Die Bit-Feld-Routinen einbinden
' ---------------------------------------------------------------------------

INCLUDE "bitarray.pro"

' ---------------------------------------------------------------------------
' Die Firmware-Routinen einbinden
' ---------------------------------------------------------------------------

INCLUDE "om_fw.pro"

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


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

 Antwort schreiben

Bisherige Antworten: