SSD1306 OLED (72x40) I2C display from scratch


+ Reply to Thread
Results 1 to 40 of 74

Hybrid View

  1. #1
    Join Date
    Aug 2006
    Location
    SWITZERLAND (french speaking)
    Posts
    938


    Did you find this post helpful? Yes | No

    Default SSD1306 OLED (72x40) I2C display from scratch

    Okay, found!

    Name:  VerticalAddressingMode.png
Views: 8278
Size:  85.7 KB
    Roger

  2. #2
    Join Date
    Aug 2006
    Location
    SWITZERLAND (french speaking)
    Posts
    938


    Did you find this post helpful? Yes | No

    Default SSD1306 OLED (72x40) I2C display from scratch

    Here is a simple code to get started with this 72x40 display.

    I also include the SSD1306 command and display's datasheets.

    Since I use EXCEL to design characters, here's the sheet you may want to have a look at.

    And again, lots of thanks to Richard

    Name:  Display example.png
Views: 9084
Size:  513.8 KB
    Attached Images Attached Images
    Attached Files Attached Files
    Roger

  3. #3
    Join Date
    May 2013
    Location
    australia
    Posts
    2,653


    Did you find this post helpful? Yes | No

    Default Re: SSD1306 OLED (42x40) I2C display from scratch

    You seem to have the communication to the controller well under control
    next step is to try to store a font economically, you have probably discovered a large font on a very resource limited chip
    like a 690 stored as a series of code structures like
    I2CWrite SDA,SCL,I2CDevice,_
    [$40,192,224,240,248,252,126,63,63,63,63,63,63,63,6 3,126,252,248,240,224,192,_
    255,255,255,255,128,128,128,128,128,128,128,128,12 8,128,128,128,255,255,255,255,_
    255,255,255,255,15,15,15,15,15,15,15,15,15,15,15,1 5,255,255,255,255,_
    255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,25 5,255]
    will by the time you have 10 digits covered will have blown 75% of the chips flash.
    fonts can be stored in much better ways, even expanded out as the are read back
    Warning I'm not a teacher

  4. #4
    Join Date
    Aug 2006
    Location
    SWITZERLAND (french speaking)
    Posts
    938


    Did you find this post helpful? Yes | No

    Default SSD1306 OLED (72x40) I2C display from scratch

    fonts can be stored in much better ways
    Richard, can you point me the direction to do this?

    Should I use some kind of algorithm where repetitive numbers could be stored differently or find a way to make better use of the 14 bits word size of the 16F690?
    Roger

  5. #5
    Join Date
    May 2013
    Location
    australia
    Posts
    2,653


    Did you find this post helpful? Yes | No

    Default Re: SSD1306 OLED (72x40) I2C display from scratch

    the font is just a simple block of data
    this one is for digits 0 to 9 + "." + "%" its 14 bits high and 10 bits wide [to match chip flash]
    so total size is 120 words
    for convenience lets locate it a the end of flash - 120 words ie. 0xf88
    note this is only partially "filled" in and not very carefully at that

    Code:
    asm       ;incomplete and very rough font 14x10
     org 0xf88
     dw    0x1ffc,0x3ffe,0x3006,0x3006,0x3006,0x3006,0x3006,0x3006,0x3ffe,0x1ffc ;"0"
     dw    0,0x300C,0x300E,0x300F,0x3ffF,0x3ffF,0x3ffF,0x3000,0x3000,0
     dw    0x3806,0x3C07,0x3E03,0x3703,0x3383,0x31E3,0x30F3,0x307F,0x303E,0
     dw    0x3018,0x3006,0x3186,0x3186,0x3186,0x3186,0x3186,0x3006,0x3cf8,0x1ffc  ;"3"
     dw    0,0x3ffe,0,0x3ffe,0,0x3ffe,0,0x3ffe,0,0
     dw    0,0x3ffe,0,0x3ffe,0x3ffe,0x3ffe,0,0x3ffe,0,0
     dw    0x3ffe,0x3ffe,0x3ffe,0,0,0,0,0x3ffe,0x3ffe,0x3ffe
     dw    0x3ffe,0x3ffe,0x3ffe,0,0,0x3ffe,0,0x3ffe,0x3ffe,0x3ffe
     dw    0x1ffc,0x3ffe,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3ffe,0x1ffc  ;"8"
     dw    0,0x3ffe,0x3ffe,0x3ffe,0x3ffe,0x3ffe,0x3ffe,0x3ffe,0x3ffe,0x3ffe
     dw    0,0,0,0xE00,0x1F00,0x1F00,0xE00,0,0,0    ;"."
     dw    0x181f,0xC11,0x611,0x31f,0x1C0,0x60,0x1F38,0x110c,0x1106,0x1F02  ;"%"
    endasm
    normally i would make the font an include and give it a label rather than manually locate it like this
    dt's macro as found in dt-ints is ideal to find and numerate the font address
    GetAddress macro Label, Wout
    CHK?RP Wout
    movlw low Label ; get low byte
    movwf Wout
    movlw High Label ; get high byte
    movwf Wout + 1
    endm
    when the fonts address is known its simple to use readcode command to retrieve font data
    Last edited by lester; - 8th December 2023 at 08:44. Reason: Changed Thread Title
    Warning I'm not a teacher

  6. #6
    Join Date
    Aug 2006
    Location
    SWITZERLAND (french speaking)
    Posts
    938


    Did you find this post helpful? Yes | No

    Default SSD1306 OLED (72x40) I2C display from scratch - scrolling text

    Just for fun, scrolling text example

    Name:  ScrollingText.png
