所以,这可能是一个微控制器的问题,但我的代码有问题,所以我想可能有人至少可以给我一个提示。我正在尝试将一个电位计连接到一个7段显示器上,它可以接收2V(最小(到3.3V(最大(。如何将ATD(电位计(值连接到开关箱?
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,我假设您只想将数字化锅值0
映射到10
。在这种情况下,需要将1..max_pot_value
映射到0..9
,尽管我们只将0...max_pot_value
映射到该范围上,并对0
进行特殊处理。
这样做的方法是取你的最大罐值,然后除以10——这就得到了每个桶的大小。然后你把你的收入除以这个桶的大小。假设您的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 );
}
就我个人而言,我会使用查找表而不是switch
语句:
void set_7segment( unsigned char number )
{
unsigned char segValue[11] = {
0b00111111,
0b00000110,
...
};
Pim.pth.byte = segValue[number];
}
但无论哪种方式都有效。
- 整数除法产生一个整数结果-
1/2 == 0
、3/2 == 1
等。