使用PIC 16f777a开启/关闭

时间:2015-05-12 05:46:29

标签: embedded pic led hi-tech-c

我正在使用按钮进行练习。当LED开始闪烁时按下按钮,再次按下按钮时停止按钮。当我尝试时,LED在第一次按下时闪烁,但它没有在第二次停止。我正在使用PIC16F877A MCU和HiTech C编译器。我的代码是:

#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;
                }
            }
        }
    }
}

2 个答案:

答案 0 :(得分:0)

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

使用double while来捕获输入会导致两个IF在释放按钮之前有效数千次。

建议您在按钮释放时进行管理,这意味着您可以触发按钮并在释放按钮时有效按下。

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

func setSineAction()
{
    let scene = self.parent as! SKScene

    let y42 = scene.size.height/2
    let x1 = scene.size.width
    let x2 = scene.size.width * 0.875
    let x3 = scene.size.width * 0.750
    let x4 = scene.size.width * 0.625
    let x5 = scene.size.width * 0.500
    let x6 = scene.size.width * 0.375
    let x7 = scene.size.width * 0.250
    let x8 = scene.size.width * 0.125
    let x9 = 0.0 as CGFloat

    let path = CGPathCreateMutable();
    CGPathMoveToPoint(path, nil, x1, y42)
    CGPathAddQuadCurveToPoint(path, nil, (x1/2)+(x2/2), scene.size.height*0.7, x2, y42)
    CGPathAddQuadCurveToPoint(path, nil, (x2/2)+(x3/2), scene.size.height*0.3, x3, y42)
    CGPathAddQuadCurveToPoint(path, nil, (x3/2)+(x4/2), scene.size.height*0.7, x4, y42)
    CGPathAddQuadCurveToPoint(path, nil, (x4/2)+(x5/2), scene.size.height*0.3, x5, y42)
    CGPathAddQuadCurveToPoint(path, nil, (x5/2)+(x6/2), scene.size.height*0.7, x6, y42)
    CGPathAddQuadCurveToPoint(path, nil, (x6/2)+(x7/2), scene.size.height*0.3, x7, y42)
    CGPathAddQuadCurveToPoint(path, nil, (x7/2)+(x8/2), scene.size.height*0.7, x8, y42)
    CGPathAddQuadCurveToPoint(path, nil, (x8/2)+(x9/2), scene.size.height*0.3, x9, y42)

    self.runAction(SKAction.followPath(path, asOffset: false, orientToPath: false, duration: 10))

}

通过这个非常简单的解决方案,你的详细说明,按钮总是有一种“奇怪的感觉”,因为每个循环延迟250ms(在你的情况下是500ms)这意味着你可以松动单按钮压力。

记笔记,只需输入一个简单的输入,你就必须管理去抖动。 当任何机械开关的触点撞在一起时,它们会在稳定之前反弹一点,导致反弹。当然,去抖是消除反弹的过程,将模拟世界的野蛮现实转化为原始的零和零。

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

答案 1 :(得分:0)

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

如果你按下,你会进入。如果()很难,按下第二个按钮。

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

希望这有帮助