Создание 7-сегментного светодиода, отображающего два числа (от 0 до 99) с помощью MSP430 Launchpad на Engergia - PullRequest
0 голосов
/ 09 июня 2019

Я использую Vishay, TDCG1050M для светодиодного дисплея, MSP430 Launchpad для микроконтроллера и Energia для скетча.У меня есть резисторы 110 Ом на каждый контакт, освещающий светодиод, и два NPN-транзистора (по одному на каждую цифру на дисплее).

Я думал, что код, который у меня будет, будет работать правильно, но дисплей по-прежнему не верен.Светодиодный дисплей должен показывать 00 - 99 с двумя кнопками, прикрепленными к цепи.Первая кнопка увеличивает значение на единицу, а вторая кнопка уменьшает на единицу.Светодиод отображает значения 0-9 правильно, но когда он 2 и 5, он отображает «22» и «55» соответственно.При попытке увеличить (используя кнопку) до «10» светодиод отображает только «0», а не 1 в десятке.Светодиод действительно отображает 20-29 правильно (кроме отображения 25, на которое это похоже на 55).Я также перемонтировал всю схему, и она все еще читает те же значения.

Я пытался заменить некоторые провода, транзисторы и светодиод.Я также попробовал новый макет.Я попробовал два разных компьютера, первый компьютер, а второй Mac.

#define D1 P2_2 //Display digit 1 control
#define D2 P2_0 //Display digit 2 control 
#define segA P2_6 //Display segment A control
#define segB P8_2 //Display segment B control
#define segC P3_1 //Display segment C control
#define segD P8_1 //Display segment D control
#define segE P2_3 //Display segment E control
#define segF P7_4 //Display segment F control
#define segG P3_7 //Display segment G control
#define digit_pause 2
#define button1 P2_4  
#define button2 P2_5
#define debounceDelay 10

volatile boolean button1_flag = 0;
volatile long lastDebounceTime = 0;
volatile boolean pressed_event_flag = 0;
volatile boolean released_event_flag = 0;

volatile boolean button2_flag = 0;
volatile boolean pressed_event_flag2 = 0;
volatile boolean released_event_flag2 = 0;

int counter = 0;
int number = 0;
int number2 = 0;
int digit = 0;

int digits[] = {D1, D2};
int segments[] {segA, segB, segC, segD, segE, segF, segG};
boolean digit0[] = {0, 0, 0, 0, 0, 0, 1};
boolean digit1[] = {1, 0, 0, 1, 1, 1, 1};
boolean digit2[] = {0, 0, 1, 0, 0, 1, 0};
boolean digit3[] = {0, 0, 0, 0, 1, 1, 0};
boolean digit4[] = {1, 0, 0, 1, 1, 0, 0};
boolean digit5[] = {0, 1, 0, 0, 1, 0, 0};
boolean digit6[] = {0, 1, 0, 0, 0, 0 ,0};
boolean digit7[] = {0, 0 ,0, 1, 1, 1, 1};
boolean digit8[] = {0, 0, 0, 0, 0, 0, 0};
boolean digit9[] = {0, 0, 0, 0, 1, 0, 0};

void setup()
{
    pinMode(button1, INPUT);
    attachInterrupt(button1, button1_event, CHANGE);
    pinMode(button2, INPUT);
    attachInterrupt(button2, button2_event, CHANGE);
    pinMode(D1, OUTPUT);
    pinMode(D2, OUTPUT);
    pinMode(segA, OUTPUT);
    pinMode(segB, OUTPUT);
    pinMode(segC, OUTPUT);
    pinMode(segD, OUTPUT);
    pinMode(segE, OUTPUT);
    pinMode(segF, OUTPUT);
    pinMode(segG, OUTPUT);

    for(int sweep = 0; sweep < 2; sweep++) {
        digitalWrite(digits[sweep],LOW);
    }
    Serial.begin(9600);
}

void loop()
{
    if(pressed_event_flag) {
        if (counter <= 99){
            counter++;
        }
    if(pressed_event_flag) {
        if (counter == 100)
            counter=99;
        }
        pressed_event_flag = 0;
    }
    if(released_event_flag) {
        released_event_flag = 0;
    }
    if(pressed_event_flag2) {
        if (counter >= 0){
            counter--;
        }
        pressed_event_flag2 = 0;
    }
    if(released_event_flag2) {
        released_event_flag2 = 0;
    }

    //the problem could be within this part of the code
    delay(2);
    number = counter;
    digit = number % 10;
    digitalWrite(digits[1], HIGH);
    digitalWrite(digits[0], LOW);
    displayDigit(digit);
    delay(5);
    number2 = (number - digit) / 10;
    digitalWrite(digits[0], HIGH);
    digitalWrite(digits[1], LOW);
    displayDigit(number2);
    number2 = (number - digit) / 10;
    delay(5);
}

void displayDigit(int numeral)
{
    switch (numeral) {
    case 0:
        for(int i = 0; i < 8; i++) {
            digitalWrite(segments[i],digit0[i]);
        }
        break;
    case 1:
        for(int i = 0; i < 8; i++) {
            digitalWrite(segments[i],digit1[i]);
        }
        break;
    case 2:
        for(int i = 0; i < 8; i++) {
            digitalWrite(segments[i],digit2[i]);
        }
        break;
    case 3:
        for(int i = 0; i < 8; i++) {
            digitalWrite(segments[i],digit3[i]);
        }
        break;
    case 4:
        for(int i = 0; i < 8; i++) {
            digitalWrite(segments[i],digit4[i]);
        }
        break;
    case 5:
        for(int i = 0; i < 8; i++) {
            digitalWrite(segments[i],digit5[i]);
        }
        break;
    case 6:
        for(int i = 0; i < 8; i++) {
            digitalWrite(segments[i],digit6[i]);
        }
        break;
    case 7:
        for(int i = 0; i < 8; i++) {
            digitalWrite(segments[i],digit7[i]);
        }
        break;
    case 8:
        for(int i = 0; i < 8; i++) {
            digitalWrite(segments[i],digit8[i]);
        }
        break;
    case 9:
        for(int i = 0; i < 8; i++) {
            digitalWrite(segments[i],digit9[i]);
        }
        break;
    default:
        break;
    }
}
void button1_event()
{
    boolean state = digitalRead(button1); //Determine if pressed or released.
    if(state) {
        if(!button1_flag) {
            if((millis() - lastDebounceTime) >debounceDelay) {
                button1_flag = 1;
                lastDebounceTime = millis();
                pressed_event_flag = 1;
            }
        }
    }
    else
    {
        if(button1_flag) {
            if((millis() - lastDebounceTime) >debounceDelay) {
                button1_flag = 0;
                lastDebounceTime = millis();
                released_event_flag = 1;
            }
        }
    }
}
void button2_event()
{
    boolean state = digitalRead(button2); //Determine if pressed or released.
    if(state) {
        if(!button2_flag) {
            if((millis() - lastDebounceTime) >debounceDelay) {
                button2_flag = 1;
                lastDebounceTime = millis();
                pressed_event_flag2 = 1;
            }
        }
    }
    else
    {
        if(button2_flag) {
            if((millis() - lastDebounceTime) >debounceDelay) {
                button2_flag = 0;
                lastDebounceTime = millis();
                released_event_flag2 = 1;
            }
        }
    }
}
...