单片机的数码管显示两位数的c出现了问题?

(我的6位数码管位选接在单片机P0^0到P0^4,段选接在P2^0到P2^7。)我希望数码管出现两位数,但我发现用sbit s1=P0^0;sbit s2=P0^1;主函数中s1=0;P2=number【0】;s2=0;P2=number【1】;不可行,而直接在主函数中用P0=0xfe;P2=number【0】;P0=0xfd;P2=number【1】;可行,这是为什么呢?sbit s1=P0^0,主函数中s1=0;和直接在主函数中用P0=0xfe;有什么区别吗?

s1=0只是让 p0.0口为0
P0=0xfe 也是让 P0.0口为0,但还让别的口为高。
你s1=0时,要让s2等等别的口为高才行。要是同时有两个或多个为0就不行了。追问

恩,谢谢!

追答

是不是消隐没做好。
正确的流程是,
P2=number【0】;
s0=0;
Delay_5ms();
s0=1;
delay();// 这个短点 也可不要 先要位选全关掉。
P2=number【1】; // 过会再输出下个的段
s1=0; //然后再位选通
Delay_5ms();
s1=1;

追问

#include
sbit led1=P0^0;
sbit led2=P0^1;
#define dig1 led1=0;led2=1;led3=1;
#define dig2 led1=1;led2=0;led3=1;
unsigned char number[]={0x9f,0x9f,0x49,0x9,0x3,0x3,0x85};
void delay(uint z)
{ uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{ while(1)
{dig1;
、P2=number[3];delay(1);
dig2;
P2=number[2];delay(1);
}
}
那这程序哪有问题呢?

追答

两个位换的太快了,每一个要延时5ms再换下一个

追问

不行,会出现出现两个数叠在一起!为什么呢?

追答

消隐没做好吧,试试这个
void main()
{ P0=0xff;
while(1)
{
P2=number[2];
s0=0;
delay(500);
s0=1;
delay(2);
P2=number[3];
s1=0;
delay(500);
s1=1;
delay(2);
}
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-03-31
你写成s1=0;s2=1;p2=number;s1=1;s2=0;p2=number;就可以了。你一看就明白追问

#include
sbit led1=P0^0;
sbit led2=P0^1;
#define dig1 led1=0;led2=1;led3=1;
#define dig2 led1=1;led2=0;led3=1;
unsigned char number[]={0x9f,0x9f,0x49,0x9,0x3,0x3,0x85};
void delay(uint z)
{ uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{ while(1)
{dig1;
、P2=number[3];delay(1);
dig2;
P2=number[2];delay(1);
}
}
那这程序哪有问题呢?

相似回答
大家正在搜