hdxabout 发表于 2013-8-2 19:51:50

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

这是五分钟倒计时的代码,用了millis()函数来计时,显示在1602上;
#include<Wire.h>
#include<LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
unsigned long i,j,v;
int t=59,x=4,k,l;
void setup()
{ lcd.init();
i=millis();
lcd.setCursor(0,0);
lcd.print("www.geeetech.com");
lcd.setCursor(0,1);
lcd.print("05:00");
lcd.backlight();
}
void loop()
{
j=millis();
v=(j-i)%1000;
if(v==0)
{ k=t/10;
    l=t%10;
    lcd.setCursor(3,1);
    lcd.print(k);
    lcd.setCursor(4,1);
    lcd.print(l);
   
   if(t==59)
   {
    lcd.setCursor(1,1);
    lcd.print(x);
    x--;
    if(x<0) x=4;
   }
   t--;
   if(t<0) t=59;
}
}
这是在上面代码的基础上添加了中断函数,来检测外接按钮的按键次数,每按一次,score加5;在1602上显示出来;但是加了中断函数之后,那个计时就完全不准了,求解
#include<Wire.h>
#include<LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
unsigned long i,j,v;
int t=59,x=4,k,l;
int score=0;
int button=2;//设置按钮的数字IO引脚也是中断的接口
void setup()
{
i=millis();
pinMode(button,INPUT);
attachInterrupt(0,count,FALLING);
lcd.init();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("www.geeetech.com");
lcd.setCursor(0,1);
lcd.print("05:00");
lcd.print("score:");
lcd.setCursor(11,1);
lcd.print("00X10");
lcd.backlight();
}
void loop()
{
j=millis();
v=(j-i)%1000;
if(v==0)
{ k=t/10;
    l=t%10;
    lcd.setCursor(3,1);
    lcd.print(k);
    lcd.setCursor(4,1);
    lcd.print(l);
   if(t==59)
   {
    lcd.setCursor(1,1);
    lcd.print(x);
    x--;
    if(x<0) x=4;
   }
   t--;
if(t<0) t=59;
}
lcd.setCursor(11,1);
lcd.print(score/10);
lcd.setCursor(12,1);
lcd.print(score%10);
void count()
{
if(digitalRead(button)==LOW)
{
delay(1);
if(digitalRead(button)==LOW)
{score+=5;}
}
}
}

万马奔腾 发表于 2013-8-2 22:35:06

关注,也有类似的这种需求:):):)

qptimus 发表于 2013-8-3 11:24:59

中断调用时计时要停止的哦

hdxabout 发表于 2013-8-3 20:56:44

qptimus 发表于 2013-8-3 11:24 static/image/common/back.gif
中断调用时计时要停止的哦

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

qptimus 发表于 2013-8-3 23:01:59

hdxabout 发表于 2013-8-3 20:56 static/image/common/back.gif
我的中断是低电平触发,我不按按钮的时候就是高电平,也就触发不了,然后那个计时,过好多秒之后才显示过 ...

也许你应该应该用时钟中断来定时,或者实时钟

Ansifa 发表于 2013-8-4 00:03:47

果断用DS1302/DS1307解决,价钱不贵精度又高,arduino做计时本来就不在行
页: [1]
查看完整版本: 用millis函数来计时,但在这个基础上加了一个中断函数,原本的计时就不准了