使用mikroC for PIC的PIC单片机中基于定时器的中断

时间:2017-06-26 10:40:21

标签: c pic c89 mikroc

我在mikroC for PIC中实现基于定时器的中断时遇到了问题。

如果在PORTC.F0上有按键,我想要将端口引脚切换8次,并且在切换之间应该有100ms的延迟。

通常使用延迟功能

非常容易
setCustomBigContentView()

但在此期间,系统错过了任何其他按键。所以我想到使用中断来实现解决方案。

 private RemoteViews remoteView(String message)
    {
        RemoteViews views;
        views = new RemoteViews(getPackageName(), R.layout.YOUR_LAYOUT_HERE);
        views.setImageViewBitmap(R.id.YOUR_BIG_IMAGE_ID_FROM_LAYOUT, bitmap);
        views.setImageViewBitmap(R.id.YOUR_APP_ID_FROM_LAYOUT, BitmapFactory.decodeResource(getResources(), R.drawable.APP_ICON_OF_YOUR_APP));
        views.setTextViewText(R.id.YOUR_BIG_TEXTVIEW_ID_FROM_LAYOUT, message);
        return views;
    }

什么都没有用。有人可以帮我纠正代码吗?

2 个答案:

答案 0 :(得分:1)

嗯,这看起来并不正确:

  if (flag==1)
  {
   for (i=0;i<=8;i++)
   {
    PORTB=~PORTB;
    flag=0;
   }
  }

当您第一次看到设置了flag时,您会立即循环并切换输出8次,不用等待flag转回1.那个&#39 ;不对,它过于简化了。

您需要查找flag,然后切换输出并清除flag,并等待它再次设置,并保持计数器并行。 for循环不是适当的结构,因为它会锁定&#34;程序的其余部分可能会导致错过按键。

答案 1 :(得分:0)

初始化计时器时:

void Inittimer()
{
 T1CON         = 0x01;
 TMR1IF_bit    = 0;
 TMR1H         = 0x06;  // No prescaler? I doubt your clock speed is 40-some KHz!
 TMR1L         = 0x00;
 TMR1IE_bit    = 1;
 INTCON        = 0xC0;
}

为什么不直接从ISR控制LED?

  if (ttime)
      PORTB.F0 = (--ttime & 1);  // ttime is not decremented when led is not blinking.
  else
      PORTB.F0 = 0;              // ensures the LED is off.

开始闪烁8次:

if (SW==0)
{
  PORTB.F0 = 1;
  ttime = 16;
}

请注意,在100ms时钟中断时,第一个&#39;闪烁&#39; LED可能持续200ms ...这就是为什么许多人喜欢使用更快的定时器中断(这通常也有其他用途),控制LED需要添加一个软后缩放器

   if (blinking)
   {
      if (--blinkTimer == 0)
      {
         blinkTimer = BLINK_DELAY;      // whatever number it takes for 100ms.
         PORTB.F0 = (--blinking & 1);  
      }
   }
   else
   {
       PORTB.F0 = 0
   }

开始闪烁:

if (SW==0)
{
  blinking = (2 * BLINKS) - 1;
  blinkTimer = BLINK_DELAY;
  PORTB.F0 = 1;
}

这应该让你第一次眨眼。