我的程序有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对代码的小改进!

10-08 13:49
查看更多