Помогите с написанием кода на Си для микроконтроллера
Есть 10 кнопок, 1 кнопка =='0' ,2 кнопка=='1',3 кнопка=='2' и так далее. Мне нужно сделать так, чтобы при нажатии на 11 кнопки(подтверждение ввода предыдущей кнопки) она записала значение в переменную Pl1,после того как я записал переменную Pl1 нужно чтоб след. кнопку записало уже в другую переменную например Pl2. Но как сделать условие чтобы он записывал данные в переменные поочередно? У меня есть только одна идея это задать переменной значение например '888' например else (Pl1=='
888') Pl1=key;Итак делать каждую переменную. Но так как всего переменных должно быть 6 ( Pl1, Pl2, Pl3, Pl4, Pl5, Pl6 ) будет говнокод, Я в программировании не силен,поэтому подскажите пожалуйста как это можно реализовать, желательно подробно.
Для того, чтобы записывать данные в переменные поочередно на Си, вы можете использовать массив и индекс. Массив - это набор переменных одного типа, которые хранятся подряд в памяти и имеют общее имя. Индекс - это номер элемента массива, который указывает на его положение в памяти.
Например, вы можете объявить массив из 6 целых чисел так:
int Pl[6];
Это означает, что у вас есть 6 переменных Pl[0], Pl1, Pl2, Pl3, Pl4 и Pl5, которые занимают по 4 байта каждая (размер целого числа на Си). Вы можете обращаться к ним по индексу от 0 до 5.
Для того, чтобы записывать данные в массив поочередно, вы можете использовать еще одну переменную для хранения текущего индекса. Например:
int index = 0;
Когда вы считываете значение с кнопки и нажимаете кнопку подтверждения ввода, вы можете записать его в массив по текущему индексу и увеличить индекс на 1:
Pl[index] = key;
index++;
Таким образом, вы будете заполнять массив по порядку от Pl[0] до Pl5. Когда индекс достигнет 6, это означает, что массив заполнен и вы можете перестать записывать данные или начать заново с нулевого индекса.
Вот пример кода на Си для микроконтроллера:
#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 8000000UL
#define BUTTONS_PORT PORTD
#define BUTTONS_DDR DDRD
#define BUTTONS_PIN PIND
#define LEDS_PORT PORTB
#define LEDS_DDR DDRB
int main(void)
{
int key = -1;
int index = 0;
int Pl[6];
BUTTONS_DDR = 0x00;
BUTTONS_PORT = 0xFF;
LEDS_DDR = 0xFF;
LEDS_PORT = 0x00;
while (1)
{
if ((BUTTONS_PIN & (1<<PD7)) == 0) {
_delay_ms(50);
if (key != -1) {
if (index < 6) {
Pl[index] = key;
index++;
LEDS_PORT |= (1<<PB7);
_delay_ms(500);
LEDS_PORT &= ~(1<<PB7);
key = -1; }
}
}
if ((BUTTONS_PIN & (1<<PD0)) == 0) {
key = 0;
}
if ((BUTTONS_PIN & (1<<PD1)) == 0) {
key = 1;
}
if ((BUTTONS_PIN & (1<<PD2)) == 0) { /
key = 2;
}
if ((BUTTONS_PIN & (1<<PD3)) == 0) {
key = 3;
}
if ((BUTTONS_PIN & (1<<PD4)) == 0) {
key = 4;
}
if ((BUTTONS_PIN & (1<<PD5)) == 0) {
key = 5;
}
if ((BUTTONS_PIN & (1<<PD6)) == 0) {
key = 6;
}
if ((BUTTONS_PIN & (1<<PD7)) == 0) {
key = 7;
}
if ((BUTTONS_PIN & (1<<PD8)) == 0) {
key = 8;
}
if ((BUTTONS_PIN & (1<<PD9)) == 0) {
key = 9;
}
}
Можно использовать массив для хранения переменных Pl1-Pl6. В начале программы объявите массив такого вида:
int Pl[6] = {0};
Этот массив будет хранить все переменные Pl1-Pl6, инициализированные нулями.
При нажатии на кнопку сначала определите ее номер от 0 до 9, и сохраните его в переменную buttonNumber.
int buttonNumber = // определение номера нажатой кнопки от 0 до 9
Затем, если нажата кнопка "подтвердить" (то есть номер кнопки равен 10), тогда сохраните значение переменной Pl1 и переключитесь на запись в переменную Pl2, иначе сохраните значение в текущую переменную.
if(buttonNumber == 10) {
Pl[0] = currentValue; // сохраняем значение текущей переменной в Pl1
currentValue = 0; // обнуляем текущую переменную
currentVariable++; // переключаемся на следующую переменную
} else {
currentValue = currentValue * 10 + buttonNumber; // добавляем цифру к текущему значению переменной
}
Заметьте, что мы используем переменную currentVariable для определения текущей переменной, которую мы заполняем. Ее начальное значение равно 0, так как мы начинаем с переменной Pl1.
Полный код может выглядеть примерно так:
int Pl[6] = {0}; // массив для хранения переменных Pl1-Pl6
int currentVariable = 0; // текущая переменная, которую мы заполняем
int currentValue = 0; // текущее значение переменной
// код для обработки нажатий кнопок
void handleButtonPress(int buttonNumber) {
if(buttonNumber == 10) {
Pl[currentVariable] = currentValue; // сохраняем значение текущей переменной в массив
currentValue = 0; // обнуляем текущую переменную
currentVariable++; // переключаемся на следующую переменную
} else {
currentValue = currentValue * 10 + buttonNumber; // добавляем цифру к текущему значению переменной
}
}
Таким образом, при нажатии на кнопку "подтвердить" в массиве Pl будет сохранено значение текущей переменной (Pl1 в первый раз, Pl2 во второй раз и т.д.), а затем мы переключимся на следующую переменную и будем записывать в нее значения следующих кнопок.
Если я правильно понял ваш вопрос то все вообще элементарно. Ваши 10 переменных - это массив. Учитывая, что кнопок всего 10, это может быть массив байт, чтобы сэкономить память. Затем вам нужен индекс в этом массиве, причем это должна быть переменная со временем жизни больше, чем ваша функция (можно сделать ее глобальной) или хранить в вышележащей функции.
// Размер буфера
#define BUF_SIZE 6
// В этом буфере хранятся значения нажатых кнопок
unsigned char btn_buf[BUF_SIZE];
// Иницализация индекса
unsigned char btn_index = 0;
// Функция для обработки нажатия. Принимает значение нажатой кнопки btn_value и сохраняет его в массиве
void store_btn( unsigned char btn_value )
{
// Сохраним значение в массиве
btn_buf[ btn_index ] = btn_value;
// Передвинем индекс на следующую ячейку
btn_index++;
// Если мы вышли за границы буфера, то переместимся на его начало
if( btn_index >= BUF_SIZE ) btn_index = 0;
}