不幸的是,您不能在 C 中传递位。查看此常见问题解答以获取更多信息:http ://www.xargs.com/pic/c-faq.html#pinarray
因此,解决方法是将一个标志传递给您的 I/O 函数,以在最低级别触发开关或 if-else:
void send_bit (char device,char value) {
switch (device) {
case DEVICE_1:
// output bit value to correct port
break;
case DEVICE_2:
// output bit value to correct port
break;
}
}
现在消除了这种丑陋,我们可以在它之上构建更简洁的代码:
// The following is just a generic example, change bit order etc
// to fit the protocol you're using.
void send_byte (char device, char value) {
char i;
for (i=0;i<8;i++) {
send_bit(device,(value >> i)&0x01);
}
}
void send_message (char device, char address, char *buffer, char length) {
char i;
send_byte(device,address);
for (i=0;i<length;i++) {
send_byte(device,buffer[i]);
}
}
关键是将丑陋只包含在一个地方 - 最低级别的 I/O 功能。然后在它之上构建更清晰的抽象。
其他注意事项:
如果您使用双向信号,则永远不应将输出位设置为 1。如果高值发生冲突,这样做可能会损坏 PIC 的输出缓冲区或其他设备的输出缓冲区。
相反,双向信号通常实现为带有上拉电阻的集电极开路电路。这样,设备通过拉低电压来传输 0,通过将输出设置为高阻抗来传输 1。因此,与 1-wire 器件通信的正确方法是将输出引脚硬编码为 0,并在输出模式(发送 0)和输入模式(发送 1)之间切换 TRIS 位。
在某些设备上,少数 I/O 引脚可能内置了弱上拉。如果您不想使用外部上拉电阻,您可以启用它,但根据我的经验,最好使用小型(4.7k?)外部上拉电阻,特别是如果两个芯片之间的距离很长(任何长于0.5 厘米?)。
要考虑的另一件事是,您可能只使用一个引脚与两个设备进行通信,因为只有具有正确地址的设备才会响应您的 PIC。唯一的问题是大多数 1-wire 设备都有硬编码地址,所以如果您尝试与两个相同的设备通信,那么是的,您需要使用上面的技巧在运行时切换引脚。