7 segmento led enciende un punto decimal específico

0

Tengo un led de 12 pin 7 (ATA8041AB) que funciona bien usando mi código, es solo que cuando intento iluminar el led de punto decimal, se enciende todo dp o no se enciende.

aquí está mi código

int segA = 3; // top
int segB = 4; // right-top
int segC = 5; // right-bottom
int segD = 6; // bottom
int segE = 7; // left-bottom
int segF = 8; // left-top
int segG = 9; // middle
int dp = 10;

int digit1 = 14; // common cathode for digit1 (i.e. sambung A0)
int digit2 = 15; // common cathode for digit2 (i.e. sambung A1)
int digit3 = 16; // common cathode for digit3 (i.e. sambung A2)
int digit4 = 17; // common cathode for digit4 (i.e. sambung A3)


// Number to display
static int number = 0;
static int ms = 0;
String inData; 
int collectedNumber;

int   blinkRate=0;  

//==============================================================//
void setup()
{
    Serial.begin(9600);

    // All pins in digital mode
    pinMode(digit1, OUTPUT);
    pinMode(digit2, OUTPUT);
    pinMode(digit3, OUTPUT);
    pinMode(digit4, OUTPUT);

    pinMode(segA, OUTPUT);
    pinMode(segB, OUTPUT);
    pinMode(segC, OUTPUT);
    pinMode(segD, OUTPUT);
    pinMode(segE, OUTPUT);
    pinMode(segF, OUTPUT);
    pinMode(segG, OUTPUT);
    pinMode(dp, OUTPUT);

}

//==============================================================//
void loop() {

digitalWrite(dp, HIGH);

//as a test, aku letak nilai 9999 display dekat led 

number = 4268;

    digitalWrite(digit1, LOW);
        // light on segments for 'thousands'
        drawDigitFast( (number/1000) % 10 );
        // wait 2 ms
        delay(2);
        // turn off all segments
        drawDigitFast( -1 );
    // turn off cathode for digit1
    digitalWrite(digit1, HIGH);


    digitalWrite(digit2, LOW);
        drawDigitFast( (number/100) % 10 );
        delay(2);
        drawDigitFast( -1 );
    digitalWrite(digit2, HIGH);


    digitalWrite(digit3, LOW);
        drawDigitFast( (number/10) % 10 );
        delay(2);
        drawDigitFast( -1 );
    digitalWrite(digit3, HIGH);


    digitalWrite(digit4, LOW);
        drawDigitFast( number % 10 );
        delay(2);
        drawDigitFast( -1 );
    digitalWrite(digit4, HIGH);

}

//-----------------------------------------------------//
void drawDigitFast(int n)
{
    const byte aPins[8] = {
        segA, segB, segC, segD, segE, segF, segG
    };
    const byte aSegments[11][8] = {
        //  A     B     C     D     E     F     G
        { HIGH, HIGH, HIGH, HIGH, HIGH, HIGH,  LOW }, // 0
        {  LOW, HIGH, HIGH,  LOW,  LOW,  LOW,  LOW }, // 1
        { HIGH, HIGH,  LOW, HIGH, HIGH,  LOW, HIGH }, // 2
        { HIGH, HIGH, HIGH, HIGH,  LOW,  LOW, HIGH }, // 3
        {  LOW, HIGH, HIGH,  LOW,  LOW, HIGH, HIGH }, // 4
        { HIGH,  LOW, HIGH, HIGH,  LOW, HIGH, HIGH }, // 5
        { HIGH,  LOW, HIGH, HIGH, HIGH, HIGH, HIGH }, // 6
        { HIGH, HIGH, HIGH,  LOW,  LOW,  LOW, LOW  }, // 7
        { HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH }, // 8
        { HIGH, HIGH, HIGH, HIGH,  LOW, HIGH, HIGH }, // 9
        {  LOW,  LOW,  LOW,  LOW,  LOW,  LOW,  LOW }  // all off
    };

    if( n < 0 || n > 10 )
    {
        n = 10;
    }

    for( int i = 0; i < 7; i++ )
    {
        digitalWrite( aPins[i], aSegments[n][i] );
    }
}

lo que estoy tratando de escribir es 4.268, pero lo mejor que puedo hacer es 4.2.6.8. ¿Puede ayudarme por favor?

    
pregunta Izzuddin Cheras

2 respuestas

2

El hecho de habilitar uno a la vez se debe a que necesita escribir cada uno de ellos de forma secuencial porque los pines A-G son comunes a todas las 4 pantallas, como se indica en la hoja de datos. Adivina qué, el pin dp también! Así que en cada dígito, la operación:

digitalWrite(digitX, LOW);
   drawDigitFast( (number/10) % 10 );
   delay(2);
   drawDigitFast( -1 );
digitalWrite(digitX, HIGH);

debe incluir la operación dp: digitalWrite (dp, ALTO O BAJO);

Es probable que la mejor manera de agregar esta operación a su drawDigitFast, incluyendo un nuevo parámetro bool para su valor dp:

void drawDigitFast(int n, bool dpValue)
{
    //....
    digitalWrite(dp, dpValue)
    for( int i = 0; i < 7; i++ )
    {
        digitalWrite( aPins[i], aSegments[n][i] );
    }
}

Incluso puedes pensar en una función que calcula automáticamente la posición de dp con respecto a tu valor, pero soy un poco perezoso para pensar en la implementación.

    
respondido por el Kinxil
3

Está configurando el pin alto en cada paso a través del bucle.

void loop() {
    digitalWrite(dp, HIGH);

Eliminar esa línea.

Ahora debe agregar líneas a los otros dígitos para reducir ese pin en algún momento.

    
respondido por el Transistor

Lea otras preguntas en las etiquetas