2015-11-04 157 views
-1

我想用PIC12F675上的一个引脚作为按钮,另一个引脚用于LED。我写了这段代码,但按钮没有工作。 LED仍然亮着。 GPIO0连接到+ LED,GPIO1连接到按钮,按钮连接到地。 请帮忙。谢谢。C中的PIC按钮不起作用

#pragma config FOSC = INTRCIO // Oscillator Selection bits (INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN) 
#pragma config WDTE = OFF  // Watchdog Timer Enable bit (WDT disabled) 
#pragma config PWRTE = OFF  // Power-Up Timer Enable bit (PWRT disabled) 
#pragma config MCLRE = OFF  // GP3/MCLR pin function select (GP3/MCLR pin function is digital I/O, MCLR internally tied to VDD) 
#pragma config BOREN = OFF  // Brown-out Detect Enable bit (BOD disabled) 
#pragma config CP = OFF   // Code Protection bit (Program Memory code protection is disabled) 
#pragma config CPD = OFF  // Data Code Protection bit (Data memory code protection is disabled) 

#include <xc.h> 

int main(void) { 

    ANSEL=0x00;     // ANALOG SELECT REGISTER (digital) 
    CMCON=0x07;     // COPMARATOR DISABLE 
    nGPPU=0;     // GPIO pull-ups are enabled by individual port latch values 
    WPU1=1;      // WEAK PULL-UP REGISTER 
    TRISIO0=0; 
    TRISIO1=1; 

    while(1) { 

    if(GPIO1) 
     GPIO0=0; 
    else 
     GPIO0=1; 

    } 
    return 0; 
} 

编辑1:如果我评论的同时一切(1)除GPIO0 = 1,LED灯亮。如果我在(1)除了GPIO0 = 0之外评论所有内容,LED熄灭。 所以可能硬件是好的。 我认为这个程序中没有必要去抖动。 如果在原始程序中交换GPIO0 = 1;和GPIO0 = 0;那么LED熄灭。 PIC执行其他内容。

编辑2:我现在尝试使用pin5按钮,它的工作原理。这是什么意思?我的PIC是否损坏或代码有错误?

编辑3:现在我添加CMCON = 0x07;但没有变化。仍然没有工作。如果按钮在GPIO5上,它工作正常。如果按钮在GPIO1上,则不起作用。

+4

“不工作”不是一个明确的问题描述。使用调试器并提供详细信息。只是一个未来的提示:你应该放弃(我不会解释,因为你可以这样做!)一般按钮(这里没有必要)。并检查按钮-GPIO上的vlotage。 – Olaf

+0

您可能应该将您的问题移至http://electronics.stackexchange.com/。 – JimmyB

+0

@HannoBinder确定他们欢迎代码? – Downvoter

回答

1

我知道你已经通过使用不同的引脚“固定”了它,但最初的问题是GPIO1以及默认情况下(默认情况下禁用了它)的模拟输入也用作输入比较器,您还需要禁用它。

从数据表中引用两个部分:

cmp1

cmp2

所以,你处理了ANSEL寄存器但不CMCON,因此您的初始化部分需要的附加的代码行:

CMCON = 0x07; // turn off comparator 

如果您尝试此操作,请查看它是否适用于原始引脚配置。如果您想知道0x07来自哪里,请参阅page 37 of the datasheet,其中显示了CMCON的较低三位的设置。要禁用比较器,应将这三位设置为1,因此二进制111 == 0x07。

cmp3

+0

我加CMCON = 0x07;但如果按钮位于GPIO1上,仍然不起作用。 – Matej