mirror of
https://github.com/tinygo-org/drivers.git
synced 2026-08-20 06:28:59 +00:00
ssd1306: improvements needed for Thumby SPI display
Signed-off-by: deadprogram <ron@hybridgroup.com>
This commit is contained in:
@@ -0,0 +1,50 @@
|
|||||||
|
// This example using the SSD1306 OLED display over SPI on the Thumby board
|
||||||
|
// A very tiny 72x40 display.
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"image/color"
|
||||||
|
"machine"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"tinygo.org/x/drivers/ssd1306"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
machine.SPI0.Configure(machine.SPIConfig{})
|
||||||
|
display := ssd1306.NewSPI(machine.SPI0, machine.THUMBY_DC_PIN, machine.THUMBY_RESET_PIN, machine.THUMBY_CS_PIN)
|
||||||
|
display.Configure(ssd1306.Config{
|
||||||
|
Width: 72,
|
||||||
|
Height: 40,
|
||||||
|
ResetCol: ssd1306.ResetValue{28, 99},
|
||||||
|
ResetPage: ssd1306.ResetValue{0, 5},
|
||||||
|
})
|
||||||
|
|
||||||
|
display.ClearDisplay()
|
||||||
|
|
||||||
|
x := int16(36)
|
||||||
|
y := int16(20)
|
||||||
|
deltaX := int16(1)
|
||||||
|
deltaY := int16(1)
|
||||||
|
for {
|
||||||
|
pixel := display.GetPixel(x, y)
|
||||||
|
c := color.RGBA{255, 255, 255, 255}
|
||||||
|
if pixel {
|
||||||
|
c = color.RGBA{0, 0, 0, 255}
|
||||||
|
}
|
||||||
|
display.SetPixel(x, y, c)
|
||||||
|
display.Display()
|
||||||
|
|
||||||
|
x += deltaX
|
||||||
|
y += deltaY
|
||||||
|
|
||||||
|
if x == 0 || x == 71 {
|
||||||
|
deltaX = -deltaX
|
||||||
|
}
|
||||||
|
|
||||||
|
if y == 0 || y == 39 {
|
||||||
|
deltaY = -deltaY
|
||||||
|
}
|
||||||
|
time.Sleep(1 * time.Millisecond)
|
||||||
|
}
|
||||||
|
}
|
||||||
+26
-4
@@ -13,6 +13,8 @@ import (
|
|||||||
"tinygo.org/x/drivers/internal/legacy"
|
"tinygo.org/x/drivers/internal/legacy"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type ResetValue [2]byte
|
||||||
|
|
||||||
// Device wraps I2C or SPI connection.
|
// Device wraps I2C or SPI connection.
|
||||||
type Device struct {
|
type Device struct {
|
||||||
bus Buser
|
bus Buser
|
||||||
@@ -22,6 +24,8 @@ type Device struct {
|
|||||||
bufferSize int16
|
bufferSize int16
|
||||||
vccState VccMode
|
vccState VccMode
|
||||||
canReset bool
|
canReset bool
|
||||||
|
resetCol ResetValue
|
||||||
|
resetPage ResetValue
|
||||||
}
|
}
|
||||||
|
|
||||||
// Config is the configuration for the display
|
// Config is the configuration for the display
|
||||||
@@ -30,6 +34,13 @@ type Config struct {
|
|||||||
Height int16
|
Height int16
|
||||||
VccState VccMode
|
VccState VccMode
|
||||||
Address uint16
|
Address uint16
|
||||||
|
// ResetCol and ResetPage are used to reset the screen to 0x0
|
||||||
|
// This is useful for some screens that have a different size than 128x64
|
||||||
|
// For example, the Thumby's screen is 72x40
|
||||||
|
// The default values are normally set automatically based on the size.
|
||||||
|
// If you're using a different size, you might need to set these values manually.
|
||||||
|
ResetCol ResetValue
|
||||||
|
ResetPage ResetValue
|
||||||
}
|
}
|
||||||
|
|
||||||
type I2CBus struct {
|
type I2CBus struct {
|
||||||
@@ -79,6 +90,7 @@ func NewSPI(bus drivers.SPI, dcPin, resetPin, csPin machine.Pin) Device {
|
|||||||
|
|
||||||
// Configure initializes the display with default configuration
|
// Configure initializes the display with default configuration
|
||||||
func (d *Device) Configure(cfg Config) {
|
func (d *Device) Configure(cfg Config) {
|
||||||
|
var zeroReset ResetValue
|
||||||
if cfg.Width != 0 {
|
if cfg.Width != 0 {
|
||||||
d.width = cfg.Width
|
d.width = cfg.Width
|
||||||
} else {
|
} else {
|
||||||
@@ -97,6 +109,16 @@ func (d *Device) Configure(cfg Config) {
|
|||||||
} else {
|
} else {
|
||||||
d.vccState = SWITCHCAPVCC
|
d.vccState = SWITCHCAPVCC
|
||||||
}
|
}
|
||||||
|
if cfg.ResetCol != zeroReset {
|
||||||
|
d.resetCol = cfg.ResetCol
|
||||||
|
} else {
|
||||||
|
d.resetCol = ResetValue{0, uint8(d.width - 1)}
|
||||||
|
}
|
||||||
|
if cfg.ResetPage != zeroReset {
|
||||||
|
d.resetPage = cfg.ResetPage
|
||||||
|
} else {
|
||||||
|
d.resetPage = ResetValue{0, uint8(d.height/8) - 1}
|
||||||
|
}
|
||||||
d.bufferSize = d.width * d.height / 8
|
d.bufferSize = d.width * d.height / 8
|
||||||
d.buffer = make([]byte, d.bufferSize)
|
d.buffer = make([]byte, d.bufferSize)
|
||||||
d.canReset = cfg.Address != 0 || d.width != 128 || d.height != 64 // I2C or not 128x64
|
d.canReset = cfg.Address != 0 || d.width != 128 || d.height != 64 // I2C or not 128x64
|
||||||
@@ -186,11 +208,11 @@ func (d *Device) Display() error {
|
|||||||
// Since we're printing the whole buffer, avoid resetting it in this case
|
// Since we're printing the whole buffer, avoid resetting it in this case
|
||||||
if d.canReset {
|
if d.canReset {
|
||||||
d.Command(COLUMNADDR)
|
d.Command(COLUMNADDR)
|
||||||
d.Command(0)
|
d.Command(d.resetCol[0])
|
||||||
d.Command(uint8(d.width - 1))
|
d.Command(d.resetCol[1])
|
||||||
d.Command(PAGEADDR)
|
d.Command(PAGEADDR)
|
||||||
d.Command(0)
|
d.Command(d.resetPage[0])
|
||||||
d.Command(uint8(d.height/8) - 1)
|
d.Command(d.resetPage[1])
|
||||||
}
|
}
|
||||||
|
|
||||||
return d.Tx(d.buffer, false)
|
return d.Tx(d.buffer, false)
|
||||||
|
|||||||
Reference in New Issue
Block a user