mirror of
https://github.com/tinygo-org/drivers.git
synced 2026-07-26 10:38:41 +00:00
1bb1b621c6
Signed-off-by: deadprogram <ron@hybridgroup.com>
113 lines
2.8 KiB
Go
113 lines
2.8 KiB
Go
//go:build microbit
|
|
// +build microbit
|
|
|
|
// Package microbitmatrix implements a driver for the BBC micro:bit's LED matrix.
|
|
//
|
|
// Schematic: https://github.com/bbcmicrobit/hardware/blob/master/SCH_BBC-Microbit_V1.3B.pdf
|
|
package microbitmatrix // import "tinygo.org/x/drivers/microbitmatrix"
|
|
|
|
import (
|
|
"machine"
|
|
"time"
|
|
)
|
|
|
|
var matrixRotations = [4][5][5][2]uint8{
|
|
{ // 0
|
|
{{0, 0}, {1, 3}, {0, 1}, {1, 4}, {0, 2}},
|
|
{{2, 3}, {2, 4}, {2, 5}, {2, 6}, {2, 7}},
|
|
{{1, 1}, {0, 8}, {1, 2}, {2, 8}, {1, 0}},
|
|
{{0, 7}, {0, 6}, {0, 5}, {0, 4}, {0, 3}},
|
|
{{2, 2}, {1, 6}, {2, 0}, {1, 5}, {2, 1}},
|
|
},
|
|
{ // 90 CCW
|
|
{{0, 2}, {2, 7}, {1, 0}, {0, 3}, {2, 1}},
|
|
{{1, 4}, {2, 6}, {2, 8}, {0, 4}, {1, 5}},
|
|
{{0, 1}, {2, 5}, {1, 2}, {0, 5}, {2, 0}},
|
|
{{1, 3}, {2, 4}, {0, 8}, {0, 6}, {1, 6}},
|
|
{{0, 0}, {2, 3}, {1, 1}, {0, 7}, {2, 2}},
|
|
},
|
|
{ // 180
|
|
{{2, 1}, {1, 5}, {2, 0}, {1, 6}, {2, 2}},
|
|
{{0, 3}, {0, 4}, {0, 5}, {0, 6}, {0, 7}},
|
|
{{1, 0}, {2, 8}, {1, 2}, {0, 8}, {1, 1}},
|
|
{{2, 7}, {2, 6}, {2, 5}, {2, 4}, {2, 3}},
|
|
{{0, 2}, {1, 4}, {0, 1}, {1, 3}, {0, 0}},
|
|
},
|
|
{ // 270
|
|
{{2, 2}, {0, 7}, {1, 1}, {2, 3}, {0, 0}},
|
|
{{1, 6}, {0, 6}, {0, 8}, {2, 4}, {1, 3}},
|
|
{{2, 0}, {0, 5}, {1, 2}, {2, 5}, {0, 1}},
|
|
{{1, 5}, {0, 4}, {2, 8}, {2, 6}, {1, 4}},
|
|
{{2, 1}, {0, 3}, {1, 0}, {2, 7}, {0, 2}},
|
|
},
|
|
}
|
|
|
|
type Device struct {
|
|
pin [12]machine.Pin
|
|
buffer [3][9]bool
|
|
rotation uint8
|
|
}
|
|
|
|
// Configure sets up the device.
|
|
func (d *Device) Configure(cfg Config) {
|
|
d.SetRotation(cfg.Rotation)
|
|
|
|
for i := machine.LED_COL_1; i <= machine.LED_ROW_3; i++ {
|
|
d.pin[i-machine.LED_COL_1] = i
|
|
d.pin[i-machine.LED_COL_1].Configure(machine.PinConfig{Mode: machine.PinOutput})
|
|
}
|
|
d.ClearDisplay()
|
|
d.DisableAll()
|
|
}
|
|
|
|
// Display sends the buffer (if any) to the screen.
|
|
func (d *Device) Display() error {
|
|
for row := 0; row < 3; row++ {
|
|
d.DisableAll()
|
|
d.pin[9+row].High()
|
|
|
|
for col := 0; col < 9; col++ {
|
|
if d.buffer[row][col] {
|
|
d.pin[col].Low()
|
|
}
|
|
|
|
}
|
|
time.Sleep(time.Millisecond * 2)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// ClearDisplay erases the internal buffer
|
|
func (d *Device) ClearDisplay() {
|
|
for row := 0; row < 3; row++ {
|
|
for col := 0; col < 9; col++ {
|
|
d.buffer[row][col] = false
|
|
}
|
|
}
|
|
}
|
|
|
|
// DisableAll disables all the LEDs without modifying the buffer
|
|
func (d *Device) DisableAll() {
|
|
for i := machine.LED_COL_1; i <= machine.LED_COL_9; i++ {
|
|
d.pin[i-machine.LED_COL_1].High()
|
|
}
|
|
for i := machine.LED_ROW_1; i <= machine.LED_ROW_3; i++ {
|
|
d.pin[i-machine.LED_COL_1].Low()
|
|
}
|
|
}
|
|
|
|
// EnableAll enables all the LEDs without modifying the buffer
|
|
func (d *Device) EnableAll() {
|
|
for i := machine.LED_COL_1; i <= machine.LED_COL_9; i++ {
|
|
d.pin[i-machine.LED_COL_1].Low()
|
|
}
|
|
for i := machine.LED_ROW_1; i <= machine.LED_ROW_3; i++ {
|
|
d.pin[i-machine.LED_COL_1].High()
|
|
}
|
|
}
|
|
|
|
// Size returns the current size of the display.
|
|
func (d *Device) Size() (w, h int16) {
|
|
return 5, 5
|
|
}
|