0

我正在使用按钮进行锻炼。当按下按钮时,LED 开始闪烁,再次按下时停止。当我尝试时,LED 在第一次按下时闪烁,但在第二次按下时没有停止。我正在使用带有 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;
                }
            }
        }
    }
}
4

3 回答 3

0

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

使用 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 的闪烁并使用主循环来评估按钮压力。这避免了输入检查之间的延迟。

于 2015-05-12T06:09:31.843 回答
0

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

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

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

希望这可以帮助

于 2015-05-12T06:24:33.563 回答
0

当您触摸开关时,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 ;
}
于 2022-02-02T11:12:50.697 回答