Я использую 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;
}
}
}
}