问题描述
我试图在MDA-8086套件上显示7段LED,但是我一直在计算各个数字的十六进制值。我有代码,但是我不明白它是如何工作的。 例如, 0用十六进制值表示 0xc0 [我猜]。 我想知道,这里的值是如何计算的?
#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);
}
解决方法
这是有关硬件连接方式的信息,即显示器的引脚如何连接到端口以及端口是否需要0或1来打开网段。
从您的数字看来:
-
端口的连接方式类似于g,f,e,d,c,b,即a是LSB。
-
“丢失”的第8位应始终编程为1,即8位为
port = 1gfedcba
-
打开显示屏中的一个段需要使用0。
所以
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”等等。
我一直在计算各个数字的十六进制值。
有时候,一些宏观艺术很有趣,也很有说服力。它提供了一种图形化的方式来定义data[]
的十六进制值,而无需手动进行。
seven()
接受3行(字符串)并查找-
,|
,.
以形成十六进制值。当相应的段为 off 时,该值或在另一位。
#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