Элемент управления из четырнадцати сегментов на основе HT16K33 не всегда отображает правильные символы для заданной битовой маски в Windows 10 IoT Core - PullRequest
1 голос
/ 10 июня 2019

Я хочу показать символ на четырнадцати сегментном контрольном дисплее (4 рядом) на моем Pimoroni RainbowHAT для моего Raspberry под управлением Microsoft Windows 10 IoT Core.

Для некоторых сообщений, таких как " АД " (из "Hello), мой источник работает как положено, но для других, таких как" DEMO", это показывает мусор. Это странно для меня, потому что оба сообщения включают в себя букву "E". Но это работает только один раз.

Моя последняя идея заключается в том, что bitmask[1] & 0xFF; - это не то же самое, что смещение битов (bitmask[0] >> 8) && 0xFF, если бы мы выделили неразделенную битовую маску.

Примеры сообщений (Ввод -> Отображается на дисплее)

  • "АД" -> АД
  • "DEMO" -> "," (3 пробела, запятая)

Пример источника (Полный источник: GitHub )

Буфер сегмента, который будет записан на устройство:

private readonly byte[] segmentBuffer = Enumerable.Repeat(Convert.ToByte(0b00000000), BUFFER_SIZE).ToArray();

Битовая маска для буквы D:

private static readonly Dictionary<char, byte[]> BITMASK_DICTIONARY = new Dictionary<char, byte[]>{   
    { 'D',  new byte[]{0b00010010, 0b00001111},
      .... 
    }
};

Получение битовой маски для символа:

private byte[] ConvertCharToBitmask(char character)
{
    // Check if char is available.
    if(BITMASK_DICTIONARY.Keys.Contains(character))
    {
        return BITMASK_DICTIONARY[character];
    }

    // If not, return default (spaces).
    ...
}

Запись изменений на устройство (сообщение = " DEMO "):

for (int i = 0; i < message.Length; i++)
{
    var bitmask = ConvertCharToBitmask(message[i]);
    segmentBuffer[i * 2] = Convert.ToByte(bitmask[0] & 0xFF);
    segmentBuffer[i * 2 + 1] = Convert.ToByte(bitmask[1] & 0xFF);
}

// Write buffer to device.
ht16k33.Write(segmentBuffer);

Ссылки

Ответы [ 2 ]

1 голос
/ 11 июня 2019

Из кода в вашем посте, кажется неправильным для установки сегментBuffer . Пожалуйста, попробуйте следующий код.

        for (int i = 0; i < message.Length; i++)
        {
            var bitmask = ConvertCharToBitmask(message[i]);
            Logger.Log(this, $"Writing char: '{message[i]}' at index: {i}.");
            segmentBuffer[i * 2] = Convert.ToByte(bitmask[1] & 0xFF);
            segmentBuffer[i * 2 + 1] = Convert.ToByte(bitmask[0] & 0xFF);
        }

Вы передали 'D': 0b0001001000001111 в { 'D', new byte[]{0b00010010, 0b00001111}, в соответствии с кодом на python, segmentBuffer[i * 2] должен быть младшим байтом позиции, тогда как segmentBuffer[i * 2 + 1] должен быть выше.

У меня нет устройства для проверки этой проблемы. Если это не работает, пожалуйста, дайте мне знать.

Обновление:

Следующий код больше соответствует коду в python.

    private static readonly Dictionary<char, int> BITMASK_DICTIONARY = new Dictionary<char, int>
    {
        { ' ',  0b0000000000000000  },
        { 'D',  0b0001001000001111  },
    };

    private int ConvertCharToBitmask(char character)
    {
        // Check if char is available.
        if (BITMASK_DICTIONARY.Keys.Contains(character))
        {
            return BITMASK_DICTIONARY[character];
        }

        // If not, return default.
        return GetDefaultCharBitmask();
    }

    private int GetDefaultCharBitmask()
    {
        return BITMASK_DICTIONARY[DEFAULT_BITMASK_CHAR];
    }


    public void Show(string message)
    {
        // Ensure message has valid length.
        if(message.Length > NUMBER_OF_SEGMENTS)
        {
            throw new OperationCanceledException($"Maximum message length is {NUMBER_OF_SEGMENTS} characters.");
        }

        // Update buffer
        Logger.Log(this, $"Show for {message}");
        for (int i = 0; i < message.Length; i++)
        {
            var bitmask = ConvertCharToBitmask(message[i]);
            Logger.Log(this, $"Writing char: '{message[i]}' at index: {i}.");
            segmentBuffer[i * 2] = Convert.ToByte(bitmask & 0xFF);
            segmentBuffer[i * 2 + 1] = Convert.ToByte(bitmask >> 8 & 0xFF);
        }

        // Write buffer to device.
        ht16k33.Write(segmentBuffer);
    }
0 голосов
/ 11 июня 2019

Решение

Это было многократное исправление шага.

  1. Наконечник @ michael-xu-msft ведет в правую прямую.Я обновил свой источник, чтобы использовать смещение по умолчанию вместо разделенного массива.

  2. Я забыл добавить смещение буфера 0x00 к методу Show().

Обновленный источник теперь опубликован на GitHub.

...