8086-Матричная прокрутка ‘A’ слева направо C-кода

#c #x86-16

#c #x86-16

Вопрос:

Я пытался прокрутить точечную матрицу размером 8 * 8 для символа ‘A’ слева направо, но я на чем-то застрял. Набор для обучения MDA-8086 в настоящее время недоступен для меня. В результате я не могу запустить код, чтобы проверить, что там на самом деле происходит.

Код находится здесь.

 #include "mde8086.h"
/* Output Font 'A' Left to Ri&ht*/
int font1[8] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
int font2[8] = { 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
int font3[8] = { 0xb7, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
int font4[8] = { 0x77, 0xb7, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff };
int font5[8] = { 0x77, 0x77, 0xb7, 0xc0, 0xff, 0xff, 0xff, 0xff };
int font6[8] = { 0xb7, 0x77, 0x77, 0xb7, 0xc0, 0xff, 0xff, 0xff };
int font7[8] = { 0xc0, 0xb7, 0x77, 0x77, 0xb7, 0xc0, 0xff, 0xff };
int font8[8] = { 0xff, 0xc0, 0xb7, 0x77, 0x77, 0xb7, 0xc0, 0xff };
void wait(lon& del)
{
    while( del-- );
}
void display( int *data1 )
{
    int *data;
    int common, i, k;
    for( k = 0; k != 20; k   )
    {
        common = 0x01;
        data = data1;
        for( i = 0; i != 8; i   )
        {
            outportb( PPI2_C, common );
            outportb( PPI2_B, *data );
            wait(120);
            data  ;
            common = common << 1;
        }
    }
}
void main(void)
{
    outportb( PPI2_CR, 0x80 );
    outportb( PPI2_A, 0xff );
    do
    {
        display(font1);
        display(font2);
        display(font3);
        display(font4);
        display(font5);
        display(font6);
        display(font7);
        display(font8);
        display(font8);
        display(font8);
    } while(1);
}
  

При отображении только ‘A’ без прокрутки слева направо этот цикл для (k = 0; k != 20; k ) отсутствует. Я просто хочу знать, в чем особенность этого цикла здесь?

Результат приведенного выше кода показан на рисунке ниже.

Комментарии:

1. Ваш код представляет собой едва читаемый беспорядок без отступов . Используйте любой инструмент форматирования кода, чтобы сделать его доступным для чтения человеком.

2. @Yunnosch спасибо, я не совсем разбираюсь в коде (действительно трудно читать без вашей работы с отступами)

3. Если вы хотите произвести впечатление, проделайте то же самое только с первой половиной font8 и ни с одним из других шрифтов…

Ответ №1:

Точечная матрица 8×8 может отображать только 8 светодиодов, один вертикальный столбец.
(На самом деле это могло бы отображать все идентичные столбцы одновременно, используя более одного установленного бита внутри common , но это привело бы к усложнению кода и не помогло бы в долгосрочной перспективе.)
Чтобы отобразить одну букву, вы должны показывать восемь столбцов один за другим, каждый раз немного ожидая ( wait(120) ). Получается один символ, использующий 1 шрифт, но только на очень короткое время. 8 ожиданий кажутся «параллельными» из-за скорости, с которой это происходит.
Это внутренний цикл.

Чтобы дать человеку время действительно увидеть символ, это делается 20 раз.
Невозможно просто подождать еще раз, потому что это означало бы просмотр только последнего столбца в течение приемлемого для человека времени. Это внешний цикл.

Прокрутка выполняется без цикла, с помощью множества строк с разными шрифтами внутри main() .
Цикл внутри main() просто повторяет это.

Комментарии:

1. О боже. Вам нужно меньше полагаться на ясновидение других пользователей.

2. Что произойдет, если я увеличу значение в wait (120), скажем, wait (30000)? В этом случае мне все еще нужно использовать этот цикл?

3. Если вы подождете намного дольше, то люди смогут на самом деле увидеть, что всегда виден только один столбец. Вы почувствовали бы себя мухой на ЭЛТ — если вы достаточно взрослые, чтобы понять этот образ. 😉 Действительно жаль, что у вас нет такого оборудования. Простая попытка даст вам немедленное понимание…