PIC24F - 在不影响其他引脚的情况下设置 LATEx 特定引脚
PIC24F - Set LATx specific pins without effecting the other pins
有没有办法设置特定的端口引脚而不影响同一端口的其他引脚?
例如:
我用了LATB[13:6]用于7段LCD,其余的LATB位用于其他目的。
现在我需要设置 LATB = 0x003F 以显示“0”,如果我这样做,其余位将被更改。
有人可以帮助我吗?
您必须拆分操作,因为您无法在 16 位寄存器中专门处理第 6 位到第 13 位。例如,假设 LATB 是一个 16 位寄存器,其中第 6 位到第 13 位(8 位的范围)映射到带周期的 7 段显示(制作 8 段),我们希望将这些引脚特别设置为 0x3f = 0b00111111,我们可以做:
LATB = (LATB & ~(0xff<<6)) | (0x3f<<6);
0xff
是我们想要影响哪些位的位掩码,代表 8 位,我们使用 <<6
将其移到位置 6-13。
但是,这不是原子的;我们正在读取,屏蔽我们想要调整的位,将它们设置为新值,然后写回整个寄存器,包括保留的其他位。因此,我们可能需要禁用此类线路周围的中断。
对于许多 MCU,有特定的代码路径支持修改单个位,或 clear/set 的专用逻辑。这些可能意味着如果您坚持更简单的操作,您可以执行调整而不会冒践踏另一项更改的风险,例如:
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 也确实有位域的概念,这意味着可以定义锁存寄存器的结构解释,它确实有您想要影响的位的名称,但这是一种相当脆弱的方法。无论如何,当依赖于特定的寄存器名称时,您正在编写特定于体系结构的代码。最好检查编译器和平台库的文档。
有没有办法设置特定的端口引脚而不影响同一端口的其他引脚?
例如:
我用了LATB[13:6]用于7段LCD,其余的LATB位用于其他目的。
现在我需要设置 LATB = 0x003F 以显示“0”,如果我这样做,其余位将被更改。
有人可以帮助我吗?
您必须拆分操作,因为您无法在 16 位寄存器中专门处理第 6 位到第 13 位。例如,假设 LATB 是一个 16 位寄存器,其中第 6 位到第 13 位(8 位的范围)映射到带周期的 7 段显示(制作 8 段),我们希望将这些引脚特别设置为 0x3f = 0b00111111,我们可以做:
LATB = (LATB & ~(0xff<<6)) | (0x3f<<6);
0xff
是我们想要影响哪些位的位掩码,代表 8 位,我们使用 <<6
将其移到位置 6-13。
但是,这不是原子的;我们正在读取,屏蔽我们想要调整的位,将它们设置为新值,然后写回整个寄存器,包括保留的其他位。因此,我们可能需要禁用此类线路周围的中断。
对于许多 MCU,有特定的代码路径支持修改单个位,或 clear/set 的专用逻辑。这些可能意味着如果您坚持更简单的操作,您可以执行调整而不会冒践踏另一项更改的风险,例如:
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 也确实有位域的概念,这意味着可以定义锁存寄存器的结构解释,它确实有您想要影响的位的名称,但这是一种相当脆弱的方法。无论如何,当依赖于特定的寄存器名称时,您正在编写特定于体系结构的代码。最好检查编译器和平台库的文档。