8086-矩阵卷轴‘A’从左到右C代码
8086-Matrix Scroll ‘A’ left to right C code
我试图从左到右滚动字符 'A' 的 8*8 点阵,但我卡住了。我目前无法获得 MDA-8086 培训师套件。因此,我无法 运行 代码来检查那里实际发生的事情。
代码在这里。
#include "mde8086.h"
/* Output Font 'A' Left to Right*/
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(long 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',此循环 for( k = 0; k != 20; k++ ) 不存在。我只想知道这里这个循环有什么特点?
以上代码的输出如下图所示
8x8 点阵只能显示 8 个点亮的 LED,一个垂直列。
(实际上它可以同时显示所有相同的列,在 common
中使用多个设置位,但这会导致代码复杂并且在长 运行 中无济于事。)
要显示一个字母,您必须一一显示八列,每次等待一点(wait(120)
)。这使得一个字符,使用一种字体,但只持续很短的时间。由于发生这种情况的速度,这 8 次等待似乎是“并行的”。
这是内循环。
为了让人类有时间真正看到角色,完成了 20 次。
简单地再次等待是不可能的,因为这意味着只能在人类可感知的时间内看到最后一列。
这是外循环。
滚动是在没有循环的情况下完成的,里面有很多行不同的字体main()
。
main()
中的循环只是重复这个。
我试图从左到右滚动字符 'A' 的 8*8 点阵,但我卡住了。我目前无法获得 MDA-8086 培训师套件。因此,我无法 运行 代码来检查那里实际发生的事情。
代码在这里。
#include "mde8086.h"
/* Output Font 'A' Left to Right*/
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(long 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',此循环 for( k = 0; k != 20; k++ ) 不存在。我只想知道这里这个循环有什么特点?
以上代码的输出如下图所示
8x8 点阵只能显示 8 个点亮的 LED,一个垂直列。
(实际上它可以同时显示所有相同的列,在 common
中使用多个设置位,但这会导致代码复杂并且在长 运行 中无济于事。)
要显示一个字母,您必须一一显示八列,每次等待一点(wait(120)
)。这使得一个字符,使用一种字体,但只持续很短的时间。由于发生这种情况的速度,这 8 次等待似乎是“并行的”。
这是内循环。
为了让人类有时间真正看到角色,完成了 20 次。
简单地再次等待是不可能的,因为这意味着只能在人类可感知的时间内看到最后一列。
这是外循环。
滚动是在没有循环的情况下完成的,里面有很多行不同的字体main()
。
main()
中的循环只是重复这个。