Having the peripherals set-up I looked at the adafruit library. More specificially the display() and begin() functions. The begin is the initialization routine in the adafruit 1306 library. Converting begin() function to assembly looks like the following:
OLED_init:
sbi PORTB, rst ; rst high
ldi r18, 21 ; delay 1ms
ldi r19, 199
L1: dec r19
brne L1
dec r18
brne L1
cbi PORTB, rst ;rst low
ldi r18, 208 ; delay 10ms
ldi r19, 202
L2: dec r19
brne L2
dec r18
brne L2
sbi PORTB, rst ; rst high
mcommand 0xae
mcommand 0xd5
mcommand 0x80
mcommand 0xa8
mcommand 63
mcommand 0xD3
mcommand 0x0
mcommand 0x40
mcommand 0x8d
mcommand 0x14
mcommand 0x20
mcommand 0x00
mcommand (0xa8|0x1);
mcommand 0xc8
mcommand 0xDA
mcommand 0x12
mcommand 0x81
mcommand 0xcf
mcommand 0xd9
mcommand 0xf1
mcommand 0xdb
mcommand 0x40
mcommand 0xa4
mcommand 0xa6
mcommand 0x2e
mcommand 0xaf
ret
I used http://www.bretmulvey.com/avrdelay.html for the delay assembly code.
the mcommand is a macro:
.macro mcommand
ldi r20, @0
rcall command
.endmacro
and the command subroutine looks like the following (recall to send spi data I put the data byte in r20):
command:
sbi PORTB, cs ;cs high
cbi PORTB, dc ;dc low
cbi PORTB, cs ;cs low
rcall spi_send
sbi PORTB, cs; cs high
ret
Discussions
Become a Hackaday.io Member
Create an account to leave a comment. Already have an account? Log In.