C++ 基于AD值创建和使用查找表

C++ 基于AD值创建和使用查找表,c++,microcontroller,C++,Microcontroller,我在创建和使用查找表时遇到了一些问题。 我的代码是针对一个微控制器的,该微控制器轮询一个11位AD转换器,并根据该值更新一个7段显示 我想编写代码的方法是创建一个包含2047个值的表,每个值都附加了一个二进制模式,表示哪些管脚和on和off,然后让表以int的形式返回该二进制值 但是,我不确定创建表或调用表的语法 到目前为止,我得到了: int table[2048][2]; j=0; for(i=0; i<2048; i++) { if(i%204==8) {

我在创建和使用查找表时遇到了一些问题。
我的代码是针对一个微控制器的,该微控制器轮询一个11位AD转换器,并根据该值更新一个7段显示

我想编写代码的方法是创建一个包含2047个值的表,每个值都附加了一个二进制模式,表示哪些管脚和on和off,然后让表以int的形式返回该二进制值

但是,我不确定创建表或调用表的语法

到目前为止,我得到了:

int table[2048][2];
j=0;
for(i=0; i<2048; i++)
{
    if(i%204==8)
    {
        j++;
    }

    if(j==0)
    {
        value=0x3F;
    }

    if(j==1)
    {
        value=0x06;
    }
    table[i][2]={i},{value}; 
}
因此,数字2设置了位1、2、4、5和7,因此用0x5B表示,这是大量重复的位,具有大量的运行时开销,我甚至想不出一种有效的方法来使用它。为什么不创建一个10位小数中的每一位的查找表,并使用一个函数一次汇总1位小数的结果呢

static const unsigned char segment7digits = {
    0x3F, //0 -> 00111111 
    0x3F, //1 -> 00000110 
    0x5B, //2 -> 01011011
    0x4F, //3 -> 01001111
    0x66, //4 -> 01100110
    0x6D, //5 -> 01101101
    0x7D, //6 -> 01111101
    0x07, //7 -> 00000111
    0x7F, //8 -> 01111111
    0x6F, //9 -> 01101111
    }; //these values are untested and probably have errors

int lookup_7segment_bits(int value) {
   assert(value>=0 && value<=9999);
   int result;
   result  = segment7digits[value/1%10]; //least significant decimal digit
   result |= segment7digits[value/10%10]<<7;
   result |= segment7digits[value/100%10]<<14;
   result |= segment7digits[value/1000%10]<<21; //most significant decimal digit
   return result;
};
静态常量无符号字符段7位={
0x3F,//0->00111111
0x3F,//1->00000110
0x5B,//2->01011011
0x4F,//3->01001111
0x66,//4->01100110
0x6D,//5->01101101
0x7D,//6->011111101
0x07,//7->00000111
0x7F,//8->01111111
0x6F,//9->01101111
}; //这些值未经测试,可能有错误
整数查找\u 7段\u位(整数值){

断言(value>=0&&value与其创建2048个条目,为什么不使用一个包含10个条目的表,4次?你真的有那么多内存要浪费吗?这些位模式至少是一致的/递增的吗?如果你需要的位模式实际上没有像循环那样递增,那么拥有一个循环就没有多大帮助了。例如,i=3/j=4=1100110b,而i=3/j=5是一些完全不同的0101001b,i=3/j=6又是一些完全不同的东西。对于变量
j
的意图,或者
值的哪些位与哪些灯对应?位1,2是一(哪个?)垂直边沿,位7是中间的线,而其余的“@ MOOIN鸭MSB在<代码>值<代码>为G,LSB为A,它们按字母顺序排列。<代码> J<代码>用于跟踪何时改变<代码>值< /代码>。我将如何使用10个主菜表4次?LCD位是正确的,但它是我使用的表。正在挣扎。您能解释一下这个部分吗?
result=segment7digits[value/1%10];//最低有效十进制数字结果|=segment7digits[value/10%10]@user3862194:是:
result=segment7digits[value/1%10]
将值
0x3F
分配给
result
。关键部分是以下几行:
result |={STUFF}或者每个数字应该是8位?我现在明白了混淆的根源。我的代码只控制一个显示,因此AD结果寄存器中的每204个数字将增加显示数字1。它不应该显示传递给它的整个模拟值。我正在寻找一种更有效地显示该数字的方法而不仅仅是if-else语句。谢谢,我已经找到了它。在数组的工作原理上是一片空白。@user3862194:还要注意,我的数组存储的是
无符号字符
,因此整个数组只需要10个字节,而不像你的帖子那样需要16112个字节:D
static const unsigned char segment7digits = {
    0x3F, //0 -> 00111111 
    0x3F, //1 -> 00000110 
    0x5B, //2 -> 01011011
    0x4F, //3 -> 01001111
    0x66, //4 -> 01100110
    0x6D, //5 -> 01101101
    0x7D, //6 -> 01111101
    0x07, //7 -> 00000111
    0x7F, //8 -> 01111111
    0x6F, //9 -> 01101111
    }; //these values are untested and probably have errors

int lookup_7segment_bits(int value) {
   assert(value>=0 && value<=9999);
   int result;
   result  = segment7digits[value/1%10]; //least significant decimal digit
   result |= segment7digits[value/10%10]<<7;
   result |= segment7digits[value/100%10]<<14;
   result |= segment7digits[value/1000%10]<<21; //most significant decimal digit
   return result;
};