ili9341: add standard SPI driver

This commit is contained in:
sago35
2021-06-10 09:38:23 +09:00
committed by Ron Evans
parent 5e117c162c
commit b53a8a17e7
3 changed files with 97 additions and 7 deletions
+9 -6
View File
@@ -25,7 +25,7 @@ const (
) )
var ( var (
frameBuffer = [(graphics.BALLHEIGHT + 8) * (graphics.BALLWIDTH + 8)]uint16{} frameBuffer = [(graphics.BALLHEIGHT + 8) * (graphics.BALLWIDTH + 8) * 2]uint8{}
startTime int64 startTime int64
frame int64 frame int64
@@ -179,7 +179,8 @@ func main() {
c = BGCOLOR c = BGCOLOR
} }
} }
frameBuffer[y*int(width)+x] = c frameBuffer[(y*int(width)+x)*2] = byte(c >> 8)
frameBuffer[(y*int(width)+x)*2+1] = byte(c)
bx1++ // Increment bitmap position counters (X axis) bx1++ // Increment bitmap position counters (X axis)
bgx1++ bgx1++
} }
@@ -190,7 +191,7 @@ func main() {
bgy++ bgy++
} }
display.DrawRGBBitmap(minx, miny, frameBuffer[:width*height], width, height) display.DrawRGBBitmap8(minx, miny, frameBuffer[:width*height*2], width, height)
// Show approximate frame rate // Show approximate frame rate
frame++ frame++
@@ -215,11 +216,13 @@ func DrawBackground() {
b = graphics.Background[j*byteWidth+k/8] b = graphics.Background[j*byteWidth+k/8]
} }
if b&0x80 == 0 { if b&0x80 == 0 {
frameBuffer[k] = BGCOLOR frameBuffer[2*k] = byte(BGCOLOR >> 8)
frameBuffer[2*k+1] = byte(BGCOLOR & 0xFF)
} else { } else {
frameBuffer[k] = GRIDCOLOR frameBuffer[2*k] = byte(GRIDCOLOR >> 8)
frameBuffer[2*k+1] = byte(GRIDCOLOR & 0xFF)
} }
} }
display.DrawRGBBitmap(0, j, frameBuffer[0:w], w, 1) display.DrawRGBBitmap8(0, j, frameBuffer[0:w*2], w, 1)
} }
} }
+17 -1
View File
@@ -160,6 +160,20 @@ func (d *Device) DrawRGBBitmap(x, y int16, data []uint16, w, h int16) error {
return nil return nil
} }
// DrawRGBBitmap8 copies an RGB bitmap to the internal buffer at given coordinates
func (d *Device) DrawRGBBitmap8(x, y int16, data []uint8, w, h int16) error {
k, i := d.Size()
if x < 0 || y < 0 || w <= 0 || h <= 0 ||
x >= k || (x+w) > k || y >= i || (y+h) > i {
return errors.New("rectangle coordinates outside display area")
}
d.setWindow(x, y, w, h)
d.startWrite()
d.driver.write8sl(data)
d.endWrite()
return nil
}
// FillRectangle fills a rectangle at given coordinates with a color // FillRectangle fills a rectangle at given coordinates with a color
func (d *Device) FillRectangle(x, y, width, height int16, c color.RGBA) error { func (d *Device) FillRectangle(x, y, width, height int16, c color.RGBA) error {
k, i := d.Size() k, i := d.Size()
@@ -300,7 +314,9 @@ func (d *Device) sendCommand(cmd byte, data []byte) {
d.dc.Low() d.dc.Low()
d.driver.write8(cmd) d.driver.write8(cmd)
d.dc.High() d.dc.High()
d.driver.write8sl(data) if data != nil {
d.driver.write8sl(data)
}
d.endWrite() d.endWrite()
} }
+71
View File
@@ -0,0 +1,71 @@
// +build !atsamd51,!atsamd21
package ili9341
import (
"machine"
)
var buf [64]byte
type spiDriver struct {
bus machine.SPI
}
func NewSPI(bus machine.SPI, dc, cs, rst machine.Pin) *Device {
return &Device{
dc: dc,
cs: cs,
rst: rst,
rd: machine.NoPin,
driver: &spiDriver{
bus: bus,
},
}
}
func (pd *spiDriver) configure(config *Config) {
}
func (pd *spiDriver) write8(b byte) {
buf[0] = b
pd.bus.Tx(buf[:1], nil)
}
func (pd *spiDriver) write8n(b byte, n int) {
buf[0] = b
for i := 0; i < n; i++ {
pd.bus.Tx(buf[:1], nil)
}
}
func (pd *spiDriver) write8sl(b []byte) {
pd.bus.Tx(b, nil)
}
func (pd *spiDriver) write16(data uint16) {
buf[0] = uint8(data >> 8)
buf[1] = uint8(data)
pd.bus.Tx(buf[:2], nil)
}
func (pd *spiDriver) write16n(data uint16, n int) {
for i := 0; i < len(buf); i += 2 {
buf[i] = uint8(data >> 8)
buf[i+1] = uint8(data)
}
for i := 0; i < (n >> 5); i++ {
pd.bus.Tx(buf[:], nil)
}
pd.bus.Tx(buf[:n%64], nil)
}
func (pd *spiDriver) write16sl(data []uint16) {
for i, c := 0, len(data); i < c; i++ {
buf[0] = uint8(data[i] >> 8)
buf[1] = uint8(data[i])
pd.bus.Tx(buf[:2], nil)
}
}