(我的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;有什么区别吗?
恩,谢谢!
追答是不是消隐没做好。
正确的流程是,
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);
}
}
#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);
}
}
那这程序哪有问题呢?