本帖最后由 刘前辈 于 2010-10-18 14:53 编辑
sbit led1=P2^1; //定义第一只数码管的控制线
sbit led2=P2^0; //定义第二只数码管的控制线
sbit led3=P2^2; //定义第三只数码管的控制线
sbit K0=P3^2;
#define dig1 led1=0;led2=1;led3=1; //只点亮第一只数码管
#define dig2 led1=1;led2=0;led3=1; //只点亮第二只数码管
#define dig3 led1=1;led2=1;led3=0; //只点亮第三只数码管
#define show P0//定义P0口为所显示段码的控制
uchar number[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98};//数码0~9
uchar one; //个位
uchar ten; //十位
uchar hundred;//百位
void delay_ms(unsigned int time) //延时1毫秒程序,n是形式参数
{
unsigned int i,j;
for(i=time;i>0;i--)//i不断减1,一直到i>0条件不成立为止
for(j=112;j>0;j--)//j不断减1,一直到j>0条件不成立为止
{;}
}
void T0_init(void)
{
TMOD=0x01;//选择工作方式1
TL0=0x66; //每6ms中断一次
TH0=0xea;
TF0=0; //中断标志位清零
ET0=1; //允许定时器0中断
EA=1; //允许总中断
TR0=1; //启动定时器
}
void main(void)
{
uchar i,j,k;
T0_init(); //定时器0初始化
i=0; //控制个位数码
j=0; //控制十位数码
k=0; //控制百位数码
one=number[0]; //上电时三位数码管都显示为000
ten=number[0];
hundred=number[0];
while(1)
{
if(K0==0)//判断是否有按键被下
{
delay_ms(20);//延时消抖
if(K0==0)//确认有按键被下
{
while(K0==0);//等待按下松开
i++;//个位递增
one=number;//显示个位
if(i==10)//假如个位为10立即向十位进1
{
i=0;//个位再从0开始递增
j++;//十位递增
one=number;//显示个位
ten=number[j]; //显示十位
if(j==10)//假如十位为10立即向百位进1
{
j=0;//十位再从0开始递增
ten=number[j];//显示十位
k++;//百位递增
hundred=number[k]; //显示百位
if(k==10)//当计数为999时立即转为000从新开始递增
{
i=0;//三位数码管都显示为000
j=0;
k=0;
one=number[0];
ten=number[0];
hundred=number[0];
}
}
}
}
}
}
}
void time_display(void) interrupt 1{
static uchar show_bit=1;
TL0=0x66; //定时器赋初始6ms.
TH0=0xea;
switch(show_bit)
{
case 1:
{
dig1 //只点亮第一只数码管
show=hundred; //百位
show_bit=2;//下次进中断程序点亮十位
break;
}
case 2:
{
dig2 //只点亮第二只数码管
show=ten; //十位
show_bit=3;//下次进中断程序点亮百位
break;
}
case 3:
{
dig3 //只点亮第三只数码管
show=one; //个位
show_bit=1;//下次进中断程序点亮个位
break;
}
}
} |