![]() ![]() INFO - FAQ - CC2-Forum - CCPro-Forum |
|
' ============================================================================ ' 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 |