Я хочу показать символ на четырнадцати сегментном контрольном дисплее (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);
Ссылки