C 如何使用开关语句在7段显示器上显示数字?
所以,这可能是一个微控制器的问题,但我在代码方面有问题,所以我想可能有人至少可以给我一个提示。 我正在尝试将一个电位计连接到一个7段显示器上,该显示器接收2V(最小)到3.3V(最大)。如何将ATD(电位计)值连接到开关箱C 如何使用开关语句在7段显示器上显示数字?,c,if-statement,switch-statement,microprocessors,C,If Statement,Switch Statement,Microprocessors,所以,这可能是一个微控制器的问题,但我在代码方面有问题,所以我想可能有人至少可以给我一个提示。 我正在尝试将一个电位计连接到一个7段显示器上,该显示器接收2V(最小)到3.3V(最大)。如何将ATD(电位计)值连接到开关箱 void light7segment(unsigned int cnt) //convert ATD value { } 上面的代码是一个函数,它将接受ATD值并使用light7segment中set_7segment()中的case语句 void
void light7segment(unsigned int cnt) //convert ATD value
{
}
上面的代码是一个函数,它将接受ATD值并使用light7segment中set_7segment()中的case语句
void main ()
{
unsigned int i;
//Insert Application Software Here
for (;;){
i= Atd0.atddr[8].d10; //get ATD value
light7segment(i); // display ATD value on 7-seg
}
for (;;);
}
void set_7segment(unsigned char number)
{
switch (number)
{
case 0 :
Pim.pth.byte=0b00111111; //display 0 in 7-seg
break;
case 1 :
Pim.pth.byte=0b00000110; //display 1 in 7-seg
break;
case 2 :
Pim.pth.byte=0b01011011; //display 2 in 7-seg
break;
case 3 :
Pim.pth.byte=0b01001111; //display 3 in 7-seg
break;
case 4 :
Pim.pth.byte=0b01100110; //display 4 in 7-seg
break;
case 5 :
Pim.pth.byte=0b01101101; //display 5 in 7-seg
break;
case 6 :
Pim.pth.byte=0b01111101; //display 6 in 7-seg
break;
case 7 :
Pim.pth.byte=0b00100111; //display 7 in 7-seg
break;
case 8 :
Pim.pth.byte=0b01111111; //display 8 in 7-seg
break;
case 9 :
Pim.pth.byte=0b01101111; //display 9 in 7-seg
break;
case 10 :
Pim.pth.byte=0b00000000; //turn off 7-seg
break;
default:
break;
}
return;
}
您的问题并不十分清楚-似乎更像是“如何将当前pot值映射到范围
0..10
?”
由于10
对应于OFF,我假设您只想将数字化的pot值0
映射到10
。在这种情况下,需要将1..max\u pot\u value
映射到0..9
,尽管我们只需将0…max\u pot\u value
映射到该范围,并对0
有一个特殊情况
这样做的方法是取你的最大罐值,然后除以10——这就得到了每个桶的大小。然后,将输入的pot值除以桶大小。假设ATD值为0..2047
,则桶大小为204
1,因此从0
到203
的所有内容都映射到0
,204
到407
映射到1
,等等
#define MAX_POT_VALUE 2047 // replace with the actual max value
void light_7segment( unsigned int cnt )
{
unsigned int stepSize = MAX_POT_VALUE / 10;
unsigned int map = cnt ? cnt/stepSize : 10; // if cnt != 0, then map = cnt/stepSize, otherwise map = 10
set_7segment( (unsigned char) map );
}
就个人而言,我会使用查找表而不是开关
语句:
void set_7segment( unsigned char number )
{
unsigned char segValue[11] = {
0b00111111,
0b00000110,
...
};
Pim.pth.byte = segValue[number];
}
但无论哪种方法都有效
1/2==0
,3/2==1
,等等。
你确定不想为你想做的事情创建一个查找表吗?@mediocrevegetable1很抱歉,我从来没有听说过查找表。你能解释一下它是什么吗?如果你用谷歌搜索一个查找表,你应该能找到很多来源。但基本上它是一个数组,在正确的索引处有正确的值。例如,您可以创建一个
静态常量char display[]={0B0011111,0b00000110,…}
,然后只需执行Pim.pth.byte=display[number]
这在注释中有点难以解释,请正确查找它。y=mx+c不带m和c:(我更喜欢使用静态数组作为查找表。可能对于11个值来说这并不太糟糕,但是对于更大的数组,每次调用函数时都必须创建它们,这可能会影响速度。