我的程序有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行,代码将变得很长,有没有任何方法可以使用shift运算符和/或运算符来简单地完成任务。
最佳答案
仔细看你的真相表,找出一些规则。
void Set(unsigned char Row){
Row --;
PC_ODR &= 0x8F;
PC_ODR |= (0x01 & Row) << 6;
PC_ODR |= (0x02 & Row) << 4;
PC_ODR |= (0x04 & Row) << 2;
}
如果您将值7和8提供给
Row
则仍然有效,但如果您提供的值为9或更大,则可能会出错。感谢0andriy对代码的小改进!