//***8只7段数码管,想实现在末位数码管每秒跳变一次,满10进一位,倒数第二位满10也进1,依次类推(不要取商取余,那样运算慢有卡顿)*****///
***k的值一直没变,总是0,返回的tmp只到1就没了。这是为什么??
硬件有,74HC138译码器,74HC573移位器 ******/
#include#include
#define uint unsigned int
#define uchar unsigned char
#define GPIO P0sbit LE=P1^0; //74HC573移位器 段选使能
sbit LSA=P2^2; //此三脚接138译码器,用来选择哪个管显示
sbit LSB=P2^3;
sbit LSC=P2^4;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f
};//,0x77,0x7c,//0x39,0x5e,0x79,0x71//显示0~F的值 取0-9
uint time=0,n[8]; //0-7代表8位数码管,数组里装数码管的值
void Delay10ms(uint c);
void Display_Arr(uint x);//选择显示第几位
void InitTimer0(void); //定时器初始化void Display(uint *x);
uint ScanNumber(uint);//扫描8管是否有等于10,返回i,否则返回0//
void FillOneTube(uint x,uint y);
void main()
{
uint i, k=0,tmp=0; //n用来表示要显示的数字,i表示要显示第几位,前面有几个显0的
InitTimer0();
for(i=0;i<8;i++)
n[i]=0;
while(1)
{
if(time==100) //1秒才跳数
{
time=0;
n[0]++; //末位管进1
if(n[0]==10)
n[0]=0;
if(ScanNumber(k)==8)//没有进位到10的管子
{
Display(n);
}
else
{
tmp=ScanNumber(k); //有管子=10,赋给临时变量T
n[tmp]=0; ;
n[++tmp]+=1;//前位进1
Display(n);
}
}//end while
}
void testTen()
{
int i;
for(i=0;i<8;i++)
if(n[i]==10)
{
n[i]=0;
n[i++]+=1;
}
}
void Display(uint * x)
{
uint i;uint y[8];
for(i=0;i<8;i++)
{
y[i]=*x;
x++;
}
for(i=0;i<8;i++)
{
Display_Arr(i);
LE=1;
GPIO=table[y[i]];
LE=0;
Delay10ms(1);
}
}
uint ScanNumber(uint k)
{
uint i=0;
for(;i<8;i++)
{
if(n[i]==10)
{
k=i;
return k;
}
}
return 8; //没有等于10的数组
}
void Display_Arr(uint x) //选择8个数码管的哪个亮
{
switch(x) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;
case(1):
LSA=1;LSB=0;LSC=0; break;
case(2):
LSA=0;LSB=1;LSC=0; break;
case(3):
LSA=1;LSB=1;LSC=0; break;
case(4):
LSA=0;LSB=0;LSC=1; break;
case(5):
LSA=1;LSB=0;LSC=1; break;
case(6):
LSA=0;LSB=1;LSC=1; break;
case(7):
LSA=1;LSB=1;LSC=1; break;
}
}
void Tiner_Int() interrupt 1
{
TH0 = 0xD8; //定时10MS
TL0 = 0xF0;
time++;
}
void InitTimer0(void)// 定时器0初始化
{
TMOD = 0x01; //方式1
TH0 = 0xD8; //定时10MS
TL0 = 0xF0;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void Delay10ms(uint c) //误差 0us
{
unsigned char a,b;
for(;c>0;c--)
for(b=10;b>0;b--) //原为38
for(a=130;a>0;a--);
}