Запись чисел в массив
- Войдите на сайт для отправки комментариев
Сб, 01/12/2012 - 14:40
Здравствуйте!
В программе нужно записывать значения принимемые с кнопочной клавиатуры в массив, для передачи на LCD и после обработки - на другое устройство. Не представляю как это сделать.
Просьба сильно не пинать - в программировании не силён, больше занимаюсь железом.
#include <Wire.h> //подключаем библиотеки
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x20,16,2);// параметры дисплея
long freqAj;
int i;//Счётчик циклов
//int j;//Счетчик циклов 2
int freqA[6]; //массив цифр для частоты А
int n=0;
word dataInput;
#define DATA 9
#define LATCH 8
#define CLOCK 7
#define CLKUS 1
void setup() {
pinMode(DATA,INPUT);
pinMode(LATCH,OUTPUT);
pinMode(CLOCK,OUTPUT);
freqA[0] = 1; //начальное значение частоты
freqA[1] = 4; // в этот массив нужно записать значения с клавиатуры
freqA[2] = 1;
freqA[3] = 2;
freqA[4] = 0;
freqA[5] = 0;
freqA[6] = 0;
lcd.init();
}
void loop() {
dataInput = 0; // функция ввода с клавиатуры
digitalWrite(LATCH,HIGH); // Parallel mode
for (int i=15; i>=0; i--) {
digitalWrite(CLOCK,HIGH);
delayMicroseconds(CLKUS);
dataInput |= (digitalRead(DATA) ? (1<<i) : 0);
digitalWrite(CLOCK,LOW);
delayMicroseconds(CLKUS);
if (i==15) digitalWrite(LATCH,LOW); // Serial Mode
} //Конец функции ввода с клавиатуры
//delay(300);
if (dataInput==0b1111111111111101)
{
n=1;
}
else if (dataInput==0b1111111111111011)
{
n=2;
}
else if (dataInput==0b1111111111110111)
{
n=3;
}
else if (dataInput==0b1111111111101111)
{
n=4;
}
else if (dataInput==0b1111111111011111)
{
n=5;
}
else if (dataInput==0b1111111110111111)
{
n=6;
}
else if (dataInput==0b1111111101111111)
{
n=7;
}
else if (dataInput==0b1111111011111111)
{
n=8;
}
else if (dataInput==0b1111110111111111)
{
n=9;
}
else if (dataInput==0b1111111111111110)
{
n=0;
}
for(int j=0; j<7; j=j+1) // Начало функции вывода массива на LCD
{
lcd.backlight();
lcd.setCursor(j,0);
lcd.print(freqA[j]);
} // Конец функции вывода массива на LCD
}
если я прявильно понял из вашего сообщения и комменатариев в коде чеговы хотите- что бы значиение переменной n было записано в первую ячейку массива?
тогда вам просто нужно добавить в строчке 87 вашего кода :
Это понятно, с записью одного числа проблем нет. Нужно, что бы при нажатии второй кнопки, третьей и т.д. Числа записывались соответственно во 2-ю, 3-ю и т.д. до седьмой ячейки.
Состояние клавиатуры проверяется постоянно и если ни одна кнопка не нажата то на вывод 9 ардуины приходит 16 единиц.
Добавляете переменную, для хранения позиции для записи цифры.
Например, после строки 9:
В строке 45:
В строке 87:
if(n>=0) { freqA[pos] = n; pos++; if(pos>5) pos = 1; }Спасибо большое, по Вашему примеру всё получается.
Появилась проблема - при выводе на LCD на последней позиции почему-то постоянно стоит -1
У Вас цикл до 6, а массив можно индексировать только до 5. Т.е.для массива индексы от 0 до 5, поскольку его размер 6. Либо увеличивайте размер массива, либо при выводе ограничьте цикл размером массива, т.е.6
Вот какой вид имеет код сейчас:
#include <Wire.h> //подключаем библиотеки #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x20,16,2);// параметры дисплея int freqAj; int i;//Счётчик циклов //int j;//Счетчик циклов 2 int freqA[6]; //массив цифр для частоты А int n; word dataInput; int pos=0; #define DATA 9 #define LATCH 8 #define CLOCK 7 #define CLKUS 1 void setup() { //начальное значение частоты lcd.init(); pinMode(DATA,INPUT); pinMode(LATCH,OUTPUT); pinMode(CLOCK,OUTPUT); freqA[0] = 1; freqA[1] = 4; freqA[2] = 1; freqA[3] = 2; freqA[4] = 0; freqA[5] = 0; freqA[6] = 0; } void loop() { dataInput = 0; // функция ввода с клавиатуры digitalWrite(LATCH,HIGH); // Parallel mode for (int i=15; i>=0; i--) { digitalWrite(CLOCK,HIGH); delayMicroseconds(CLKUS); dataInput |= (digitalRead(DATA) ? (1<<i) : 0); digitalWrite(CLOCK,LOW); delayMicroseconds(CLKUS); if (i==15) digitalWrite(LATCH,LOW); // Serial Mode } //Конец функции ввода с клавиатуры n=-1; //delay(300); if (dataInput==0b1111111111111101) { n=1; } else if (dataInput==0b1111111111111011) { n=2; } else if (dataInput==0b1111111111110111) { n=3; } else if (dataInput==0b1111111111101111) { n=4; } else if (dataInput==0b1111111111011111) { n=5; } else if (dataInput==0b1111111110111111) { n=6; } else if (dataInput==0b1111111101111111) { n=7; } else if (dataInput==0b1111111011111111) { n=8; } else if (dataInput==0b1111110111111111) { n=9; } else if (dataInput==0b1111111111111110) { n=0; } if(n>=0) { freqA[pos] = n; pos++; if(pos>6) pos = 0; delay(250); } for(int j=0; j<7; j=j+1) // Начало функции вывода массива на LCD { lcd.backlight(); lcd.setCursor(j,0); lcd.print(freqA[j]); } // Конец функции вывода массива на LCD }Изменение размера массива и цикла ничего не изменяет - на конце числа на LCD по прежнему -1.
В строке 7 исправьте размер массива с 6 на 7, Вы записываете за пределы массива операцией freqA[6]=0;