根据真值表进行C位运算
我的程序有8位寄存器,即根据真值表进行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
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 reverserow
,然后使用我在结果上显示的内容。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
}