创建和使用查找表时遇到一些麻烦 我的代码是用于轮询11位AD转换器的微控制器,并根据该值更新7段显示。
我想编写代码的方法是创建一个包含2047个值的表,每个值都附加一个二进制模式,表示哪些引脚打开和关闭,然后让表将该二进制值返回为int。 / p>
但是我不确定创建表或调用它的语法。
到目前为止我得到了:
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};
}
if语句一直下降到j == 9,该值是我有兴趣返回的二进制模式。
这是解决问题的明智方法吗?如果返回的AD值是例如300,我将如何在表中查找它以获得0x06作为我想要的数字?
每个第二段的位是
111
6 2
6 2
777
5 3
5 3
444
因此数字2的位设置为1,2,4,5和7,因此用0x5B表示
答案 0 :(得分:1)
这是重复位的很多,有很多运行时开销,我甚至无法想到使用它的有效方法。为什么不是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;
};