解释一下下面这段程序的意思,消影,延时都知道,那个取反什么意思?

从0到99的计数。
#include <reg51.h>
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void show(unsigned char n);
void delay();
void main()
{
unsigned char i;
int j;
while(1)
{
for(i=0;j=100,i<99;i++)
while(j--)
show(i);
}
}

void show(unsigned char n)
{
P0=table[n%10];//这段意思?操作的是个位?咋对P0操作,不应对P2操作?
P2=~0x01;//还有这段完全不懂,为什么只操作这点就好了
delay();//延时
P2=0xFF;//消影
P0=table[n/10];//怎么会十位还是对P0操作呢?
P2=~0x02;//~0x01,~0x02这代表了什么嘛?
delay();//延时
P2=0xFF;//消影
}

void delay()
{
int i=100;
while(i--);
}

这是一个动态显示程序,动态显示的原理是使两个数码管轮流亮,但其间隔时间很短,给人眼睛照成的错觉是两个灯都一直亮着。取反的目的是选择亮的数码管(0x01取反就是11111110(2进制),应该是编程者觉得计算11111110的十六进制麻烦,所以直接用取反)追问

P2=~0x01;改成P2=0xfe应该效果是一样的吧但是这个位选的作用是什么呢?!让数码管初始成什么样?我主要不懂这个话的作用,11111110的作用在数码管,应该是什么效果?作用

追答

嗯,效果是一样的。单片机不可能同时让两个数码管亮,所以要位选。你可以去看看关于“动态吓显示”的内容。数码管显示值你在数组中定义了。你的这个效果应该是两个数码管从9到0变化。

温馨提示:答案为网友推荐,仅供参考
相似回答