|
楼主 |
发表于 2012-2-21 19:58:04
|
显示全部楼层
本帖最后由 prcthinker 于 2012-2-22 17:25 编辑
作了少许改进,增加了整点响铃,几点响几次, 半点响铃.当然如果谁有兴趣的话,也可以把响铃改成人工报时,甚至鸡叫。
测试通过,有兴趣的可以直接复制到NXC中编译。
另外为了大家容易理解,增加了注释,希望对大家有帮助
如果用NXT-G,是不是会很壮观。
//by prcthinker
//2012-2-22
task main()
{
int i;
int flag,flag1,sound,soundNum,soundTime;
int x1,y1,x2,y2; //划线坐标
float a;
float sec,min,hour; //时间
long t; //NXT时钟
sec=0;
min=0;
hour=0;
t=CurrentTick();
flag1=0;
flag=0;
sound=0;
soundNum=0; //整点响铃次数
soundTime=0; //整点响铃间隔时间
while(true)
{
while(CurrentTick()-t<500) //秒针0.5s移动一次
{
/*****************调整时间**************************/
//ButtonPressed(BTNEXIT,false) //退出键,这里不用
//橙色键,以确定调整小时还是分钟
if (ButtonPressed(BTNCENTER,false)==true)
{
if(flag==0)
flag=1; //调整小时
else
flag=0; //调整分钟
Wait(500);
}
//右键,增加
if(ButtonPressed(BTNRIGHT,false)==true)
{
if(flag==0)
{
min++;
if(min>60) //判断是否超出范围,下同
min=min-60;
hour=hour+1/60;
if(hour>12)
hour=hour-12;
}
else
{
hour++;
if(hour>12)
hour=hour-12;
}
flag1=0; //响铃次数赋值标记取消,以免调整时间时响铃次数产生错误
Wait(500);
}
//左键,减少
if(ButtonPressed(BTNLEFT,false)==true)
{
if(flag==0)
{
min--;
if(min<0)
min=min+60;
hour=hour-1/60;
if(hour<0)
hour=hour+12;
}
else
{
hour--;
if(hour<0)
hour=hour+12;
}
flag1=0;
Wait(500);
}
/********************调整时间结束****************************/
}
t=t+500;
ClearScreen(); //清屏
PointOut(50, 32); //时钟中心
CircleOut(50, 32, 30); //画表盘
for(i=0;i<12;i++) //画刻度
{
a=i*30*PI/180;
x1=50+30*cos(a);
y1=32+30*sin(a);
x2=50+26*cos(a);
y2=32+26*sin(a);
LineOut(x1, y1, x2, y2);
}
//3、6、9、12点加粗
LineOut(49, 62, 49, 58);
LineOut(50, 62, 50, 58); //因计算精度问题 ,12点位置重画
LineOut(51, 62, 51, 58);
LineOut(49, 2, 49, 6);
LineOut(51, 2, 51, 6);
LineOut(20, 31,24,31);
LineOut(20, 32,24,32);
LineOut(20, 33,24,33);
LineOut(80, 31,76,31); //9点位置重画
LineOut(80, 33,76,33);
sec=sec+0.5; //时间变量赋值
min=min+0.5/60;
hour=hour+0.5/3600;
a=sec*6*PI/180; //计算秒针位置
x1=50+24*sin(a);
y1=32+24*cos(a);
x2=50+3*sin(a);
y2=32+3*cos(a);
LineOut(x1, y1, x2, y2); //画秒针
a=min*6*PI/180; //计算分针位置
x1=50+20*sin(a);
y1=32+20*cos(a);
x2=50+3*sin(a);
y2=32+3*cos(a);
LineOut(x1, y1, x2, y2); //画分针
a=hour*30*PI/180; //计算时针位置
x1=50+16*sin(a);
y1=32+16*cos(a);
x2=50+3*sin(a);
y2=32+3*cos(a);
LineOut(x1, y1, x2, y2); //画时针
if(60-min<2 && flag1==0) //在60分附近时对正点响铃次数赋值
{ //精度原因,min在整点时可能比60大一点,也可能小一点
soundNum=hour+1; //小数部分被舍去,+1
flag1=1; //响铃次数赋值标志,1表示以后不再被赋值
}
if(sec==60) //sec到60归零
sec=0;
if(abs(min-60)<0.008) //判断是否整点,同样因精度原因min可能不会正好是60
{
min=0;
sound=1; //整点,响铃标志
}
if(abs(hour-12)<0.0002) //hour归零
hour=0;
if(sound==1) //整点响铃
{
if(soundTime%3==0) //响铃间隔
{
PlayTone(462,200); //响铃
soundNum--;
}
soundTime++;
}
if(soundNum<=0) //响铃完成后取消个标志
{
sound=0; //不再响铃
flag1=0; //响铃次数可重新赋值
soundTime=0; //响铃次数清零
}
if(abs(min-30)<0.5 && sec==0) //半点响铃
PlayTone(562,500);
}
}
|
|