问题描述
我试图从左向右滚动字符'A'的8 * 8点矩阵,但是我被卡住了。我目前无法使用MDA-8086培训师套件。结果,我无法运行代码来检查那里实际发生的情况。
#include "mde8086.h"
/* Output Font 'A' Left to Right*/
int font1[8] = { 0xff,0xff,0xff };
int font2[8] = { 0xc0,0xff };
int font3[8] = { 0xb7,0xc0,0xff };
int font4[8] = { 0x77,0xb7,0xff };
int font5[8] = { 0x77,0x77,0xff };
int font6[8] = { 0xb7,0xff };
int font7[8] = { 0xc0,0xff };
int font8[8] = { 0xff,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)
)。这使一个字符使用1种字体,但仅在很短的时间内出现。由于发生的速度很快,所以8次等待似乎是“并行”的。
这是内部循环。
要花一些时间来实际看到角色,这需要进行20次。
无法简单地再次等待,因为那将意味着只能在人类可以理解的时间内看到最后一列。
这是外循环。
main()
中的许多行具有不同的字体,因此滚动没有循环。main()
内部的循环仅重复一次。