数码管显示疑惑
时间:10-02
整理:3721RD
点击:
程序原本设想是实现第一个数码管显示1,延时0.5s,然后第二个显示2,延时0.5s,一直到第八个数码管显示7,延时0.5s,然后再回来显示第一个数码管,一直这样循环下去。
但是实际上确变成了第一个数码管显示1,第一,二显示2,第一,二,三显示3,求解程序哪里出错呢
程序如下:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delayms(uint x) //延时函数
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void main()
{
while(1)
{ //亮第一个数码管
uint n,temp=0x7f;
for(n=0;n<8;n++)
{
P2=temp;
P0=table[n];
delayms(500);
temp=~temp;
temp=temp>>1;
temp=~temp;
}
n=0; //清零
}
}
但是实际上确变成了第一个数码管显示1,第一,二显示2,第一,二,三显示3,求解程序哪里出错呢
程序如下:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delayms(uint x) //延时函数
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void main()
{
while(1)
{ //亮第一个数码管
uint n,temp=0x7f;
for(n=0;n<8;n++)
{
P2=temp;
P0=table[n];
delayms(500);
temp=~temp;
temp=temp>>1;
temp=~temp;
}
n=0; //清零
}
}
你那个TEMP赋值要放WHILE外面
应该是P2语句的问题
你那个右移是移动一位,左侧空位补0。所以移动一位就多一位0.所以问题出在了移动函数上。你用_CROR_函数就解决了
我知道用_cror_函数可以,我移动了之后有再取反啊,还会多一位0?
取反是所有位都反了一次,肯定有错误。你用或一置一的方法,就可以消除这个影响了。
我明白了,谢谢
