Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
根据真值表进行C位运算_C_Bit - Fatal编程技术网

根据真值表进行C位运算

根据真值表进行C位运算,c,bit,C,Bit,我的程序有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

我的程序有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;
}
void集(无符号字符行){
行--;
PC_ODR&=0x8F;

PC_ODR |=(0x01&Row)从这里选择任何8位反转方法:并将其包装到
reverse()
,然后使用以下方法:

假设基于0的行索引(行1=0)执行

否则需要基于id 1的行索引(行1=1)

PC_ODR |= (0xf | (reverse(row - 1) >> 1))
所以你有:

             PC654 Decimal
Row1 :        000    0     
Row2 :        100    4
Row3 :        010    2  
Row4 :        110    6
Row5 :        001    1 
Row6 :        101    5
然后使用查找表:

void setRow(int row) {
  static int mask = 0x70; // binary mask for bits 456: 1110000
  static int rowData[7] = { 0/*dummy entry no row 0*/, 0, 4, 2, 6, 1, 5 };
  PC_ODR = (PC_ODR & ~mask) | rowData[row]<<4; // get original bits except 456 and combine with right value for 456
}
void setRow(int行){
静态整数掩码=0x70;//位456的二进制掩码:1110000
静态int-rowData[7]={0/*虚拟条目没有行0*/,0,4,2,6,1,5};

PC_ODR=(PC_ODR&~mask)|要设置的行数据[row]:
a |=(1)我已经这样做了。使用按行索引的查找表。如果只向寄存器写入一次,则需要向临时变量中读取一次,设置并清除变量中的位,然后在末尾向寄存器写入一次。但您弄错了。请注意,位0,1,2映射到6,5,4,而不是4,5,6@iBug:添加了nece基本准备…;-)@iBug:1st reverse
row
,然后使用我在结果上显示的内容。lut足够小,可以使用八进制表示法将其编码为24位:
05162400>>row&7
,可以预移位以与掩码8f对齐。您可以直接使用
row
中的位:
result=(row&0x2)
void setRow(int row) {
  static int mask = 0x70; // binary mask for bits 456: 1110000
  static int rowData[7] = { 0/*dummy entry no row 0*/, 0, 4, 2, 6, 1, 5 };
  PC_ODR = (PC_ODR & ~mask) | rowData[row]<<4; // get original bits except 456 and combine with right value for 456
}