I bought a OLED display on ebay saying it had a SSD1306 chip, trying running some code from here and I got a display full of noise
Turns out it has SH1106 driver
I modified the code here to work with it on 18F877
this draws a box around the display
<code>
'OLED driver 16F877
'SH1106 driver
'NOT SSD1306
'==========================MCU SETUP============================================
Include "modedefs.bas"
DEFINE OSC 8
ADCON0=0
ADCON1=7
TRISA=%00111111
TRISB=%00000001
TRISC=0
TRISD=0
TRISE=0
PORTC=$FF
'==============================Variables========== =============================
I2CDevice var byte
SCL var PortC.3 ' I2C Clock PortC.3
SDA var PortC.4 ' I2C Data PortC.4
DC VAR byte' "DATA OR COMMAND", $40=DATA; $0=COMMAND
LCD_DATA VAR BYTE
COM VAR BYTE' COMMAND
I VAR BYTE
J VAR BYTE
X VAR BYTE' LCD Column POSITION (0 TO 127)
Y VAR BYTE'LCD Line POSITION FOR PAGE MODE(0 TO 7)
Xlow VAR BYTE 'Low 4 bits of X
Xhigh VAR BYTE 'High 4 bits of X
CLEAR
'================================================= ============================
I2CDevice = $78 ' Display = $78,
PAUSE 500
'=========================lcd initialization====================================
DC = 0
INIT:
I2CWrite SDA,SCL,I2CDevice,[DC,$AE]'Display Off
pause 10
I2CWrite SDA,SCL,I2CDevice,[DC,$D3,$00]' Set offset to 0
I2CWrite SDA,SCL,I2CDevice,[DC,$40]' Set display start line 0
I2CWrite SDA,SCL,I2CDevice,[DC,$8D,$14]' Set Charge Pump Internal, usually needed
'I2CWrite SDA,SCL,I2CDevice,[DC,$20,$10]' Page adressing mode
I2CWrite SDA,SCL,I2CDevice,[DC,$A1]' set column 0 as start
i2cwrite sda,scl,I2CDevice,[DC,$C8]'
I2CWrite SDA,SCL,I2CDevice,[DC,$DA,$12]' set COM pins = 128x64=$12 128x32=$02'
I2CWrite SDA,SCL,I2CDevice,[DC,$81,$01]' Set contrast to low
I2CWrite SDA,SCL,I2CDevice,[DC,$A4]' display on continue
I2CWrite SDA,SCL,I2CDevice,[DC,$A6]' $A6=NORMAL MODE;$A7=INVERSE MODE
I2CWrite SDA,SCL,I2CDevice,[DC,$AF]'Display On
pause 500
'================================================= ==============================
GOSUB CLEAR_LCD
pause 500
MAIN:
gosub CLEAR_LCD
pause 1000
gosub BOX1
pause 1000
GOTO MAIN
'======================Send data============================================== =
SEND_DATA:
DC=$40
I2CWrite SDA,SCL,I2CDevice,[DC,LCD_DATA]
RETURN
'================================================= ==============================
'======================Send Command=========================================== ==
SEND_COMMAND:
DC=0
I2CWrite SDA,SCL,I2CDevice,[DC,COM]
RETURN
'================================================= ==============================
'==============================clear lcd========================================
CLEAR_LCD:
X=2
Y=0
LCD_DATA=$00
'Send 0 to every column in every line
FOR Y=0 TO 7
gosub SET_XY
FOR I=0 TO 127
GOSUB SEND_DATA
NEXT I
NEXT Y
RETURN
'================================================= ==============================
BOX1:
FOR Y = 0 TO 7
X=2
GOSUB SET_XY
LCD_DATA=%11111111
GOSUB SEND_DATA
X=129
GOSUB SET_XY
GOSUB SEND_DATA
NEXT Y
FOR X = 3 TO 128
Y=0
GOSUB SET_XY
LCD_DATA=%00000001
GOSUB SEND_DATA
Y=7
GOSUB SET_XY
LCD_DATA=%10000000
GOSUB SEND_DATA
NEXT
RETURN
'===========================================SET X AND Y=========================
SET_XY:
COM = $B0
COM = COM + Y '<<<--- SET PAGE ADDRESS %1011DDDD
GOSUB SEND_COMMAND
Xhigh = X >> 4
Xlow = X &$0F
COM=Xlow '<<<--- SET COL ADDRESS LOW bits %0000DDDD
GOSUB SEND_COMMAND
Xhigh.4 = 1
COM = Xhigh '<<<--- SET COL ADDRESS HIGH bits %0001DDDD
GOSUB SEND_COMMAND
RETURN
'================================================= ==============================
END
</code>
Bookmarks