计数器计数,并在动态LED显示(去掉前导0)
#include<reg51.h>
typedef unsigned int uint;
typedef unsigned char uchar;
typedef unsigned long int lint;
sbit p0=P0^0;
sbit p1=P0^1;
sbit p2=P0^2;
sbit p3=P0^3;
sbit p4=P0^4;
sbit p5=P0^5;
sbit p6=P0^6;
sbit p7=P0^7;//P0口控制位选
uchar code led[] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数组字模 0 到 9
lint table=0,n;//总数
uchar len;//table的长度
uchar t1,t2,t3,t4,t5,t6,t7,t8;
void delay()//延时函数
{
uchar i,j;
TR0=0;
for(i=30;i>0;i--)
for(j=50;j>0;j--);
TR0=1;
}
void reflush()//动态LED的刷新
{
uchar len=0,i=0;
n=table;
while(n)//判断长度
{
len++;n/=10;
}
t1=table/1;
t2=table/10;
t3=table/100;
t4=table/1000;
t5=table/10000;
t6=table/100000;
t7=table/1000000;
t8=table/10000000;//取各个位的数字
for(i=1;i<=8;i++,P0=0xff)
{
if(i>len)//当长度大于实际长度时,退出
break;
switch(i)
{
case 1: p0=0;P2=led[t1];delay();break;//P2口控制断选
case 2: p1=0;P2=led[t2];delay();break;
case 3: p2=0;P2=led[t3];delay();break;
case 4: p3=0;P2=led[t4];delay();break;
case 5: p4=0;P2=led[t5];delay();break;
case 6: p5=0;P2=led[t6];delay();break;
case 7: p6=0;P2=led[t7];delay();break;
case 8: p7=0;P2=led[t8];delay();break;
}
}
}
void main()
{
uint count;
TMOD=0x01;
TH0=0xb8;
TL0=0x00;
count =0;
TR0=1;//计数器
while(1)
{
if(table>99999999)
table=0;
if(TF0==1)
{
TH0=0xb8;
TL0=0x00;
TF0=0;
reflush();
count++;
}
if(count==4)//每四次table加一次
{
table++;
count=0;
}
}
}
实际效果图
这个问题之前还有人在问呢,谢谢分享
呵呵,菜鸟一枚。我也是刚学单片机。以前有一点C语言基础....程序写的不是很完美,在算法,在时间的控制上...写出后就急于把代码给贴出来了,望多点评。
挺好的 谢谢小编分享
嗯 继续努力...... 先国庆玩一把在说