C 如何使用开关语句在7段显示器上显示数字?

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

所以,这可能是一个微控制器的问题,但我在代码方面有问题,所以我想可能有人至少可以给我一个提示。 我正在尝试将一个电位计连接到一个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,我假设您只想将数字化的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个值来说这并不太糟糕,但是对于更大的数组,每次调用函数时都必须创建它们,这可能会影响速度。