Top.Mail.Ru
Ответы

Помогите с написанием кода на Си для микроконтроллера

Есть 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 целых чисел так:

1
 int Pl[6]; 

Это означает, что у вас есть 6 переменных Pl[0], Pl1, Pl2, Pl3, Pl4 и Pl5, которые занимают по 4 байта каждая (размер целого числа на Си). Вы можете обращаться к ним по индексу от 0 до 5.

Для того, чтобы записывать данные в массив поочередно, вы можете использовать еще одну переменную для хранения текущего индекса. Например:

1
 int index = 0; 

Когда вы считываете значение с кнопки и нажимаете кнопку подтверждения ввода, вы можете записать его в массив по текущему индексу и увеличить индекс на 1:

1
 Pl[index] = key; 
1
 index++; 

Таким образом, вы будете заполнять массив по порядку от Pl[0] до Pl5. Когда индекс достигнет 6, это означает, что массив заполнен и вы можете перестать записывать данные или начать заново с нулевого индекса.

Вот пример кода на Си для микроконтроллера:

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
 #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, это может быть массив байт, чтобы сэкономить память. Затем вам нужен индекс в этом массиве, причем это должна быть переменная со временем жизни больше, чем ваша функция (можно сделать ее глобальной) или хранить в вышележащей функции.

1234567891011121314151617
 // Размер буфера 
#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;    
}