diff --git a/hd44780/af_i2c_backpack.go b/hd44780/af_i2c_backpack.go index 0400b8b..ed9d958 100644 --- a/hd44780/af_i2c_backpack.go +++ b/hd44780/af_i2c_backpack.go @@ -7,7 +7,9 @@ package hd44780 import ( "periph.io/x/conn/v3/gpio" "periph.io/x/conn/v3/i2c" + "periph.io/x/conn/v3/spi" "periph.io/x/devices/v3/mcp23xxx" + "periph.io/x/devices/v3/nxp74hc595" ) const ( @@ -44,3 +46,16 @@ func NewAdafruitI2CBackpack(bus i2c.Bus, address uint16, rows, cols int) (*HD447 bl := grPins[6].(gpio.PinOut) return NewHD44780(gr, &reset, &enable, &bl, rows, cols) } + +// This function returns a display configured to use the SPI side of the Adafruit +// I2c/SPI backpack. The SPI side uses a 74HC595 Serial->Parallel shift register. +func NewAdafruitSPIBackpack(conn spi.Conn, rows, cols int) (*HD44780, error) { + chip := nxp74hc595.New(conn) + // The SPI side has the same pins but in reverse order from the I2C side. + gr, _ := chip.Group(d7, d6, d5, d4) + rs := chip.Pins[rsPin] + e := chip.Pins[enablePin] + bt := dev.Pins[backlightPin] + + return hd44780.NewHD44780(gr, &rs, &e, &bt, rows, cols) +} diff --git a/hd44780/example_test.go b/hd44780/example_test.go index 5f16f08..c512fdb 100644 --- a/hd44780/example_test.go +++ b/hd44780/example_test.go @@ -10,9 +10,13 @@ import ( "log" "time" + "golang.org/x/exp/io/spi" "periph.io/x/conn/v3/display" "periph.io/x/conn/v3/display/displaytest" "periph.io/x/conn/v3/gpio" + "periph.io/x/conn/v3/i2c/i2creg" + "periph.io/x/conn/v3/physic" + "periph.io/x/conn/v3/spi/spireg" "periph.io/x/devices/v3/hd44780" "periph.io/x/host/v3" "periph.io/x/host/v3/gpioioctl" @@ -68,3 +72,89 @@ func Example() { } } } + +// Create a new HD44780 that uses the Adafruit I2C/SPI Backpack. +func ExampleNewAdafruitI2CBackpack() { + // Make sure periph is initialized. + if _, err := host.Init(); err != nil { + log.Fatal(err) + } + + // Open default I²C bus. + bus, err := i2creg.Open("") + if err != nil { + log.Fatalf("failed to open I²C: %v", err) + } + defer bus.Close() + dev, err := hd44780.NewAdafruitI2CBackpack(bus, 0x20, 4, 20) + fmt.Println(dev.String()) + if err != nil { + log.Fatal(err) + } + dev.Clear() + dev.WriteString("Hello") + fmt.Println("wrote hello") + time.Sleep(5 * time.Second) + fmt.Println("calling test text display") + _ = displaytest.TestTextDisplay(dev, true) +} + + +func ExampleNewAdafruitSPIBackpack() { + if _, err := host.Init(); err != nil { + log.Fatal(err) + } + + pc, err := spireg.Open("") + if err != nil { + log.Fatal(err) + } + defer pc.Close() + conn, err := pc.Connect(physic.MegaHertz, spi.Mode1, 8) + if err != nil { + log.Fatal(err) + } + display, err := hd44780.NewAdafruitSPIBackpack(conn, 2, 26) + if err != nil { + log.Fatal(err) + } + + _ = display.Clear() + _, _ = display.WriteString("Hello") + time.Sleep(5 * time.Second) + _ = displaytest.TestTextDisplay(lcd, true) +} + +func ExampleNewPCF857xBackpack() { + // Make sure periph is initialized. + if _, err := host.Init(); err != nil { + log.Fatal(err) + } + + // Open default I²C bus. + bus, err := i2creg.Open("") + if err != nil { + log.Fatalf("failed to open I²C: %v", err) + } + defer bus.Close() + dev, err := hd44780.NewPCF857xBackpack(bus, pcf857x.DefaultAddress, 4, 20) + fmt.Println(dev.String()) + if err != nil { + log.Fatal(err) + + } + for range 5 { + fmt.Println("toggling backlight") + dev.Backlight(0) + time.Sleep(500 * time.Millisecond) + dev.Backlight(255) + time.Sleep(500 * time.Millisecond) + + } + dev.Clear() + dev.WriteString("Hello") + fmt.Println("wrote hello") + time.Sleep(5 * time.Second) + fmt.Println("calling test text display") + _ = displaytest.TestTextDisplay(dev, true) +}