PDA

View Full Version : Winstar WS0010 OLED Display Used in SPI Mode



ChuckR
- 26th November 2019, 18:27
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.



'************************************************* ***************
'* 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