我用什么
我所知道的:
项目
我正在尝试为一个简单的项目对 PIC10F200 进行编程,基本上: GP1 是否有电流流入,根据该信息 GP0 要么打开 LED 要么保持关闭。
我已经使用此代码来检查引脚是否短路:
我需要什么帮助
所以在检查之后,这是我创建的代码(我也不明白发布代码时出了什么问题,所以......我很抱歉。):
背景(如果你问自己为什么我这么不聪明......)
尝试工作项目,没有工作项目。
[编辑]
#include <stdio.h>
#include <stdlib.h>
#include <PIC10F200.h>
// CONFIG
#pragma config WDTE = OFF
#pragma config CP = OFF
#pragma config MCLRE = OFF
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
#include <xc.h>
#define _XTAL_FREQ 4000000
void main() {
OPTION = 0b11011111;
TRISGPIO = 0b00000010;
GPIO = 0b00000000;
while (1) {
if (GP1 == '1') {
GP0 = '0'; // Turn off the LED
} else {
GP0 = '1'; // Turn on the LED
}
}
}
GP1 == '1'
都是废话。
GP0
/GP1
提供位写入和读取吗?我对此表示怀疑。'1'
是字符文字(“ASCII”),相当于二进制 00110001,因此是无意义的。使用1
。假设您有一个已声明的寄存器
GPIO
,那么您应该具有如下所示的位掩码:
#define GP0 (1u << 0)
#define GP1 (1u << 1)
或者更好地命名它们
GPIO_GP0
等以记录它们属于哪个寄存器。
读取寄存器则变为:
if((GPIO & GPIO_GP0) > 0)
...
if((GPIO & GPIO_GP1) > 0)
> 0
部分是必要的,因为当位屏蔽位0时,我们得到0x01或0x00。但是当位掩码位 1 时,我们得到 0x02 或 0x00。我们不会直接从寄存器中得到 1 或 0。
写入寄存器:
GPIO |= GPIO_GP0; // set pin GP0 to 1
GPIO &= ~GPIO_GP0; // set pin GP0 to 0
所有这些都应该包含在平均按位运算符书籍/教程中。更多详细信息请参见:如何从固件访问硬件寄存器?
主要错误是使用字符文字(带撇号)而不是数字文字(不带撇号)。
值
'1'
是 0x31
= 0x00110001
,以 ASCII 编码,但您想要 1
。
删除撇号:
if (GP1 != 0) {
GP0 = 0; // Turn off the LED
} else {
GP0 = 1; // Turn on the LED
}
有关硬件和设置的附加说明:
引脚
GP1
不测量“是否有功率流入其中”,而是感测其上的电压。但除了“浮动”(开关打开)或“低”(开关关闭)之外,您不提供任何其他级别。最有可能的是,“浮动”由于其所带电荷而被感知为“低”。请注意,它可以感应任何其他电平,甚至可以捕获电源等电场。
有两种可能的解决方案:
GPPU
寄存器中的 OPTION
设置为 0
。这会启用内置弱上拉电阻。这使浮动引脚处于“高”电平。