计算 MDA-8086 上 7 段 LED 的十六进制值
Calculating hexadecimal values for 7-segment LED on MDA-8086
我试图在 MDA-8086 套件上显示 7 段 LED,但我一直在计算各个数字的十六进制值。我有代码,但我不明白它是如何工作的。
比如0用十六进制值表示0xc0[我猜].
我想知道,这里的值是如何计算出来的?
七段LED显示的C代码:
#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);
}
已从此处生成输出:
这是关于您的硬件 hook-up 的情况,即显示器的引脚如何连接到端口以及是否需要端口上的 0 或 1 来打开一个段。
从你的数字看来:
端口接法如g,f,e,d,c,b,a即: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
剩下的自己检查。
EDIT 查看sigment图片,可能是第8位(我称之为“未使用”)实际上控制着段的“DP”部分。这只是一个猜测,但也许如果您将 0x40 写入端口,您会在显示屏上看到 0.
。
当你只显示数字时,有很多未使用的组合。其中一些看起来像字母,例如H
。因此,为了好玩(又名练习),您可以让显示屏拼写单词,例如“HELLO”、“CACAO”、“BEEF”等等。
I am stuck at calculating the hexadecimal values for respective digits.
有时,一些微距艺术很有趣且具有说明性。它提供了一种图形方式来定义 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
我试图在 MDA-8086 套件上显示 7 段 LED,但我一直在计算各个数字的十六进制值。我有代码,但我不明白它是如何工作的。 比如0用十六进制值表示0xc0[我猜]. 我想知道,这里的值是如何计算出来的?
七段LED显示的C代码:
#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);
}
已从此处生成输出:
这是关于您的硬件 hook-up 的情况,即显示器的引脚如何连接到端口以及是否需要端口上的 0 或 1 来打开一个段。
从你的数字看来:
端口接法如g,f,e,d,c,b,a即: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
剩下的自己检查。
EDIT 查看sigment图片,可能是第8位(我称之为“未使用”)实际上控制着段的“DP”部分。这只是一个猜测,但也许如果您将 0x40 写入端口,您会在显示屏上看到 0.
。
当你只显示数字时,有很多未使用的组合。其中一些看起来像字母,例如H
。因此,为了好玩(又名练习),您可以让显示屏拼写单词,例如“HELLO”、“CACAO”、“BEEF”等等。
I am stuck at calculating the hexadecimal values for respective digits.
有时,一些微距艺术很有趣且具有说明性。它提供了一种图形方式来定义 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