找回密码
 马上注册

QQ登录

只需一步,快速开始

查看: 6687|回复: 5

钟表程序

[复制链接]
发表于 2012-2-21 15:20:13 | 显示全部楼层 |阅读模式
前几天看过糖大侠关于时钟的帖子
昨天拿到了新买的NXT,心血来潮,也写了个时钟的程序,指针的,左键后调,右键前调,橙色键切换小时和分钟。
在我的NXT上运行没问题。
如果发现sin()函数有问题的话,升级一下固件就可以了。

task main()
{
int i;
int flag;
int x1,y1,x2,y2;
float a;
float sec,min,hour;
long t,t1;
sec=0;
min=0;
hour=0;
t1=CurrentTick();
flag=0;
while(true)
{
  while(true)
  {
  /**************************************************/

   if (ButtonPressed(BTNCENTER,false)==true)
   {
    if(flag==0)
     flag=1;
    else
     flag=0;
    Wait(500);
   }
    if(ButtonPressed(BTNRIGHT,false)==true)
     {
      if(flag==0)
      {
       min++;
       hour=hour+1/60;
      }
      else
       hour++;
      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;
       }
      Wait(500);
     }
      
  /**************************************************/
   t=CurrentTick();
   if(t-t1>=500)
   {
    t1=t;
    goto show;
   }
  }
  show:
  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);
  }

  LineOut(49, 62, 49, 58);
  LineOut(50, 62, 50, 58);
  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);
  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(sec==60)
    sec=0;
  if(min==60)
    min=0;
  if(hour==12)
    hour=0;
}
}

如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
发表于 2012-2-21 17:40:23 | 显示全部楼层
这······
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 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);
}
}
  
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2012-2-24 17:10:28 | 显示全部楼层
本帖最后由 wabil 于 2012-2-25 10:03 编辑

升级了固件到v1.31 后还是出现 sin.cos未定义, 编译出错!!!!>!! 我的编译BBC 版本3.38

逼于无奈下唯有自己写三角函数了,根据泰勒公式自己编写近似的三角函数;

float sin(float x)
{
float ans;
  ans=x-x^3/6+x^5/120;
return ans;
}
float cos(float x)
{
  float ans;
  ans=1-x^2/2+x^4/24-x^6/720;
  return ans;
}

如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2012-2-25 17:00:01 来自手机 | 显示全部楼层
用bcc提供的固件。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2012-2-26 15:55:37 | 显示全部楼层
本帖最后由 wabil 于 2012-2-26 16:29 编辑

oh, BCC下的那个固件升级后就可以了.这个版本开机没有登陆音,按钮操作也取消了声音.显得更专业.
lms_arm_nbcnxc_131_20111019_1659.rfw
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

手机版|中文乐高 ( 桂ICP备13001575号-7 )

GMT+8, 2024-11-21 21:25 , Processed in 0.098017 second(s), 21 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表