Here is all the code BESQUEUT, Too large for copying for forum. Quite an interesting display.
#picaxe 28x2
setfreq m16
symbol maxpos = $7fff
symbol x1=b0
symbol x2=b1
symbol y1=b2
symbol y2=b3
symbol px=b4
symbol py=b5
symbol nt=b6
symbol yrow=b7
symbol bitpos=b8
symbol screenbit=b9
symbol temp1=b10
symbol temp2=b11
symbol sx=b12
symbol sy=b13
symbol dx=w8
symbol dy=w9
symbol er=w10
symbol tempvar1=w11
symbol tempvar2=w12
symbol e2=w13
;
SYMBOL DispNum = W12
SYMBOL row = b25
SYMBOL col = b26
SYMBOL temp = b27
SYMBOL aByte = b28
SYMBOL index = b29
SYMBOL TWI_BUFFER_LENGTH = 32
SYMBOL SSD1306_LCDWIDTH = 128
SYMBOL SSD1306_LCDHEIGHT = 64
SYMBOL SSD1306_SETCONTRAST =0x81
SYMBOL SSD1306_DISPLAYALLON_RESUME =0xA4
SYMBOL SSD1306_DISPLAYALLON =0xA5
SYMBOL SSD1306_NORMALDISPLAY =0xA6
SYMBOL SSD1306_INVERTDISPLAY =0xA7
SYMBOL SSD1306_DISPLAYOFF =0xAE
SYMBOL SSD1306_DISPLAYON =0xAF
SYMBOL SSD1306_SETDISPLAYOFFSET =0xD3
SYMBOL SSD1306_SETCOMPINS =0xDA
SYMBOL SSD1306_SETVCOMDETECT =0xDB
SYMBOL SSD1306_SETDISPLAYCLOCKDIV =0xD5
SYMBOL SSD1306_SETPRECHARGE =0xD9
SYMBOL SSD1306_SETMULTIPLEX =0xA8
SYMBOL SSD1306_SETLOWCOLUMN =0x00
SYMBOL SSD1306_SETHIGHCOLUMN =0x10
SYMBOL SSD1306_SETSTARTLINE =0x40
SYMBOL SSD1306_MEMORYMODE =0x20
SYMBOL SSD1306_COLUMNADDR =0x21
SYMBOL SSD1306_PAGEADDR =0x22 ; Page 0-7 represents line 0 - 7
SYMBOL SSD1306_COMSCANINC =0xC0
SYMBOL SSD1306_COMSCANDEC =0xC8
SYMBOL SSD1306_SEGREMAP =0xA0 | 1
SYMBOL SSD1306_CHARGEPUMP =0x8D
SYMBOL SSD1306_EXTERNALVCC =0x1
SYMBOL SSD1306_SWITCHCAPVCC =0x2
;Scrolling SYMBOLs
SYMBOL ACTIVATE_SCROLL =0x2F
SYMBOL DEACTIVATE_SCROLL =0x2E
SYMBOL SET_VERTICAL_SCROLL_AREA =0xA3
SYMBOL RIGHT_HORIZONTAL_SCROLL =0x26
SYMBOL LEFT_HORIZONTAL_SCROLL =0x27
SYMBOL VERT_AND_RIGHT_HORIZONTAL =0x29
SYMBOL VERT_AND_LEFT_HORIZONTAL =0x2A
;**************************************************************
SYMBOL SSD1306_ADDR = $3C << 1 ; this is the I2C address ($78)
main:
gosub InitialiseLcd
let x1=0:let y1=0:let y2=63
for x2=0 to 127 step 16
let y1=0
let x1=0
gosub line
next x2
let x1=127:let y1=0:let y2=63
for x2=0 to 127 step 16
let y1=0
let x1=127
gosub line
next x2
let x1=127:let y1=63:let y2=0
for x2=0 to 127 step 16
let y1=63
let x1=127
gosub line
next x2
let x1=0:let y1=63:let y2=0
for x2=0 to 127 step 16
let y1=63
let x1=0
gosub line
next x2
gosub sendbuffer
do:loop
;----------------------------------------------------------------
sendbuffer:
for ptr=0 to 1023
hi2cout (0x40,@ptr)
next ptr
return
plot:
let yrow = py / 8 ; find row
let bitpos = yrow * 8
let screenbit = py - bitpos ; pixel position
let ptr = yrow * 128 + px ; screen byte
let bitpos=0
setbit bitpos,screenbit ;pixel mask
@ptr = @ptr or bitpos ; OR onto screen byte
return
line:
if x1 < x2 then :let sx = 1 :let dx = x2 - x1:else let sx = -1 :let dx = x1 - x2 : endif
if y1 < y2 then :let sy = 1 :let dy = y2 - y1:else let sy = -1 :let dy = y1 - y2 : endif
if dx > dy then :let er = dx:else let er = dy : endif ; Don't divide "er" by 2
let dx =dx+dx :let dy =dy+dy
if dx > dy then
let py=y1
if x1<x2 then
for px=x1 to x2
gosub plot
let er = er - dy
if er > maxpos then ; It's Negative
let er = er + dx:let py = py + sy
endif
next px
else
for px=x1 to x2 step-1
gosub plot
let er = er - dy
if er > maxpos then ; It's Negative
let er = er + dx:let py = py + sy
endif
next px
endif
else
let px=x1
if y1<y2 then
for py=y1 to y2
gosub plot
let er = er - dx
if er > maxpos then
let er = er + dy:let px = px + sx
endif
next py
else
for py=y1 to y2 step-1
gosub plot
let er = er - dx
if er > maxpos then
let er = er + dy:let px = px + sx
endif
next py
endif
endif
return
InitialiseLcd:
PAUSE 500
i2cslave SSD1306_ADDR, i2cfast, i2cbyte
for index = 0 TO 23
read index,aByte
gosub DirectSendCmd
next
eeprom 0, (SSD1306_DISPLAYOFF); ; 0xAE
eeprom 1, (SSD1306_SETDISPLAYCLOCKDIV); ; 0xD5
eeprom 2, (0x80); ; the suggested ratio 0x80
eeprom 3, (SSD1306_SETMULTIPLEX); ; 0xA8
eeprom 4, (0x3F);
eeprom 5, (SSD1306_SETDISPLAYOFFSET); ; 0xD3
eeprom 6, (0x0); ; no offset
eeprom 7, (SSD1306_SETSTARTLINE); ; line #0
eeprom 8, (SSD1306_CHARGEPUMP); ; 0x8D
eeprom 9, (0x14); ; INTERNAL VCC
eeprom 10, (SSD1306_MEMORYMODE); ; 0x20
eeprom 11, (0x00); ; Horiz mode. 0x0 act like ks0108
eeprom 12, (SSD1306_SEGREMAP);
eeprom 13, (SSD1306_COMSCANDEC);
eeprom 14, (SSD1306_SETCOMPINS); ; 0xDA
eeprom 15, (0x12);
eeprom 16, (SSD1306_SETCONTRAST); ; 0x81
eeprom 17, (0xCF) ; INTERNAL VCC
eeprom 18, (SSD1306_SETPRECHARGE); ; 0xd9
eeprom 19, (0xF1) ; INTERNAL VCC
eeprom 20, (SSD1306_SETVCOMDETECT); ; 0xDB
eeprom 21, (0x40);
eeprom 22, (SSD1306_DISPLAYALLON_RESUME); ; 0xA4
eeprom 23, (SSD1306_DISPLAYON); ; 0xA4
'eeprom 24, (SSD1306_DISPLAYALLON); ; 0xA5
return
DirectSendCmd:
' Commands are preceeded by a 0 filled byte
writei2c (0,abyte)
return