【发布时间】:2017-07-29 20:54:37
【问题描述】:
我的程序有8位寄存器,即PC0,PC1,PC2,PC3,PC4,PC5,PC6,PC7.
我不在乎PC0,PC1,PC2,PC3.
我想根据提到的真值表设置位:
PC4 PC5 PC6 (Ports)
Row1 : 0 0 0
Row2 : 0 0 1
Row3 : 0 1 0
Row4 : 0 1 1
Row5 : 1 0 0
Row6 : 1 0 1
在设置位时不应更改 PC7 状态,并且应保持不变。我可以单独设置这些位,但需要立即设置它们。 这是我所做的:
void Set(unsigned char Row)
{
if(Row == 1)
{
PC_ODR &= ~(0x40) //To Set 0 to PC6
PC_ODR &= ~(0x20) //To Set 0 to PC5
PC_ODR &= ~(0x10) //To Set 0 to PC4
}
if(Row == 2)
{
PC_ODR |= 0x40 //To Set 1 the PC6
PC_ODR &= ~(0x20) //To Set 0 to PC5
PC_ODR &= ~(0x10) //To Set 0 to PC4
}
// ......So on for Row 3, 4,5,6
}
对于所有 6 行,代码会变得很长,有什么办法可以使用移位运算符和 AND / OR 运算符来简明扼要地完成工作。
【问题讨论】:
-
设置:
a |= (1 << bitpos),取消设置:a &= ~(1 << bitpos) -
我已经这样做了。
-
使用按行索引的查找表。
-
如果你应该只写入一次寄存器,那么你需要从它读取一次到一个临时变量中,设置和清除变量中的位,然后在最后写入一次寄存器。