Arduino:多路传输4位7段显示器

时间:2018-07-12 14:09:59

标签: arduino multiplexing

我对Arduino比较陌生,所以不要介意小错误! 我编写了以下代码,将4位7段显示器与我的Arduino Uno复用。现在,我犯了一个错误,因此在调用showDigit()函数时,虽然显示了正确的数字,但没有显示在参数中提到的数字上。命名的数字(此处为0 =第一个数字)关闭,其余的数字表示该数字。谁能解决在第一个数字上调用showDigit(1,0)时使用数字1的问题?

const int numeral[10] = {
   //ABCDEFG /dp
   B11111100, // 0
   B01100000, // 1
   B11011010, // 2
   B11110010, // 3
   B01100110, // 4
   B10110110, // 5
   B00111110, // 6
   B11100000, // 7
   B11111110, // 8
   B11100110, // 9
};
// pins for decimal point and each segment
// DP,G,F,E,D,C,B,A
const int segmentPins[] = { 2,7,4,5,6,3,8,13 };
const int nbrDigits= 4; // the number of digits in the LED display
//dig 0 1 2 3
const int digitPins[nbrDigits] = { 9, 10, 11, 12};
void setup()
{
   for(int i=0; i < 8; i++) {
      pinMode(segmentPins[i], OUTPUT); // set segment and DP pins to output
   }
   for(int i=0; i < nbrDigits; i++) {
      pinMode(digitPins[i], OUTPUT);
   }
} 

void loop()
{
 showDigit(1,0);
}

void showDigit( int number, int digit)
{  
   digitalWrite( digitPins[digit], HIGH );
   for(int segment = 1; segment < 8; segment++)  {
      boolean isBitSet = bitRead(numeral[number], segment);
      // isBitSet will be true if given bit is 1
      // isBitSet = ! isBitSet; // Code Option*
      // uncomment the above Code Option line for common anode display
      digitalWrite( segmentPins[segment], isBitSet);
   }
   delay(5);
   digitalWrite( digitPins[digit], LOW );
}


void showNumber( int number)
{
   if(number == 0) {
      showDigit( 0, nbrDigits-1) ; // display 0 in the rightmost digit
   } else {
      // display the value corresponding to each digit
      // leftmost digit is 0, rightmost is one less than the number of places
      for( int digit = nbrDigits-1; digit >= 0; digit--)  {
         if(number > 0)  {
            showDigit( number % 10, digit) ;
            number = number / 10;
         }
      }
   }
} 

1 个答案:

答案 0 :(得分:0)

一个能打印出全部4位数字而不是全部数字的函数呢?我为我拥有的项目进行了此操作,我使用二进制值10来做一个空数字,然后在第三个数字上加了一个点。但是您可以看到我对4个数字进行多路复用的方法。

void writeNumber(int number)  
{
int frameRate = 5;
byte pattern;
int cientos = 10;
int decimos =  10;
int singular = 0;
int decimal = 0; 

if (number < 10000) { 

if (number > 999) {
  cientos = abs(number / 1000);
  number = number - (cientos * 1000);
}

if (number > 99)  {
  decimos = abs(number / 100);
  number = number - (decimos * 100);
} else {
  if (cientos != 10) { decimos = 0; }
}


if (number > 9) {
  singular = abs(number / 10);
  number = number - (singular * 10);
} 

if (number > 0) {
  decimal = abs(number);
} 
}


   digitalWrite(digit[0], HIGH);
   digitalWrite(digit[1], HIGH);
   digitalWrite(digit[2], HIGH);
   digitalWrite(digit[3], HIGH);
   pattern = digit_pattern[cientos];
    digitalWrite(digit_clock_pin, LOW);
   shiftOut(data_pin, bit_clock_pin, LSBFIRST, ~pattern);
   digitalWrite(digit_clock_pin, HIGH);
   digitalWrite(digit[3], LOW);
     delay(frameRate);  

   digitalWrite(digit[0], HIGH);
   digitalWrite(digit[1], HIGH);
   digitalWrite(digit[2], HIGH);
   digitalWrite(digit[3], HIGH);


      pattern = digit_pattern[decimos];
       digitalWrite(digit_clock_pin, LOW);
       shiftOut(data_pin, bit_clock_pin, LSBFIRST, ~pattern);
       digitalWrite(digit_clock_pin, HIGH);




     digitalWrite(digit[2], LOW);
         delay(frameRate);

      digitalWrite(digit[0], HIGH);
      digitalWrite(digit[1], HIGH);
      digitalWrite(digit[2], HIGH);
      digitalWrite(digit[3], HIGH);
      pattern = digit_pattern[singular];
      pattern = pattern - B10000000;

      digitalWrite(digit_clock_pin, LOW);
      shiftOut(data_pin, bit_clock_pin, LSBFIRST, ~pattern);
      digitalWrite(digit_clock_pin, HIGH);
      digitalWrite(digit[1], LOW);
    delay(frameRate);

  digitalWrite(digit[0], HIGH);
  digitalWrite(digit[1], HIGH);
  digitalWrite(digit[2], HIGH);
  digitalWrite(digit[3], HIGH);
  pattern = digit_pattern[decimal];
  digitalWrite(digit_clock_pin, LOW);
  shiftOut(data_pin, bit_clock_pin, LSBFIRST, ~pattern);
  digitalWrite(digit_clock_pin, HIGH);
  digitalWrite(digit[0], LOW);
  delay(frameRate);

}