MEL PICBASIC Forum - Winstar WS0010 OLED Display Used in SPI Mode


  • Winstar WS0010 OLED Display Used in SPI Mode

    This short demo code provides the basis for using Winstar WS0010 based OLED Displays in the SPI (3-wire) connection mode. If other Forum members are interested, I could pursue rolling this into a library file compatible with various size displays. Wiring connections are illustrated in Winstar's WS0010 App Note Page 8. There are also 3 option jumpers that need to be modified in order to convert the display to SPI mode from 4-bit/8-bit parallel mode. These are:

    Remove the jumper "L_CS_H" that bridges the "L_CS" connection
    Remove the jumper "J68_J80"
    Move the jumper "H_PS_L" to the "PS_L" position from its existing "H_PS" position.

    Changing these jumper options requires a bit of soldering skill. The PCB is fragile and it's very easy to damage the copper pads and render the display inoperative.

    Code:
    '****************************************************************
    '*  Name    : 2x8_OLED_SPI_Display_Demo                         *
    '*  Author  : Roberts                                           *
    '*  Notice  : Copyright (c) 2019                                *
    '*          : All Rights Abandoned                              *
    '*  Date    : 11/24/2019                                        *
    '*  Version : 1.0                                               *
    '*  Notes   : Demo code that writes to Vishay OLED-008N002A     *
    '*          : 2x8 character display via SPI interface           *
    '****************************************************************
    '
    ' THIS OLED DEMO PROGRAM USES A PIC16F1619 MICROCONTROLLER IN THE MICROCHIP CURIOSITY BOARD
    '
    ' Vishay (and several other) OLED character OLED displays are based on the Winstar WS0010 Controller
    ' whose command language closely emulates Hitachi's HD44780.  The WS0010 also accommodates
    ' an SPI-like 4-wire interface (CS, MOSI, MISO, CLK), that can be efficiently interfaced to small
    ' pin-count PIC uCs.  In most applications, only a 3-wire chip-select/data/clock interface is needed.
    ' However, the WS0010 controller requires a 10-bit clock/data sequence rather than the SPI standard 8-bit
    ' sequence in order to include the display's "RS" and "R/W" command bits.
    ' This demo code uses PCP's SHIFTOUT command with 16-bit variables truncated to 10-bits to conform with
    ' the display's interface requirements.
    '
    ' While PBP's LCDOUT command uses $FE to designate a display command input in 4-bit and 8-bit parallel wired 
    ' modes, this code directly sets the RS=0 to write to the command memory and RS=1 to write to the character memory.
    ' 
    ' The following demo features these program segments:
    '       Microcontroller configuration
    '       Initialization and Variable Declarations
    '       OLED Initialization
    '       Looping Display of Demo Program Name ("2x8 OLED SPI TEST")
    '
    ' The PIC16F1619 and other EMR core PICs have the LATx.x pin write function that overcomes read/modify/write 
    ' conflicts that can occur with PORTx.x pin writes.  If this demo code is run on BL or MR core PICs,
    ' assigning the CS pin function to a different port is necessary, and relocating the Function Set command to
    ' the end of the OLED initialization sequence might be required to ensure the OLED adopts 2-line mode.
    '************************************************************************************************************
    
    '************************** Microcontroller Configuration PIC16F1619 ****************************************
    DISABLE DEBUG            ' Disable ICD code for this section
    
                             ' Microcontroller Configuration from PBP's "PIC***.info" files (see Ref Manual Pg. 100)
                             ' The following configuration is for a PIC16F1619 
    #CONFIG
        __config _CONFIG1,  _FOSC_INTOSC & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _BOREN_ON & _CLKOUTEN_OFF
        __config _CONFIG2,  _WRT_OFF & _PPS1WAY_OFF & _ZCD_OFF & _PLLEN_OFF & _STVREN_ON & _BORV_LO & _LVP_OFF
        __config _CONFIG3,  _WDTCPS_WDTCPS4 & _WDTE_ON & _WDTCWS_WDTCWS100 & _WDTCCS_LFINTOSC
    #ENDCONFIG
    
    OSCCON = %01110000         ' Set internal osc to 8MHz  (IRCF<3:0> = %1101=4 MHz, %1110=8 MHz, %1111=16 MHz)    
    DEFINE OSC 8             ' Tell PBP that the device will clock at 16MHz
    
    ENABLE DEBUG             ' Enable ICD for code that follows
    
    '************************** Initialization and Variable Declarations *****************************************
    TRISB.4 = 0      ' Set CS to output
    TRISB.5 = 0      ' Set uC SCK pin to output
    TRISB.6 = 0      ' Set uC SI pin to output
    
                    ' SPI signals use LATx.x assignments to prevent read/modify/write conflicts on a single I/O port
    CS  Var LATB.4  ' uC chip select output pin
    SCK Var LATB.5  ' uC clock out pin
    SI  Var LATB.6  ' uC data out / LCD Data in pin
    
    CHR_x VAR WORD   ' variable name of characters sent to display
    i VAR BYTE       ' loop counter variable    
    CS = 1           ' Disable SPI device select CS for OLED 
    
    '************************** SPI OLED Initialization Sequence ************************************************* 
                       'Each command is 10 bits with "00" RS & RW prefix (RS=0,RW=0)
                       'Example: $0028 = %0000 0000 0010 1000 -> 10-bit truncated = %0000101000
                       
        CS = 0                                  'Enable LCD on SPI bus
        SHIFTOUT SI, SCK, 5, [$0028\10]         'Function Set - D/L=0, N=2, Default Font
        CS = 1 : PAUSE 1 : CS = 0               'Disable CS / Pause / Enable CS
        SHIFTOUT SI, SCK, 5, [$0008\10]         'Display OFF
        CS = 1 : PAUSE 1 : CS = 0               'Disable CS / Pause / Enable CS
        SHIFTOUT SI, SCK, 5, [$0006\10]         'Entry Mode - Cursor moves right
        CS = 1 : PAUSE 1 : CS = 0               'Disable CS / Pause / Enable CS
        SHIFTOUT SI, SCK, 5, [$0001\10]         'Clear Display
        CS = 1 : PAUSE 30 : CS = 0              'Disable CS / Pause / Enable CS
        SHIFTOUT SI, SCK, 5, [$0002\10]         'Return Home (line 1 / position 1)
        CS = 1 : PAUSE 30 : CS = 0              'Disable CS / Pause / Enable CS
        SHIFTOUT SI, SCK, 5, [$000C\10]         'Display ON
        CS = 1                                  'Disable CS
        
    '************************** Demo Program Name Display ********************************************************    
                 'This sequence demonstates sending a character string to the OLED display
                 'Each display character is 10 bits with "10" RS & RW prefix (RS=1,RW=0)
                 'Example: $0200 = %0000 0010 0000 0000
                 '         CHR_x = %          0100 0100 (the letter "D")
                 'Bitwise OR'd and 10-bit truncated = %1001000100
    main:
        CS = 0
        SHIFTOUT SI, SCK, 5, [$0080\10]              'Start at Line 1 / Position 1
        CS = 1
        
          For i = 0 to 7
          LOOKUP i, ["2x8 OLED"],CHR_x               'Get 1 character at a time from the string
          CS = 0
          SHIFTOUT SI, SCK, 5, [($0200 | CHR_x)\10]  'Bitwise OR to create 10-bit data sequence with RS=1
          CS = 1
          Pause 100                                  'Output the characters at 1/10 second intervals 
          Next i                                     'Output all 8 characters on line 1
        Pause 500                                    'Pause 1/2 second
        
        CS = 0
        SHIFTOUT SI, SCK, 5, [$00C0\10]              'Start at Line 2 / Position 1
        CS = 1
        
          For i = 0 to 7
          LOOKUP i, ["SPI TEST"],CHR_x               'Get 1 character at a time from the string
          CS = 0
          SHIFTOUT SI, SCK, 5, [($0200 | CHR_x)\10]  'Bitwise OR to create 10-bit data sequence with RS=1
          CS = 1
        Pause 100                                    'Output the characters at 1/10 second intervals
        Next i                                       'Output all 8 characters on line 2
        PAUSE 2000                                   'Pause 2 seconds after both lines are displayed
        
        CS = 0                                       'Enable CS
        SHIFTOUT SI, SCK, 5, [$0001\10]              'Clear Display
        CS = 1 : PAUSE 1000                          'Disable CS / Pause 1 second with blank display 
        
    Goto main                                        'Repeat forever
    This article was originally published in forum thread: Winstar WS0010 OLED Display Used in SPI Mode started by ChuckR View original post