PIC24F - 设置LATx特定引脚而不影响其他引脚

时间:2017-08-07 13:04:15

标签: microcontroller pic24

有没有办法在不影响同一端口的其他引脚的情况下设置特定的端口引脚?

例如:

我使用 LATB [13:6] 进行7段LCD,其余的LATB位用于其他用途。

现在我需要将 LATB = 0x003F 设置为显示'0',如果我这样做,其余的位将被更改。

有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:2)

您必须分割操作,因为您无法在16位寄存器中专门寻址位6到13。例如,假设LATB是16位寄存器,其中位6到13(8位的范围)映射到具有周期的7段显示(产生8个段),并且我们想要将这些引脚特别设置为0x3f = 0b00111111,我们可以做到:

LATB = (LATB & ~(0xff<<6)) | (0x3f<<6);

0xff是我们想要影响哪些位的位掩码,代表8位,我们使用<<6转换到位置6-13。

然而,这不是原子的;我们正在读取,屏蔽我们想要调整的位,将它们设置为新值,并写回整个寄存器,包括保留的其他位。因此,我们可能需要例如禁用这种线路周围的中断。

对于许多MCU,存在支持修改单个位的特定代码路径,或用于清除/设置的专用逻辑。那些可能意味着你可以执行调整而不会冒着践踏另一个变化的风险,如果你坚持平坦的操作,例如:

val = 0x3f;
LATB |= (val<<6);  // set bits which should be set
LATB &= (val<<6) | ~(0xff<<6);  // clear bits that should be clear

在这个例子中,我们没有在一个步骤中进行显示更新,但是我们正在进行的每个更新都保留在编译器可以优化为单个指令的形式中(分别是IOR和AND) 。

某些处理器还具有访问像这样的单词部分的指令,通常称为位域操作。我不认为PIC24就是其中之一。它确实具有单比特访问指令,但它们似乎要么在工作文件上运行,要么需要固定的比特位置,这意味着必须逐行进行设置。

C也有一个位域概念,这意味着可以定义一个锁存寄存器的结构解释,它对你想要影响的位有一个名称,但它是一个相当脆弱的方法。在依赖特定的寄存器名称时,您仍然在编写特定于体系结构的代码。最好检查编译器和平台库的文档。