【问题标题】:Arduino: Multiplexing 4 Digit 7 Segment DisplayArduino:多路复用 4 位 7 段显示器
【发布时间】:2018-12-20 19:31:55
【问题描述】:

我对 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;
         }
      }
   }
} 

【问题讨论】:

    标签: arduino multiplexing


    【解决方案1】:

    打印出一个完整的 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);
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多