/// <summary>
        /// Construct a standard Hd44780-compatible character display driven from the commonly-available Pcf8574 backpack.
        /// </summary>
        /// <param name="ioExpander">A Pcf8574 instance to use.</param>
        /// <param name="columns">The number of columns in the display (defaults to 16)</param>
        /// <param name="rows">The number of rows in the display (defaults to 2)</param>
        /// <returns>An Hd44780 object supporting standard CharacterDisplay methods.</returns>
        /// <remarks>
        /// <para>
        /// This factory method takes an already-created <see cref="Pcf8574"/>, creates a <see cref="FlushableParallelInterface{PortExpanderPin}"/>
        /// parallel interface for it, assigns the correct pinout to this interface, and constructs a <see cref="Hd44780"/>
        /// display using this interface, using the slower 4-bit mode for operation.
        /// </para>
        /// <para>
        /// If you wish to produce custom hardware compatiable with this factory method, the correct pinout is:
        /// <list type="number">
        /// <item><term>Register Select (RS)</term><description>Pin 0</description></item>
        /// <item><term>Read/Write (RW)</term><description>Pin 1</description></item>
        /// <item><term>Enable (E)</term><description>Pin 2</description></item>
        /// <item><term>Backlight Enable</term><description>Pin 3</description></item>
        /// <item><term>Data 4</term><description>Pin 4</description></item>
        /// <item><term>Data 5</term><description>Pin 5</description></item>
        /// <item><term>Data 6</term><description>Pin 6</description></item>
        /// <item><term>Data 7</term><description>Pin 7</description></item>
        /// </list>
        /// 
        /// Note that when the Hd44780 is operated in 4-bit mode, only the high-nibble (D4-D7) is used, not the low-nibble.
        /// </para>
        /// </remarks>
        public static Hd44780 GetCharacterDisplayFromPcf8574(Pcf8574 ioExpander, int columns = 16, int rows = 2)
        {
            var parallelInterface = new FlushableParallelInterface<PortExpanderPin>(ioExpander);

            parallelInterface.RegisterSelectPin = ioExpander.Pins[0];
            parallelInterface.ReadWritePin = ioExpander.Pins[1];
            parallelInterface.EnablePin = ioExpander.Pins[2];

            parallelInterface.DataBus.Add(ioExpander.Pins[4]);
            parallelInterface.DataBus.Add(ioExpander.Pins[5]);
            parallelInterface.DataBus.Add(ioExpander.Pins[6]);
            parallelInterface.DataBus.Add(ioExpander.Pins[7]);

            parallelInterface.Enabled = true;

            return new Hd44780(parallelInterface, columns, rows, ioExpander.Pins[3]);
        }
        static async Task App()
        {
            var board = await ConnectionService.Instance.GetFirstDeviceAsync();

            await board.ConnectAsync();
            var ioExpander = new Pcf8574(board.I2c, false, false, false);
            var display = HobbyDisplayFactories.GetCharacterDisplayFromPcf8574(ioExpander, 20, 4);
            await display.WriteLine("The current date is:").ConfigureAwait(false);
            while (true)
            {
                await display.WriteLine(DateTime.Now.ToLongTimeString()).ConfigureAwait(false);
                await display.WriteLine(DateTime.Now.ToShortDateString()).ConfigureAwait(false);
                await display.SetCursorPosition(0, 1);
                await Task.Delay(100);
            }


        }