Views: 9227
Size:  412.8 KB
    Attached Files Attached Files
    Roger

  7. #7
    Join Date
    May 2013
    Location
    australia
    Posts
    2,653


    Did you find this post helpful? Yes | No

    Default Re: SSD1306 OLED (42x40) I2C display from scratch

    i'm not seeing a font , i had a look at a 40x18 font this morning with my new 72x40 that just arrived
    encoded this way seems the best compromise for easy of unpacking into a 18 x 5 byte stream to send to display

    Name:  fonts.jpg
Views: 9204
Size:  273.3 KB
    Name:  40x18.jpg
Views: 9156
Size:  52.2 KB







    i dont like most of you inital sfr settings
    i would replace the entire section with
    OSCCON = $70 ;% 01110000 'Internal RC set to 8MHZ


    for these reasons
    OPTION_REG = % 10000000 'PORT A&B Pull-Ups disabled (see WPUA & WPUB)
    Pull-Ups are set that way by default anyway . that does other things to that may later prove to be incorrect Like set int edge to falling, reassign and alter the prescaler, change timer 0 clock source

    OSCCON = % 11100000 'Internal RC set to 8MHZ
    no 'OSCCON = % 01110000 for 8mhz you have set it for 4 mhz


    ANSEL = % 00010100 'Select analog inputs Channels 0 to 7 (AN2 + AN4 selected)
    ok but you then go on to make those pins be digital outputs , not recommended except for smoke generation if used as analog inputs


    ADCON0 = % 10000000 'A/D Module (Bit5:2 select channels 0:11)
    ADCON1 = % 00000000 'A/D control register
    why ? makes no sense adc is off by default


    CM1CON0 = % 00000000 'Comparator1 Module is OFF
    CM2CON0 = % 00000000 'Comparator2 Module is OFF
    why ? Comparator 1 and 2 Modules are OFF by default


    INTCON = % 00000000 'INTerrupts CONtrol (TMR0 OFF)
    why serves no purpose ints are off by default


    TRISA = % 00000000 'Set Input/Output (0 to 5)
    bad call when an2
    TRISB = % 00000000 'Set Input/Output (4 to 7)
    bad call when 4,6 used for i2c
    TRISC = % 00000000 'Set Input/Output (0 to 7)
    bad call when an4


    why ? i2c pins can left as be inputs
    when breadboarding leave unused pins as inputs. fine set them as low outputs for the "production" version if a few microwatts of power dissipation makes a difference



    PORTB = % 00000000 'Ports High/Low (4 to 7)
    why ? i2c pins being set low is not useful
    Warning I'm not a teacher

Similar Threads

  1. big char oled display
    By mombasa in forum mel PIC BASIC Pro
    Replies: 2
    Last Post: - 19th September 2020, 07:02
  2. SSD1306 start display problem
    By harryweb in forum mel PIC BASIC Pro
    Replies: 1
    Last Post: - 14th December 2016, 19:16
  3. Cannot drive I2C Oled :(
    By elcrcp in forum mel PIC BASIC Pro
    Replies: 21
    Last Post: - 20th August 2016, 12:19
  4. OLED Display Noise problem
    By gunayburak in forum mel PIC BASIC Pro
    Replies: 24
    Last Post: - 5th July 2016, 10:15
  5. Help With OLED Display / 128X64 SSD1306
    By Denner in forum General
    Replies: 6
    Last Post: - 25th May 2013, 15:40

Members who have read this thread : 22

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts