关于单片机时钟c语言程序闪烁变量的问题。

void led_disp()
{ uchar cant1,cant2;
if(b==0)
{
cant1=0;cant2=0;
clock_ms=clk_time[0]/ 16; clock_mg=clk_time[0]%16;

clock_fs=clk_time[1]/ 16; clock_fg=clk_time[1]%16;
mie=clock_fs*10+ clock_fg;
clock_ss=clk_time[2]/ 16; clock_sg=clk_time[2]%16;//BCD*to*10
hour=clock_ss*10+ clock_sg; //用16求商和余进行"高4位"和"低4位"分离
}

if(b==1)
{
cant1++;
cant2=0;
clock_ss=hour/ 10; clock_sg=hour%10;

clock_fs=mie/ 10; clock_fg=mie%10;

clock_ms=sei/10; clock_mg=sei%10;
}
if(b==2)
{ cant1=0;
cant2++;
clock_ss=hour/ 10; clock_sg=hour%10;

clock_fs=mie/ 10; clock_fg=mie%10;

clock_ms=sei/10; clock_mg=sei%10;
}

if(cant1<=3)
{
P2=0;
P0=ledmap[clock_ss];
delay(1);
P0=0X00;
P2=1;
P0=ledmap[clock_sg];//时个位
delay(1);P0=0X00;}
if(cant1==5)
cant1=0;
P2=2;
P0=ledmap[10];//显示"-"数组里的 0x40
delay(1);
P0=0X00;

if(cant2<=3)
{
P2=3;
P0=ledmap[clock_fs];//分十位
delay(1);
P0=0X00;
P2=4;
P0=ledmap[clock_fg];//时个位
delay(1);P0=0X00;
}
if(cant2==5)
cant2=0;
P2=5;
P0=ledmap[10];//显示"-"数组里的 0x40
delay(1);
P0=0X00;

P2=6;
P0=ledmap[clock_ms];//秒十位
delay(1);
P0=0X00;
P2=7;
P0=ledmap[clock_mg];
delay(1);P0=0X00;
闪烁变量cant1 cant2分别是什么含义,为什么要讨论小于等于3和等于5两种情况,希望c语言高手们帮帮忙,给予详细解答,我愿多多追加悬赏。急!!!
b是按键按下次数,前面部分程序是:int hour,mie,sei;
uchar clk_time[3]; //秒,分,时寄存器初始值
code uchar ledmap[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x40};
这是用时钟芯片ds1302做的,望高手给予帮助。
//数码管段码
这是别人的一个程序,我理解不了cant1 cant2具体含义以及后面程序对其取值范围的讨论,再次说明一下这是一个时钟显示程序。

#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar j,i;
sbit p1_0=P1^0; //定义“位变量”
sbit p1_1=P1^1;
sbit p1_2=P1^2;
sbit p1_3=P1^3;
sbit p1_4=P1^4;
sbit p1_5=P1^5;
sbit p1_6=P1^6;
sbit p1_7=P1^7;
sbit p2_0=P2^0;
sbit p2_1=P2^1;
sbit p2_2=P2^2;
sbit p2_3=P2^3;
sbit p2_4=P2^4;
sbit p2_5=P2^5;
sbit p2_6=P2^6;

void mDelay (unsigned int DelayTime)
{
unsigned int j=0;
for(;DelayTime>0;DelayTime--)
{for(j=0;j<125;j++)

}
} //延时子程序 执行一次1mS

uchar Key()
{
uchar KeyV;
uchar tmp;
P3=P3|0x1f; //强行置“1”,按键引脚为高电平;
KeyV=P3; //重读P3端口状态
if((KeyV|0xe0)==0xff) //“真”无按键按下
return(0); //延时,键按下10mS为有效
mDelay(10); //再重读P3端口状态
KeyV=P3;
if((KeyV|0xe0)==0xff) //“真”无按键按下,“假”有按键按下执行“else”
return(0);
else
{
for(;;)
{
tmp=P3;
if((tmp|0xe0)==0xff)
break;
} //确认按键释放后跳出 循环for
return(KeyV); //返回P3端口状态到主函数“Key()”
}
}

void main()
{
uchar KValue;
uchar position=0; //水位按键记录

bit button1=0; //洗涤剂按键标记
bit button2=0; //加温水按键标记
bit button3=0; // 加温水、洗涤剂按键标记
bit button4=0; //水位按键标志;
bit button5=0; //开始按键标志;

bit L=0; //
bit M=0;
bit H=0;

for(;;)
{

KValue=Key();
switch(KValue)
{
case 0xfe: // 洗涤剂按键被按下;
{
button1=1;
button2=0;
button3=0;
break;
}
case 0xfd: // 加温水按键被按下;
{
button1=0;
button2=1;
button3=0;

break;
}
case 0xfb: // 加温水、洗涤剂按键被按下;
{
button1=0;
button2=0;
button3=1;

break;
}
case 0xf7: //水位按键被按下;
{
button4=1;

break;
}
case 0xef: // 开始按键被按下;
{
button5=1;
break;

}
}
if(button5==0) //开始键没被按下;
{
if(button1) //加洗涤剂;
{
p1_0=0;
p1_1=1;
mDelay(1000);
p1_0=!p1_0;
mDelay(1000);

}
if(button2) //加温水;
{
p1_0=1;
p1_1=0;
mDelay(1000);
p1_1=!p1_1;
mDelay(1000);

}
if(button3) // 加温水、洗涤剂;
{
p1_0=0;
p1_1=0;
mDelay(1000);
p1_0=!p1_0;
p1_1=!p1_1;
mDelay(1000);

}
if(button4) //水位选择判断
{
position=position+1;
button4=0;
switch(position%3)
{
case 1: //低水位;
{
p2_4=0;
p2_5=1;
p2_6=1;
L=1;
M=0;
H=0;
break;
}
case 2: // 中水位;
{
p2_4=1;
p2_5=0;
p2_6=1;
L=0;
M=1;
H=0;
break;
}
case 0: // 高水位;
{
p2_4=1;
p2_5=1;
p2_6=0;
L=0;
M=0;
H=1;
break;
}
}
}
}
if(button5) //开始键被按下,进行加水
{
if(L) //低水位操作;
{
p2_0=0;
p1_2=0;
mDelay(3000);
p2_0=1;
for(i=0;i<10;i++) //闪烁;
{
p1_2=!p1_2;
mDelay(30);
p1_2=!p1_2;
mDelay(30);
}
p1_2=1;
L=0;

}
if(M) //中水位操作;
{
p2_0=0;
p1_2=0;
mDelay(6000);
p2_0=1;
for(i=0;i<10;i++) //闪烁;
{
p1_2=!p1_2;
mDelay(30);
p1_2=!p1_2;
mDelay(30);
}
p1_2=1;
M=0;

}
if(H) //高水位操作;
{
p2_0=0;
p1_2=0;
mDelay(10000);
p2_0=1;
for(i=0;i<10;i++) //闪烁;
{
p1_2=!p1_2;
mDelay(30);
p1_2=!p1_2;
mDelay(30);
}
p1_2=1;
H=0;

}
button5=0; //水位到达,标记清零
}

}

}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-01-04
具体程序不知道。不好答。
你不妨可以试一下改变3和5的值,自己调试一下,自然就能发现cant是用来干嘛的!
我猜:时间间隔或闪烁间隔
第2个回答  2011-01-06
已发到baiduhi,请给分本回答被提问者采纳
第3个回答  2011-01-04
这个问题需从编程上解决
相似回答