【问题标题】:Led on/off using PIC 16f777a使用 PIC 16f777a 开启/关闭
【发布时间】:2015-05-12 05:46:29
【问题描述】:

我正在使用按钮进行锻炼。当按下按钮时,LED 开始闪烁,再次按下时停止。当我尝试第 1 次按下时 LED 闪烁,但第 2 次没有停止。我正在使用带有 HiTech C 编译器的 PIC16F877A MCU。我的代码是:

#include<pic.h>
#define _XTAL_FREQ 20000000

void main()
{
 TRISB = 0x01;
 PORTB = 0x00;
 while(1){
if(RB0 == 1){
        while(1){
            PORTB = 0xff;
            __delay_ms(250);
            PORTB = 0x00;
            __delay_ms(250);
            if(RB0 == 1){
                break;
                }
            }
        }
    }
}

【问题讨论】:

  • IMO 您应该使用 PWM 输出和中断输入,目前,您的输入仅在第一次按下后每 500 毫秒验证一次,并且持续大约几分之一秒,从而解释了为什么您从不触发它.

标签: embedded pic led hi-tech-c


【解决方案1】:

我认为这是一个“太短”的循环。

使用 double while 来捕获输入会导致两个 IF 都可以有效数千次,直到您释放按钮。

建议您在按钮释放时进行管理,即您触发按钮的按下并在按钮释放时有效。

一个简单的解决方案可以是:

#include <pic.h>
#include <stdint.h>
#define _XTAL_FREQ 20000000

void main()
{
   unit8_t pressed = 0;
   bool blink = 0;

   TRISB = 0x01;
   PORTB = 0x00;
   while(1)
   {
       // Button pressed for the first time
       if ((RB0 == 1) && (pressed == 0))
       {
           pressed = 1;
       }
       // Button released = valid 
       else if ((RB0 == 0) && (pressed == 1))
       {
           pressed = 2;
       }

       if (pressed == 2)
       {
          blink ^= 1;
          pressed = 0;
       }

       if (blink == 1)
       {
          PORTB ^= 0xFE;
          __delay_ms(250);
       }
    }
}

使用这个非常简单的解决方案,根据您的详细说明,您总是对按钮有一种“奇怪的感觉”,因为 每个循环有 250 毫秒的延迟(在您的情况下为 500 毫秒),这意味着您可以松开按下一个按钮。

还要注意,您还必须通过简单的输入来管理去抖动。 当任何机械开关的触点撞击在一起时,它们会在稳定之前稍微反弹,从而导致反弹。当然,去抖动是消除反弹的过程,将模拟世界的残酷现实转换为原始的 1 和 0。

无论如何,最好的解决方案是添加一个计时器来管理 LED 的闪烁,并使用主循环来评估按钮压力。这避免了输入检查之间的延迟。

【讨论】:

  • 使用 double while 来捕获输入会导致两个 IF 在您释放按钮之前都可以有效数千次。 因为有两个延迟,所以它们不能。第二次验证每 500 毫秒进行一次,但可能也会通过第一次循环。
  • @Alexandre 当 LED 闪烁并按下按钮时(返回第一个 while)不执行延迟,代码立即返回内部循环。
【解决方案2】:

我认为您的代码运行速度太快(与之前的答案相同)。

如果你按下,你就会进入一段时间。按下第二个 if() 上的按钮是困难的。

你应该去抖动你的按钮。要触发您的按钮,您可以使用更改时中断(下降上升沿)或计算计时器中断中的“推送”次数(如果端口为低或高,则每 x 毫秒查看一次,如果端口已更改,则增加一个变量)

希望对你有帮助

【讨论】:

    【解决方案3】:

    当您触摸开关时,LED 应该打开,第二次触摸开关 LED 时应该关闭.. pic16f1527 微控制器....此代码不起作用,所以任何人都有解决方案。

    include <xc.h>
    
    int switchpressed(void){ // CREATE A FUNCTION FOR SWITCH PRESSED 1ST TIME
        if(TRISFbits.TRISF3==1){ 
            
        }
        return switchpressed;
    }
    
    int switchpressed2(void){ // CREATE A FUNCTION FOR SWITCH PRESSED 2ND TIME
        if(TRISFbits.TRISF3==1){
            
        }
        return switchpressed2;
    }
    
    void main(void) {
        ANSELFbits.ANSF3 = 0; // RF3 AS DIGITAL PIN
        
        TRISFbits.TRISF3 = 1; // PORT RF3 AS INPUT PIN
        TRISBbits.TRISB5 = 0;  // RB5 OUTPUT PIN
        do{
            
            if(RF3== switchpressed()){
               PORTBbits.RB5= 1;
            } 
            if(RF3==switchpressed2()){
                PORTBbits.RB5= 0;
            }
        }while(1);
    
        return ;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-13
      • 1970-01-01
      • 1970-01-01
      • 2015-06-28
      • 2017-09-18
      • 1970-01-01
      • 2012-05-12
      • 1970-01-01
      相关资源
      最近更新 更多