Расчет шестнадцатеричных значений для 7-сегментного светодиода на MDA-8086

Я пытался отобразить 7-сегментный светодиод на комплекте MDA-8086, но я застрял в вычислении шестнадцатеричных значений для соответствующих цифр. Код у меня с собой, но я не понимаю, как он работает. Например, 0 представлен шестнадцатеричным значением 0xc0 [я полагаю]. Мне интересно, как здесь были рассчитаны значения?

C Код для 7-сегментного светодиодного дисплея:

#include"mde8086.h"

int data[11] = { 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x00 };

void wait(long del)
{
    while( del-- );
}

void main(void)
{
    int *data1;

    /* 8255 -1 Initialization */
    outportb( PPI1_CR, 0x80 );
    outportb( PPI1_B, 0xf0 );
    outportb( PPI1_C, 0x00 );

    //main loop
    do {
        data1 = data;
        while( *data1 != 0x00 )
        {
            outportb( PPI1_A, *data1 );
            wait(30000);
            data1++;
        }
    } while(1);
}

Результат был сгенерирован отсюда:

7-сегментный дисплей


person Apprentice    schedule 26.08.2020    source источник
comment
stackoverflow.com/questions/2670639 / проверьте этот вопрос о переполнении стека. Также проверьте это stackoverflow .com / questions / 8186965 /.   -  person 0xff    schedule 26.08.2020
comment
Моя первая мысль заключалась в том, что 1 отображается, освещая всего 2 сегмента, поэтому мы можем сказать, что это должно быть 0xc0 (в двоичном представлении которого установлено только 2 бита, поэтому сегмент b = 0x80, c = 0x40 или наоборот). цикл по этому массиву подсчитывает от 1 до 9, а затем, я думаю, оборачивается до 0. Но это не сработает, если вы посмотрите на остальные; есть другие шаблоны с установленным только 1 или парой битов, так что должно быть так, что маски инвертированы, а чистые биты освещают соответствующий сегмент? Тогда оставив сегмент G и десятичную запятую незажженными, могут быть верхние 2 бита.   -  person Peter Cordes    schedule 26.08.2020


Ответы (2)


Речь идет о подключении вашего аппаратного обеспечения, то есть о том, как контакты дисплея подключены к порту и требуется ли 0 или 1 на порту для включения сегмента.

По вашим цифрам кажется:

  1. Порт подключен как g, f, e, d, c, b, a То есть: a - это LSB.

  2. Отсутствующий 8-й бит всегда должен быть запрограммирован на 1, т. Е. Как 8 бит он будет port = 1gfedcba.

  3. Чтобы включить сегмент на дисплее, нужен 0.

So

0xc0 -> 1100.000 -> 1    1    0    0    0    0    0    0
                    ^    ^    ^    ^    ^    ^    ^    ^
                    |    |    |    |    |    |    |    |
                unused   g    f    e    d    c    b    a
                        off  on   on   on   on   on   on

что приводит к нулю на дисплее.

Теперь о 0xf9

0xf9 -> 1111.1001

поэтому включатся только сегменты b и c, а на дисплее отобразится 1

Остальное проверьте сами.

РЕДАКТИРОВАТЬ. Глядя на изображение сигнатуры, может оказаться, что 8-й бит (который я назвал неиспользованным) на самом деле контролирует часть сегмента DP. Это всего лишь предположение, но, возможно, если вы напишете в порт 0x40, вы увидите на дисплее 0..

Когда вы показываете только числа, остается много неиспользуемых комбинаций. Некоторые из них выглядят как буквы, например H. Так что для развлечения (также известного как упражнение) вы можете сделать отображаемые слова, такие как HELLO, CACAO, BEEF и многие другие.

person 4386427    schedule 26.08.2020
comment
Разве 0x40 не будет '0.? Горит все, кроме г. - person Peter Cordes; 26.08.2020
comment
@PeterCordes Мое плохое ... да, будет 0., если он подключен, как я предполагаю. Спасибо, что поймали и дали мне знать. :-) - person 4386427; 26.08.2020

Я застрял в вычислении шестнадцатеричных значений для соответствующих цифр.

Иногда небольшое макро-искусство бывает забавным и иллюстративным. Он предоставляет графический способ определения шестнадцатеричных значений для data[] вместо того, чтобы делать это вручную.

seven() берет 3 строки (строки) и ищет -, |, . для формирования шестнадцатеричного значения. Когда соответствующий сегмент выключен, значение находится в другом бите.

#include <stdio.h>

#define seven(r1,r2,r3) (\
/* Seg A */ (r1[1] == '_' ? 0 : 0x01) |  \
/* Seg B */ (r2[2] == '|' ? 0 : 0x02) |  \
/* Seg C */ (r3[2] == '|' ? 0 : 0x04) |  \
/* Seg D */ (r3[1] == '_' ? 0 : 0x08) |  \
/* Seg E */ (r3[0] == '|' ? 0 : 0x10) |  \
/* Seg F */ (r2[0] == '|' ? 0 : 0x20) |  \
/* Seg G */ (r2[1] == '_' ? 0 : 0x40) |  \
/* Seg DP*/ (r3[3] == '.' ? 0 : 0x80) \
)

int datax[11] = { //
    seven( // Zero
    " _ ",//
    "| |",//
    "|_| "),//
    seven( // One
    "   ",//
    "  |",//
    "  | "),//
    seven( // Two
    " _ ",//
    " _|",//
    "|_  "),//
    };

// Remaining digits left for OP


int main(/*int argc, char *argv[]*/) {
  for (int i = 0; i < 3; i++)
    printf("%02X\n", data[i]);
  return 0;
}

Вывод

C0
F9
A4
person chux - Reinstate Monica    schedule 26.08.2020
comment
Я мог бы сжать свои представления до 3 строк вместо 5, например. верхняя строка нуля как "|-|". Это выглядит хорошо для 0, но, может быть, намного хуже для 2. Тем не менее, это делает исходный код более компактным и по-прежнему довольно интуитивно понятным. (В целом действительно отличная идея, +1) - person Peter Cordes; 26.08.2020
comment
@PeterCordes Хорошая идея. Может быть "|_|" сдвинуть горизонтальный сегмент визуально вниз. Что мне нравится в графическом подходе, так это то, что его легко распространить на другие 7-сегментные символы рисунок 2. - person chux - Reinstate Monica; 26.08.2020
comment
@PeterCordes Перекодировано с небольшими отклонениями от вашей идеи. Спасибо за совет. - person chux - Reinstate Monica; 26.08.2020
comment
Приятно, это даже лучше. Макросы также могут быть r1[1] != ' ', поэтому каждый раз это один и тот же символ, без необходимости сопоставлять правильную форму с правильным положением. Можно было бы даже написать (r1[1] != ' ') << 0 и так далее, но тернарный тип, вероятно, лучше для удобочитаемости, чем сдвиг логического ›int результата. - person Peter Cordes; 26.08.2020
comment
@PeterCordes Re: r1[1] != ' ', я тоже думал об этом, но с двумя вариантами кодирования: с отрицанием / без отрицания, я обнаружил, что код без отрицания легче поддерживать. и понимают - person chux - Reinstate Monica; 26.08.2020
comment
Интересный момент, вероятно, стоит потратить усилия на то, чтобы получить правильный символ для каждой позиции. - person Peter Cordes; 26.08.2020