极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 16710|回复: 5

用millis函数来计时,但在这个基础上加了一个中断函数,原本的计时就不准了

[复制链接]
发表于 2013-8-2 19:51:50 | 显示全部楼层 |阅读模式
这是五分钟倒计时的代码,用了millis()函数来计时,显示在1602上;
  1. #include<Wire.h>
  2. #include<LiquidCrystal_I2C.h>
  3. LiquidCrystal_I2C lcd(0x27,16,2);
  4. unsigned long i,j,v;
  5. int t=59,x=4,k,l;
  6. void setup()
  7. { lcd.init();
  8. i=millis();
  9.   lcd.setCursor(0,0);
  10. lcd.print("www.geeetech.com");
  11.   lcd.setCursor(0,1);
  12.   lcd.print("05:00");
  13. lcd.backlight();
  14. }
  15. void loop()
  16. {
  17.   j=millis();
  18.   v=(j-i)%1000;
  19.   if(v==0)
  20.   { k=t/10;
  21.     l=t%10;
  22.     lcd.setCursor(3,1);
  23.     lcd.print(k);
  24.     lcd.setCursor(4,1);
  25.     lcd.print(l);
  26.    
  27.    if(t==59)
  28.    {
  29.     lcd.setCursor(1,1);
  30.     lcd.print(x);
  31.     x--;
  32.     if(x<0) x=4;
  33.    }
  34.    t--;
  35.    if(t<0) t=59;
  36.   }
  37. }
复制代码

这是在上面代码的基础上添加了中断函数,来检测外接按钮的按键次数,每按一次,score加5;在1602上显示出来;但是加了中断函数之后,那个计时就完全不准了,求解
  1. #include<Wire.h>
  2. #include<LiquidCrystal_I2C.h>
  3. LiquidCrystal_I2C lcd(0x27,16,2);
  4. unsigned long i,j,v;
  5. int t=59,x=4,k,l;
  6. int score=0;
  7. int button=2;//设置按钮的数字IO引脚也是中断的接口
  8. void setup()
  9. {
  10.   i=millis();
  11.   pinMode(button,INPUT);
  12.   attachInterrupt(0,count,FALLING);
  13.   lcd.init();
  14.   lcd.clear();
  15.   lcd.setCursor(0,0);
  16.   lcd.print("www.geeetech.com");
  17.   lcd.setCursor(0,1);
  18.   lcd.print("05:00");
  19.   lcd.print("score:");
  20.   lcd.setCursor(11,1);
  21.   lcd.print("00X10");
  22. lcd.backlight();
  23. }
  24. void loop()
  25. {
  26.   j=millis();
  27.   v=(j-i)%1000;
  28.   if(v==0)
  29.   { k=t/10;
  30.     l=t%10;
  31.     lcd.setCursor(3,1);
  32.     lcd.print(k);
  33.     lcd.setCursor(4,1);
  34.     lcd.print(l);
  35.    if(t==59)
  36.    {
  37.     lcd.setCursor(1,1);
  38.     lcd.print(x);
  39.     x--;
  40.     if(x<0) x=4;
  41.    }
  42.    t--;
  43.   if(t<0) t=59;
  44. }
  45.   lcd.setCursor(11,1);
  46.   lcd.print(score/10);
  47.   lcd.setCursor(12,1);
  48.   lcd.print(score%10);
  49. void count()
  50. {
  51. if(digitalRead(button)==LOW)
  52. {
  53.   delay(1);
  54.   if(digitalRead(button)==LOW)
  55.   {score+=5;}
  56. }
  57. }
  58. }
复制代码
回复

使用道具 举报

发表于 2013-8-2 22:35:06 | 显示全部楼层
关注,也有类似的这种需求
回复 支持 反对

使用道具 举报

发表于 2013-8-3 11:24:59 | 显示全部楼层
中断调用时计时要停止的哦
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-3 20:56:44 | 显示全部楼层
qptimus 发表于 2013-8-3 11:24
中断调用时计时要停止的哦

我的中断是低电平触发,我不按按钮的时候就是高电平,也就触发不了,然后那个计时,过好多秒之后才显示过了一秒;就是1602显示出来的一秒相当于几秒,就是想不明白
回复 支持 反对

使用道具 举报

发表于 2013-8-3 23:01:59 | 显示全部楼层
hdxabout 发表于 2013-8-3 20:56
我的中断是低电平触发,我不按按钮的时候就是高电平,也就触发不了,然后那个计时,过好多秒之后才显示过 ...

也许你应该应该用时钟中断来定时,或者实时钟
回复 支持 反对

使用道具 举报

发表于 2013-8-4 00:03:47 | 显示全部楼层
果断用DS1302/DS1307解决,价钱不贵精度又高,arduino做计时本来就不在行
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-6 17:45 , Processed in 0.043565 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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