打印

用ds1302做个可调时钟

[复制链接]
1283|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
victor3l|  楼主 | 2013-8-23 18:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
做个ds1302的可调时钟,两个键。一个负责调整该调时,分,秒等,另一个按键负责加。
//选择设置那个项目1,2,3,4,5,6对应秒,分,时;日,月,年
void ProChs(void)
{
  if(keyNum == 1)
{
  keyNum = 0;
  func++;
  if(func > 1)
  led0 = 0;
  if(func > 6)
   func = 0;
}
}

data[]是个全局变量
void AdjusProject(void)
{
u8 low = 0;
u8 hgt = 0;  //BCD 码最低位加到9后就会进位,我用16进制的话要加到15才进位,所以这里设置BCD高位和低位
switch(func)
{
  case 1://这是秒钟设置
  {
   low = (data[0] & 0x0f);
   hgt = (data[0] >> 4);    //BCD 处理
   if(keyNum == 2)//加键按下
   {
    keyNum = 0;
    hgt += 1;//实际上每次调10秒
    if(hgt > 5)
    {
     hgt = 0;
     low = 0;
     data[0] = 0;
    }
    data[0] = hgt << 4 + low;
     disp();  //显示数据这里实际上仅仅是刷新屏幕,并没有操作芯片
    WriteData();//把调整完的数据写进芯片  
   }

  }break;
  case 2://这是分钟设置
  {
   low = (data[1] & 0x0f);
   hgt = (data[1] >> 4);
   if(keyNum == 2)//加键按下
   {
    keyNum = 0;
    low++;
    LcdShowNum(low,0xc8); //这句是想测试low到底有没有增加
    if(low > 9)
    {
     low = 0;
     hgt++;
     if(hgt > 5)
     {
      hgt = 0;
     }
    }
    data[1] = hgt << 4 + low;
     disp();  //显示数据这里实际上仅仅是刷新屏幕,并没有操作芯片
       WriteData();//把调整完的数据写进芯片
      
   }
  }break;
  case 3://这是时设置
  {
   low = (data[2] & 0x0f);
   hgt = (data[2] >> 4);
   if(keyNum == 2)//加键按下
   {
    keyNum = 0;
    low++;
    if(low > 9)
    {
     low = 0;
     hgt++;
     if(hgt > 2)
     {
      hgt = 0;
     }
    }
    data[2] = hgt << 4 + low ;
     disp();  //显示数据这里实际上仅仅是刷新屏幕,并没有操作芯片
    WriteData(); //把调整完的数据写进芯片     
   }
  }break;
  default:break;
}
}


主函数中
while(1)
{
  ProChs(); //调整
     ReadData();
    AdjusProject();
     disp();
}
问题:首先请大家看看我的这个思路是否有问题?先通过功能键选择要调那个项目,然后到那个项目下按加键调节
2,为什么在走到分设置时,按加键,始终不能加?
3,为什么每次进入调时间的时候,该调的项就显示为0,我先读的初始化中数据啊,一按下加键,至少是在原来初始化数据的基础上变化吧为什么直接跳到0?
4,当时,分的数据跳到0后,再怎么按键数据都不会变化?

ds1302,按键检测,lcd这些基本的程序都没有问题的。主要是不是我上面的逻辑有错误?谢谢

相关帖子

沙发
outstanding| | 2013-8-25 11:37 | 只看该作者
单步调试,然后检查按键部分是否完好

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

308

帖子

5

粉丝