Led on/off 使用 PIC 16f777a

Led on/off using PIC 16f777a

我正在使用按钮进行练习。当按下按钮时,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;
                }
            }
        }
    }
}

我认为是一个 "too short" 循环。

使用 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);
       }
    }
}

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

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

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

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

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

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

希望对您有所帮助

当你触摸开关时,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 ;
}