Это дает некоторые сбои на 7-сегментном дисплее
Он показывает правильное значение на мониторе, но не отображает значение на моем дисплее.
int pinNumb[7] = {2, 3, 4, 5, 6, 7, 8};
int num_array[11][7] = {
{ 1, 1, 1, 1, 1, 0, 1 }, // 0
{ 0, 1, 1, 0, 0, 0, 0 }, // 1
{ 1, 1, 0, 1, 1, 1, 0 }, // 2
{ 1, 1, 1, 1, 0, 1, 0 }, // 3
{ 0, 1, 1, 0, 0, 1, 1 }, // 4
{ 1, 0, 1, 1, 0, 1, 1 }, // 5
{ 1, 0, 1, 1, 1, 1, 1 }, // 6
{ 1, 1, 1, 0, 0, 0, 0 }, // 7
{ 1, 1, 1, 1, 1, 1, 1 }, // 8
{ 1, 1, 1, 0, 0, 1, 1 }, // 9
{ 0, 0, 0, 0, 0, 0, 0 } // ничего
};
int pin = 2;
int button = 12;
int buttonVal;
int randVal;
bool pressVal;
void setup() {
Serial.begin(9600);
for (int i = 0; i < 7 ; i++)
{
pinMode(pinNumb[i], OUTPUT);
}
pressVal = false;
pinMode(button, INPUT);
}
void loop() {
buttonVal = digitalRead(button);
if (buttonVal == 0)
{
//нуль();
turnOff();
pressVal = false;
}
else
{
//нуль();
if (pressVal == false)
{
randVal = rand() % 10;
pressVal = true;
delay(100);
}
Serial.println(randVal);
if (randVal == 0)
{
zero();
}
else if (randVal == 1)
{
one();
}
else if (randVal == 2)
{
two();
}
else if (randVal == 3)
{
three();
}
else if (randVal == 4)
{
four();
}
else if (randVal == 5)
{
five();
}
else if (randVal == 6)
{
six();
}
else if (randVal == 7)
{
seven();
}
else if (randVal == 8)
{
eight();
}
else
{
nine();
}
}
}
void zero()
{
for(int i = 0; i < 7 ; i++)
{
digitalWrite(pinNumb[i],LOW);
}
for (int j = 0; j < 7; j++) {
digitalWrite(pin, num_array[0][j]);
pin++;
}
}
void one()
{
for(int i = 0; i < 7 ; i++)
{
digitalWrite(pinNumb[i],LOW);
}
for (int j = 0; j < 7; j++) {
digitalWrite(pin, num_array[1][j]);
pin++;
}
}
void two()
{
for(int i = 0; i < 7 ; i++)
{
digitalWrite(pinNumb[i],LOW);
}
for (int j = 0; j < 7; j++) {
digitalWrite(pin, num_array[2][j]);
pin++;
}
}
void three()
{
for(int i = 0; i < 7 ; i++)
{
digitalWrite(pinNumb[i],LOW);
}
for (int j = 0; j < 7; j++) {
digitalWrite(pin, num_array[3][j]);
pin++;
}
}
void four()
{
for(int i = 0; i < 7 ; i++)
{
digitalWrite(pinNumb[i],LOW);
}
for (int j = 0; j < 7; j++) {
digitalWrite(pin, num_array[4][j]);
pin++;
}
}
void five()
{
for(int i = 0; i < 7 ; i++)
{
digitalWrite(pinNumb[i],LOW);
}
for (int j = 0; j < 7; j++) {
digitalWrite(pin, num_array[5][j]);
pin++;
}
}
void six()
{
for(int i = 0; i < 7 ; i++)
{
digitalWrite(pinNumb[i],LOW);
}
for (int j = 0; j < 7; j++) {
digitalWrite(pin, num_array[6][j]);
pin++;
}
}
void seven()
{
for(int i = 0; i < 7 ; i++)
{
digitalWrite(pinNumb[i],LOW);
}
for (int j = 0; j < 7; j++) {
digitalWrite(pin, num_array[7][j]);
pin++;
}
}
void eight()
{
for(int i = 0; i < 7 ; i++)
{
digitalWrite(pinNumb[i],LOW);
}
for (int j = 0; j < 7; j++) {
digitalWrite(pin, num_array[8][j]);
pin++;
}
}
void nine()
{
for(int i = 0; i < 7 ; i++)
{
digitalWrite(pinNumb[i],LOW);
}
for (int j = 0; j < 7; j++) {
digitalWrite(pin, num_array[9][j]);
pin++;
}
}
void turnOff()
{
for(int i = 0; i < 7 ; i++)
{
digitalWrite(pinNumb[i],LOW);
}
}
@Bavo, 👍0
Обсуждение2 ответа
Лучший ответ:
Вы постоянно увеличиваете значение переменной pin с помощью pin++, но никогда не сбрасываете ее на начало (2?), когда нужно записать новое число. Так что это может сработать в первый раз, но никогда после этого.
Кроме того, вы очищаете дисплей с помощью digitalWrite(pinNumb[i],LOW); Но вы включаете сегменты с помощью digitalWRite(pin,....); пин++. Разве вы не должны включать сегменты с помощью digitalWrite(pinNumb[i] . . ?
да, это было бы проще, но для упражнения мне нужно использовать массив, так что это невозможно., @Bavo
я хочу сказать, что вы НЕ используете массив при включении сегментов., @tavis
Все они могут быть byte вместо int для экономии памяти:
int pinNumb[7] = {2, 3, 4, 5, 6, 7, 8};
int num_array[11][7] = {
{ 1, 1, 1, 1, 1, 0, 1 }, // 0
{ 0, 1, 1, 0, 0, 0, 0 }, // 1
{ 1, 1, 0, 1, 1, 1, 0 }, // 2
{ 1, 1, 1, 1, 0, 1, 0 }, // 3
{ 0, 1, 1, 0, 0, 1, 1 }, // 4
{ 1, 0, 1, 1, 0, 1, 1 }, // 5
{ 1, 0, 1, 1, 1, 1, 1 }, // 6
{ 1, 1, 1, 0, 0, 0, 0 }, // 7
{ 1, 1, 1, 1, 1, 1, 1 }, // 8
{ 1, 1, 1, 0, 0, 1, 1 }, // 9
{ 0, 0, 0, 0, 0, 0, 0 } // ничего
};
int pin = 2;
int button = 12;
int buttonVal;
int randVal;
Кроме того, массив можно уменьшить до 11 байт:
0bFD, // 0
0bC0, // 1
0bDE, // 2
etc.
Затем ваши функции могут выполнять прямые манипуляции с портом для отправки битов 0–5 в порт для D2–D7 и битов в D8.
Как написано, этим функциям, вероятно, требуется некоторое время удержания, чтобы они не просто мигали светодиодом и исчезали:
void one()
{
for(int i = 0; i < 7 ; i++)
{
digitalWrite(pinNumb[i],LOW);
}
for (int j = 0; j < 7; j++) {
digitalWrite(pin, num_array[1][j]);
pin++;
}
}
какую команду я должен использовать, чтобы удерживать их задержку, на самом деле ничего не делая., @Bavo
Более длительная задержка ()? Вроде 250 (четверть секунды)? Экспериментируйте, смотрите, что вам подходит., @CrossRoads
Теперь только первый сгенерированный номер отображается правильно, все остальные после него просто сломанные сегменты., @Bavo
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
7-сегментный дисплей, сгенерированное случайное значение, контакты 2-9 подключены от arduino uno к 7-сегментному дисплею. 7-сегментный дисплей не показывает сгенерированное число, а только несколько случайных цифр., @Bavo
ваш код слишком повторяющийся... вы можете удалить 95% кода и при этом сохранить желаемую функциональность... у вас также есть бесполезный код... например, внутри функции
void zero()
, в чем смысл наличия первого цикла for? ... то же самое для всех остальных функций, @jsotolaЯ полный нуб в этом, поэтому я просто использовал то, что узнал, если бы вы могли дать немного более конкретное объяснение того, что вы имеете в виду, это было бы полезно., @Bavo
внимательно посмотрите на функцию
void zero()
... что делает код? ... помните, что вся функция выполняется за несколько миллисекунд .... вам действительно нужен первый цикл for?, @jsotolaТак что я просто удаляю его, потому что эта функция сделала так, что на дисплее не было других цифр., @Bavo
у тебя только одна цифра... у тебя 7 сегментов, @jsotola
ах, я имею в виду сегменты;, @Bavo