弄了半天啊,原来是问题在于到9时没有进1,两个9或更多9时没有往后SCAN |
//***8只7段数码管,想实现在末位数码管每秒跳变一次,满10进一位,倒数第二位满10也进1,依次类推*****/// 硬件有,74HC138译码器,74HC573移位器 ******/ #include<reg51.h>#include<intrins.h> #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 ScanNumber(k); Display(n); } }//end while } 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,j; for(;i<8;i++) { if(n[i]==10) { j=k; n[j]=0; ; n[++j]+=1;//前位进1 ScanNumber(j); } } 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--); } 显示效果不是很理想,功能已经达到 |
楼主能分享一下 怎么搞定的吗 |
终于搞定了,哈哈:-) |
在线跪求大神啊 |