All Downloads are FREE. Search and download functionalities are using the official Maven repository.

commonMain.devices.waveshare.BwOled1in3.kt Maven / Gradle / Ivy

@file:OptIn(ExperimentalUnsignedTypes::class)
@file:Suppress("SpellCheckingInspection")

package ch.softappeal.konapi.devices.waveshare

import ch.softappeal.konapi.Gpio
import ch.softappeal.konapi.SpiDevice
import ch.softappeal.konapi.graphics.BwGraphics
import ch.softappeal.konapi.graphics.Display
import ch.softappeal.konapi.sleepMs

/*
    1.3inch OLED Monochrome

    https://www.waveshare.com/wiki/1.3inch_OLED_(B)
    https://files.waveshare.com/upload/7/76/1.3inch_OLED_UserManual.pdf
    https://files.waveshare.com/upload/0/08/SH1106_V2.3.pdf
    https://files.waveshare.com/upload/2/2c/OLED_Module_Code.7z
 */

public fun bwOled1in3(
    gpio: Gpio, dcPin: Int, rstPin: Int,
    device: SpiDevice, speedHz: Int = 10_000_000,
): Oled = Oled(
    gpio, dcPin, rstPin,
    device, speedHz,
    {
        command(0xAEU) // turn off oled panel
        command(0x02U) // set low column address
        command(0x10U) // set high column address
        command(0x40U) // set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
        command(0x81U) // set contrast control register
        command(0xA0U) // Set SEG/Column Mapping
        command(0xC0U) // Set COM/Row Scan Direction
        command(0xA6U) // set normal display
        command(0xA8U) // set multiplex ratio(1 to 64)
        command(0x3FU) // 1/64 duty
        command(0xD3U) // set display offset    Shift Mapping RAM Counter (0x00~0x3F)
        command(0x00U) // not offset
        command(0xd5U) // set display clock divide ratio/oscillator frequency
        command(0x80U) // set divide ratio, Set Clock as 100 Frames/Sec
        command(0xD9U) // set pre-charge period
        command(0xF1U) // Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
        command(0xDAU) // set com pins hardware configuration
        command(0x12U)
        command(0xDBU) // set vcomh
        command(0x40U) // Set VCOM Deselect Level
        command(0x20U) // Set Page Addressing Mode (0x00/0x01/0x02)
        command(0x02U)
        command(0xA4U) // Disable Entire Display On (0xa4/0xa5)
        command(0xA6U) // Disable Inverse Display On (0xa6/a7)
        sleepMs(100)
        command(0xAFU) // turn on oled panel
    },
    {
        BwGraphics(object : Display(128, 64) {
            private val chunk = UByteArray(width)
            override fun update(buffer: UByteArray) {
                var pageStart = 0
                for (page in 0..<8) {
                    command((0xB0U + page.toUByte()).toUByte()) // set page address
                    command(0x02U) // set low column address
                    command(0x10U) // set high column address
                    val pageEnd = pageStart + width
                    buffer.copyInto(chunk, startIndex = pageStart, endIndex = pageEnd)
                    data(chunk)
                    pageStart = pageEnd
                }
            }
        })
    },
)




© 2015 - 2024 Weber Informatics LLC | Privacy Policy