Fun with SX/B and an OLED
Hi all,
I've been playing with an OLED (Organic Light Emitting Diode) display and SX/B. Think of OLEDs as looking similar to micro-sized plasmas in terms of colour richness and black levels -- the organic compounds fluoresce directly without backlight.
The display I used was from Sparkfun. The code to initialize and drive the display to produce some pretty circle patterns is below.
Ping me with comments, suggestions, or questions! [noparse]:)[/noparse]
-marc
Post Edited (geekything) : 12/31/2006 5:58:16 PM GMT
I've been playing with an OLED (Organic Light Emitting Diode) display and SX/B. Think of OLEDs as looking similar to micro-sized plasmas in terms of colour richness and black levels -- the organic compounds fluoresce directly without backlight.
The display I used was from Sparkfun. The code to initialize and drive the display to produce some pretty circle patterns is below.
Ping me with comments, suggestions, or questions! [noparse]:)[/noparse]
-marc
' =========================================================================
'
' File...... OLED.SXB
' Purpose... OLED Test Program
' Author.... Marc Nicholas
' E-mail.... geekything (at) gmail (dot) com
' Started... 20-Aug-2006
' Updated... 31-Dec-2006
' Language.. SX/B 1.5
'
' =========================================================================
' -------------------------------------------------------------------------
' Program Description
' -------------------------------------------------------------------------
'
' Simple program to init an SSD1399-base dOLED and display random patterns
' See here for the actual device:
' http://www.sparkfun.com/commerce/product_info.php?products_id=712
'
' This example drives the display in pseudo-SPI mode rather than bus mode.
'
' Note: you could probably port this to a BASICStamp fairly easily.
'
' -------------------------------------------------------------------------
' Device Settings
' -------------------------------------------------------------------------
DEVICE SX28, OSC4MHZ ' Should work on any SX chip
FREQ 4_000_000 ' 4Mhz internal oscillator, baby!
ID "OLEDTest"
' -------------------------------------------------------------------------
' IO Pins
' -------------------------------------------------------------------------
'
' I'm using 5-bits of Port B.
' Don't try this with Port A pins unless you're familiar with open-drain
' outputs!
SCLK VAR RB.0 ' shift clock -- connect to D0
SOUT VAR RB.1 ' shift data -- connect to D1
CS VAR RB.2 ' chip select -- connect to CS
CMD VAR RB.3 ' [noparse][[/noparse]D]ata/[noparse][[/noparse]C]ommand select -- connect to D/C
RS VAR RB.4 ' Reset line -- connect to RES
' -------------------------------------------------------------------------
' Constants
' -------------------------------------------------------------------------
' -------------------------------------------------------------------------
' Variables
' -------------------------------------------------------------------------
cycle VAR BYTE
params VAR BYTE
tmpB1 VAR BYTE
tmpB2 VAR BYTE
tmpB3 VAR BYTE
tmpB4 VAR BYTE
i VAR WORD
rand1 VAR BYTE
rand2 VAR BYTE
rand3 VAR BYTE
rand4 VAR BYTE
rand5 VAR BYTE
rand6 VAR BYTE
' =========================================================================
PROGRAM Start
' =========================================================================
' -------------------------------------------------------------------------
' Subroutine Declarations
' -------------------------------------------------------------------------
Write_OLED SUB 1,4
Write_C SUB 1
Write_D SUB 1
' -------------------------------------------------------------------------
' Program Code
' -------------------------------------------------------------------------
Start:
' Set Port B to be output
TRIS_B = %00000000
' Wait 100ms for things to settle down! Probably not really necessary
PAUSE 100
' Toggle chip select so that first frame is interpreted and reset the SSD1339
CS = 0
RS = 0
PAUSE 25
CS = 1
RS = 1
' Now comes the OLED setup!
Write_OLED 0xA0, 0x34 ' Set Re-map / Color Depth 0xb4; 262K 8bit R->G->B
Write_OLED 0xE3 ' NOP (No OPeration) commands for padding
Write_OLED 0xA1, 0x01 ' Set display start line
Write_OLED 0xE3
Write_OLED 0xA2, 0x01 ' Set display offset
Write_OLED 0xE3
Write_OLED 0xA6 ' Normal display
Write_OLED 0xE3
Write_OLED 0xAD, 0x8E ' Set Master Configuration
Write_OLED 0xE3
Write_OLED 0xB0, 0x05 ' Power saving mode
Write_OLED 0xE3
Write_OLED 0xB1, 0x11 ' Set pre & discharge
Write_OLED 0xE3
Write_OLED 0xB3, 0xf0 ' clock & frequency
Write_OLED 0xE3
Write_OLED 0xBB, 0x1C, 0x1C, 0x1C ' Set pre-charge voltage of color A B C
Write_OLED 0xE3
Write_OLED 0xbe, 0x1f ' Set VcomH
Write_OLED 0xE3
Write_OLED 0xc1, 0xaa, 0xb4, 0xc8 ' Set contrast current for A B C
Write_OLED 0xE3
Write_OLED 0xc7, 0x0f ' Set master contrast
Write_OLED 0xE3
Write_OLED 0xCA, 0x7f ' Duty = 127
' Write_OLED 0xCA, 132 ' Duty = 132
Write_OLED 0xE3
Write_OLED 0xaf ' Display on
Write_OLED 0xE3
PAUSE 120
Setup:
Write_C 0x8E ' Clear display. We're using commands with more than four byte now
Write_D 0 ' and we have to change the way we talk to the OLED!
Write_D 0
Write_D 130
Write_D 130
Write_OLED 0xE3 ' NOP
PAUSE 100
Write_C 0x92
Write_D 0x01
Write_OLED 0xE3
PAUSE 10
rand1 = 123
rand2 = 0
rand3 = 255
rand4 = 50
rand5 = 150
rand6 = 250
PAUSE 120
Main:
' Main code loop here. We're just going to clear the display and draw random filled circles
Write_OLED 0x92, 0x01 ' Reset
Write_OLED 0xE3
Write_C 0x8E ' Clear
Write_D 0
Write_D 0
Write_D 132
Write_D 132
PAUSE 100
FOR i = 0 to 2500
RANDOM rand1
RANDOM rand2
RANDOM rand3
RANDOM rand4
RANDOM rand5
RANDOM rand6
rand1 = rand1 // 130
rand2 = rand2 // 130
rand3 = rand3 // 64
Write_C 0x86
Write_D rand1
Write_D rand2
Write_D rand3
Write_D rand4
Write_D rand5
Write_D rand6
Write_D rand4
PAUSE 10
NEXT i
GOTO Main
' -------------------------------------------------------------------------
' Subroutine Code
' -------------------------------------------------------------------------
Write_OLED:
cycle = 1
params = __PARAMCNT
tmpB1 = __PARAM1 ' save LSB of value
tmpB2 = __PARAM2
tmpB3 = __PARAM3
tmpB4 = __PARAM4
INC params
DO WHILE cycle < params
IF cycle = 1 THEN
CMD = 0
CS = 0
SHIFTOUT SOUT, SCLK, MSBFIRST, tmpB1,10 ' send the bits
CS = 1
ElSEIF cycle = 2 THEN
CMD = 1
CS = 0
SHIFTOUT SOUT, SCLK, MSBFIRST, tmpB2,10 ' send the bits
CS = 1
ElSEIF cycle = 3 THEN
CMD = 1
CS = 0
SHIFTOUT SOUT, SCLK, MSBFIRST, tmpB3,10 ' send the bits
CS = 1
ElSEIF cycle = 4 THEN
CMD = 1
CS = 0
SHIFTOUT SOUT, SCLK, MSBFIRST, tmpB4,10 ' send the bits
CS = 1
ENDIF
INC cycle
LOOP
RETURN
Write_C:
tmpB1 = __PARAM1
CMD = 0
CS = 0
SHIFTOUT SOUT, SCLK, MSBFIRST, tmpB1,10 ' send the bits
CS = 1
RETURN
Write_D:
tmpB1 = __PARAM1
CMD = 1
CS = 0
SHIFTOUT SOUT, SCLK, MSBFIRST, tmpB1,10 ' send the bits
CS = 1
RETURN
Post Edited (geekything) : 12/31/2006 5:58:16 PM GMT

Comments
Have to tried displaying text on it ? If so, is it readable ?
How much current does the display need ?
Some pics would be great.
Bean.
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Cheap used 4-digit LED display with driver IC·www.hc4led.com
Low power SD Data Logger www.sddatalogger.com
SX-Video Display Modules www.sxvm.com
Stuff I'm selling on ebay http://search.ebay.com/_W0QQsassZhittconsultingQQhtZ-1
"USA Today has come out with a new survey - apparently, three out of every four people make up 75% of the population." - David Letterman
It's a bit-mapped display: there's no onboard text routines. Although there's hardware assisted graphics routines.
That said, someone over on the Sparkfun BB built a 5*7 font for the thing...haven't ported that yet.
The SX is not my final target application (Gumstix is; the SX was just an easy-to-use platform for getting the thing working properly.
-marc
P.S: I'll try and post some pics -- photos really don't do the display justice, however!
P.P.S: You asked about current...I haven't measured yet, but I can tell you it's pretty low from what I've been told.
-marc