7-сегментный дисплей на многофункциональном шилде — Arduino Uno

Я купил этот щит . Я ищу способ отображения десятичной точки без использования какой-либо специальной библиотеки. Большинство примеров, таких как этот, показывают только 0–9.< /p>

EDIT1 обновить ссылку Ссылка

, 👍0

Обсуждение

этот дисплей требует частого обновления, иначе он выглядит так, как будто он показывает только одно число, @Juraj

Отвечает ли это на ваш вопрос? проблема [delay() для 74HC595 и 7-сегмента, @Juraj

Ссылка на пример мертва. Десятичная точка такая же, как и любой другой сегмент на дисплее. Установите соответствующий выходной контакт сдвигового регистра 75HC595 на высокий или низкий уровень (в зависимости от того, как подключен дисплей)., @chrisl


1 ответ


1

Поэтому, если вы нажмете на вторую ссылку, она будет включать образцы кода для различных разделов многофункционального экрана.

Один из них называется "сегментное отображение".

Если вы посмотрите на этот код, строка 7 определяет битовые шаблоны для каждой из цифр от 0 до 9:

const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};

Если вы сопоставите их в двоичном формате, вы получите:

0xC0,   1100 0000   0
0xF9,   1111 1001   1
0xA4,   1010 0100   2
0xB0,   1011 0000   3
0x99,   1001 1001   4
0x92,   1001 0010   5
0x82,   1000 0010   6
0xF8,   1111 1000   7
0X80,   1000 0000   8
0X90    1001 0000   9

У символа 0 подсвечиваются все сегменты, кроме средней "перекладины". У символа 8 горят ВСЕ сегменты. Но битовая комбинация для 8 — 1000 0000. Это говорит о том, что бит 0 означает, что сегмент горит, а бит 1 означает, что он выключен. Поскольку бит старшего порядка всех этих символов равен 1 (выкл.), это предполагает, что бит старшего разряда является битом десятичного разряда. (Это единственный бит, который никогда не меняется.)

Итак, если вы замените

const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};

с

const byte SEGMENT_MAP[] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0X00,0X10};

Вы должны получить все нарисованные цифры со светящимися соответствующими десятичными разрядами.

Я бы попробовал сначала, чтобы убедиться, что я прав.

Затем я бы предложил написать код, который считывает значение сегментов для каждой цифры, решает, хотите ли вы десятичный знак в этой позиции, и если да, выполняет побитовое И (& в C /C++) для значения с 0X7F, чтобы очистить десятичный бит для этого символа. (Помните, что 0 означает, что данный светодиодный сегмент должен гореть.

Вы можете изменить функцию WriteNumberToSegment(), чтобы она принимала "lightDot" параметр, и он изменит бит, если вы передадите TRUE (1):

void WriteNumberToSegment(byte Segment, byte Value, bool lightDot)
{
    digitalWrite(LATCH_DIO,LOW);
    bool bits = SEGMENT_MAP[Value]);
    if (lightDot) { 
       bits &= 0x7F; //Чтобы подсветить десятичную запятую для этой цифры, очистите бит 0x80
    }
    shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, bits);
    shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );
    digitalWrite(LATCH_DIO,HIGH);
}

(Я точно не помню, является ли bool допустимым типом в Arduino C/C++. Если нет, просто замените bool на uint8 выше.)

,