Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с переменными в классе 
:(
    Опции темы
Alxad
Дата 5.4.2016, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 5.4.2016

Репутация: нет
Всего: нет



Здравствуйте! Разбираюсь понемногу с STM32 и С++.
Сделал программу-счётчик нажатий на кнопку на базе STM32VLDiscovery с подключенным 4-х разрядным семисегментным индикатором.
Теперь хочу из функции кнопки создать класс. Возникают вопросы. Вот листинг:

class button
{
public:
button(int ST_reg, int ST_bit, int ST_const);
~button() {}
bool GetRaise() const {return raise;}
bool GetFall() const {return fall;}

private:
bool raise; // Переменная для возврата true для переднего фронта нажатия кнопки
bool fall; // Переменная для возврата true для заднего фронта нажатия кнопки
bool mid_but1; // Переменная для определения переднего и заднего фронта нажатия кнопки
bool mid_but2; // Переменная для определения переднего и заднего фронта нажатия кнопки
bool but_fix; // Переменная для фиксации состояния удерживания кнопки
int cnt1; // Переменная для отсчета состояния удерживания кнопки
int cnt2 ; // Переменная для задержки фиксации состояния нажатой кнопки (антидребезг)
};

button::button(int ST_reg, int ST_bit, int ST_const)
{
raise = 0; // Переменные для отображения нажатия кнопки - передний фронт
fall = 0; // Переменные для отображения нажатия кнопки - задний фронт

if((ST_reg & ST_bit) == ST_const) // Считываем состояние вывода порта с кнопкой
{
if(cnt2 <= 100) // Задаем условие ограничения счета для задержки антидребезга (передний фронт импульса)
cnt2++; // Счетчик задержки
if(cnt2 > 100) // Когда досчитал
mid_but1 = 1; // присваиваем промежуточной переменной значение 1
}
else
{
if(cnt2 > 0) // Задаем условие ограничения счета для задержки антидребезга (задний фронт импульса)
cnt2--; // Счетчик задержки
if(cnt2 <= 0) // Когда досчитал
mid_but1 = 0; // присваиваем промежуточной переменной значение 0
}

if(mid_but2 < mid_but1)
{
raise = 1; // Ловим момент изменения переменной - передний фронт импульса
but_fix = 1; // Присваиваем 1 промежуточной переменной
}
if(mid_but1 < mid_but2)
{
fall = 1; // Ловим момент изменения переменной - задний фронт импульса
but_fix = 0; // Присваиваем 0 промежуточной переменной
cnt1 = 0; // Сбрасываем счетчик
}
mid_but2 = mid_but1; // Приравниваем промежуточные переменные, чтобы фронт был единичным

if(but_fix == 1) // Ловим состояние зажатой кнопки
cnt1++; // пока кнопка зажата - инкрементируем счётчик
if(cnt1 > 200000 && cnt1%2000 == 0) // если зажата долго, 2-3 секунды...
raise = 1; // выдаём импульсы длительностью в такт с паузой где-то 0,1с
}

Сразу возникают вопрос:
 Мне нужно сделать так, чтобы при первом вызове методов класса переменные bool mid_but1, bool mid_but2, bool but_fix, int cnt1, int cnt2 инициализировались нулями, а дальше меняли своё значение согласно программе и не обнулялись при повторном вызове. Когда это была функция, я делал просто - объявил переменные перед телом функции и инициализировал нулями. Здесь так не получится. Можно решить в лоб - копировать значение переменной из main() и туда же возвращать, но это громоздко. Нет ли решения лучше?
PM MAIL   Вверх
rudolfninja
Дата 5.4.2016, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

Репутация: 1
Всего: 6



Создайте пустой конструктор (без параметров), и в нем обнулите нужные переменные.
Либо в уже существующем конструкторе сделайте обнуление переменных
PM MAIL Skype   Вверх
Alxad
Дата 5.4.2016, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 5.4.2016

Репутация: нет
Всего: нет



Я пробовал при определении конструктора в его теле инициализировать переменную. В итоге каждый раз при обращении к классу я возвращаюсь к тому значению, которым инициализировал.
P.S. Я новичок, и мало знаю, поэтому прошу по возможности с пониманием относиться, если я где-то написал глупость)
P.P.S. Я её таки написал - глупость. Всё верно, спасибо))

Это сообщение отредактировал(а) Alxad - 5.4.2016, 14:40
PM MAIL   Вверх
baldman88
Дата 5.4.2016, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 18.1.2009

Репутация: 1
Всего: 7



Что-то Вы делаете не так. Если правильно понял Вашу мысль, то нужно создать у класса еще один метод, куда и переместить весь код из конструктора. А в конструкторе просто инициализировать переменные нужными значениями:
Код

class button
{
public:
    button();
    ~button() {}
    void action(int ST_reg, int ST_bit, int ST_const);
    int GetRaise() const {return raise;}
    int GetFall() const {return fall;}

private:
    int raise; // Переменная для возврата true для переднего фронта нажатия кнопки
    int fall; // Переменная для возврата true для заднего фронта нажатия кнопки
    int mid_but1; // Переменная для определения переднего и заднего фронта нажатия кнопки
    int mid_but2; // Переменная для определения переднего и заднего фронта нажатия кнопки
    int but_fix; // Переменная для фиксации состояния удерживания кнопки
    int cnt1; // Переменная для отсчета состояния удерживания кнопки
    int cnt2 ; // Переменная для задержки фиксации состояния нажатой кнопки (антидребезг)
};

button::button()
    : mid_but1(0), mid_but2(0), but_fix(0), cnt1(0), cnt2(0) {}

void button::action(int ST_reg, int ST_bit, int ST_const)
{
    raise = 0; // Переменные для отображения нажатия кнопки - передний фронт
    fall = 0; // Переменные для отображения нажатия кнопки - задний фронт
    ...
    if(cnt1 > 200000 && cnt1%2000 == 0) // если зажата долго, 2-3 секунды...
    raise = 1; // выдаём импульсы длительностью в такт с паузой где-то 0,1с
}

Не совсем понятно, зачем используется тип bool. Гораздо проще было бы Вам помочь, если бы Вы привели ту часть кода, где используется этот класс.
PM MAIL   Вверх
Alxad
Дата 5.4.2016, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 5.4.2016

Репутация: нет
Всего: нет



baldman88, спасибо! Я понемногу начал это понимать) У меня с классами первое знакомство - читаю учебник и пробую сразу на практике, - поэтому попутно собираю все грабли))

Вот код, здесь всё просто - пока использую только передний фронт импульса нажатой кнопки для управления:

Код

#include "stm32f10x.h"
#include "button.hpp"

int digit1(int);
int digit2(int, int, int, int);

int main(void)
{
    
        // Разрешаем тактирование порта A
  RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
    
    // Конфигурируем порт А (выводы 1-7) как выходы с максимальным быстродействием 2 Мгц
    GPIOA->CRL &= 0x00000004; //Сброс конфигурации по умолчанию 
    GPIOA->CRL |= 0x22222224; //Конфигурирование порта А (General purpose output push-pull, Output mode, max speed 2 MHz.)
        
    // Конфигурируем порт А (выводы 8-12) как выходы с максимальным быстродействием 2 Мгц
    GPIOA->CRH &= 0x44400000; //Сброс конфигурации по умолчанию 
    GPIOA->CRH |= 0x44422222; //Конфигурирование порта А (General purpose output push-pull, Output mode, max speed 2 MHz.)
    GPIOA->BSRR = 0x00001E00; // Включение выводов 9-12 порта А

    int dig_out = 0; //Переменная для вывода счета    
    int cnt = 0; // Переменная для задания полупериода цикла
    int cnt1 = 0; // Переменная для счетчика задания яркости
    int cnt2 = 1; // Переменная для счетчика сдвига между разрядами
    int bright = 5; // Переменная для задания яркости
    
    while(1)
    {
        button counter(GPIOA->IDR, GPIO_IDR_IDR0, 1);
        int b = counter.GetRaise();
        if(b == 1)      // Если кнопка нажата...
            {if(dig_out < 9999)   // ...и переменная dig_out меньше чем 9999
                    dig_out++;      // ...инкрементируем dig_out.
                else dig_out = 0; // Если dig_out больше 9999, значит, присваиваем ей значение 0
            }
            
        ++cnt;
        ++cnt1;
        if(cnt1 > 50000)   // Если переменная cnt1 в диапазоне от 0 до 50000
            {
                bright = bright + 1;
                cnt1 = 0;
            }
        if(bright >= 50)
            bright = 5;
        
        int dig1 = dig_out%10;
        int dig2 = (dig_out/10)%10;
        int dig3 = (dig_out/100)%10;
        int dig4 = (dig_out/1000)%10;
            
        if(cnt2 == 1)
            cnt = digit2(dig1, bright, cnt, GPIO_BSRR_BR9);
        if(cnt2 == 2)
            cnt = digit2(dig2, bright, cnt, GPIO_BSRR_BR10);
        if(cnt2 == 3)
            cnt = digit2(dig3, bright, cnt, GPIO_BSRR_BR11);
        if(cnt2 == 4)
            cnt = digit2(dig4, bright, cnt, GPIO_BSRR_BR12);
        if(cnt == 0)
            cnt2++;
        if(cnt2 == 5)
            cnt2 = 1;
    }
}

int digit1(int a)
{
    int dig;
    switch(a)
    {
        case 0:
            dig = (GPIO_BSRR_BR1|GPIO_BSRR_BR2|GPIO_BSRR_BR4|GPIO_BSRR_BS5|GPIO_BSRR_BR6|GPIO_BSRR_BR7|GPIO_BSRR_BR8);
            break;
        
        case 1:
            dig = (GPIO_BSRR_BS1|GPIO_BSRR_BS2|GPIO_BSRR_BR4|GPIO_BSRR_BS5|GPIO_BSRR_BR6|GPIO_BSRR_BS7|GPIO_BSRR_BS8);
            break;
        
        case 2:
            dig = (GPIO_BSRR_BR1|GPIO_BSRR_BR2|GPIO_BSRR_BS4|GPIO_BSRR_BR5|GPIO_BSRR_BR6|GPIO_BSRR_BS7|GPIO_BSRR_BR8);
            break;
        
        case 3:
            dig = (GPIO_BSRR_BS1|GPIO_BSRR_BR2|GPIO_BSRR_BR4|GPIO_BSRR_BR5|GPIO_BSRR_BR6|GPIO_BSRR_BS7|GPIO_BSRR_BR8);
            break;
        
        case 4:
            dig = (GPIO_BSRR_BS1|GPIO_BSRR_BS2|GPIO_BSRR_BR4|GPIO_BSRR_BR5|GPIO_BSRR_BR6|GPIO_BSRR_BR7|GPIO_BSRR_BS8);
            break;
        
        case 5:
            dig = (GPIO_BSRR_BS1|GPIO_BSRR_BR2|GPIO_BSRR_BR4|GPIO_BSRR_BR5|GPIO_BSRR_BS6|GPIO_BSRR_BR7|GPIO_BSRR_BR8);
            break;
        
        case 6:
            dig = (GPIO_BSRR_BR1|GPIO_BSRR_BR2|GPIO_BSRR_BR4|GPIO_BSRR_BR5|GPIO_BSRR_BS6|GPIO_BSRR_BR7|GPIO_BSRR_BR8);
            break;
        
        case 7:
            dig = (GPIO_BSRR_BS1|GPIO_BSRR_BS2|GPIO_BSRR_BR4|GPIO_BSRR_BS5|GPIO_BSRR_BR6|GPIO_BSRR_BS7|GPIO_BSRR_BR8);
            break;
        
        case 8:
            dig = (GPIO_BSRR_BR1|GPIO_BSRR_BR2|GPIO_BSRR_BR4|GPIO_BSRR_BR5|GPIO_BSRR_BR6|GPIO_BSRR_BR7|GPIO_BSRR_BR8);
            break;
        
        case 9:
            dig = (GPIO_BSRR_BS1|GPIO_BSRR_BR2|GPIO_BSRR_BR4|GPIO_BSRR_BR5|GPIO_BSRR_BR6|GPIO_BSRR_BR7|GPIO_BSRR_BR8);
            break;
    }
    return dig;
}


int digit2(int dig, int bright, int cnt, int ST_bit)
{    
    if(cnt >= 1 && cnt < bright)
        GPIOA->BSRR = digit1(dig); // Сброс/установка выводов порта А для вывода результатов счета
        GPIOA->BSRR|=ST_bit;       // Сброс вывода общего порта А
    
    if(cnt >= bright && cnt <= (bright+50))
        GPIOA->BSRR = 0x000001FE; // Включение выводов 1-8 порта А
        ST_bit = ST_bit >> 16;
        GPIOA->BSRR|=ST_bit;       // Включение вывода общего порта А
    
    if (cnt > (bright+50))
        {
            cnt = 0;
        }
    
        return cnt;            
}



Это сообщение отредактировал(а) Alxad - 5.4.2016, 15:38
PM MAIL   Вверх
Alxad
Дата 5.4.2016, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 5.4.2016

Репутация: нет
Всего: нет



Спасибо всем, доделал класс и код - работает в железе!))
Привожу листинг:

Код

    class button
    {
        public:
            button(int ST_bit, int ST_const);
            ~button() {}
            bool GetRaise(int ST_reg);
            bool GetFall(int ST_reg);

        private:
            int itsST_reg;
            int itsST_bit;
            int itsST_const;
            bool raise;        // Переменная для возврата true для переднего фронта нажатия кнопки
            bool fall;            // Переменная для возврата true для заднего фронта нажатия кнопки
            bool mid_but1;    // Переменная для определения переднего и заднего фронта нажатия кнопки
            bool mid_but2;    // Переменная для определения переднего и заднего фронта нажатия кнопки
            bool but_fix;      // Переменная для фиксации состояния удерживания кнопки
            int cnt1; // Переменная для отсчета состояния удерживания кнопки
            int cnt2; // Переменная для задержки фиксации состояния нажатой кнопки (антидребезг)
    };

    button::button(int ST_bit, int ST_const)
    {
        itsST_bit = ST_bit;
        itsST_const = ST_const;
        mid_but1 = 0;
        mid_but2 = 0;
        but_fix = 0;
        cnt1 = 0;
        cnt2 = 0;
    }

    bool button::GetFall(int ST_reg)
    {
        itsST_reg = ST_reg;
        raise = 0; // Переменные для отображения нажатия кнопки - передний фронт
        fall = 0; // Переменные для отображения нажатия кнопки    - задний фронт

        if((itsST_reg & itsST_bit) == itsST_const)        // Считываем состояние вывода порта с кнопкой
            {
                if(cnt2 <= 100) // Задаем условие ограничения счета для задержки антидребезга (передний фронт импульса)
                    cnt2++;      // Счетчик задержки
                if(cnt2 > 100)  // Когда досчитал
                    mid_but1 = 1;     // присваиваем промежуточной переменной значение 1
            }
        else
            {
                if(cnt2 > 0)  // Задаем условие ограничения счета для задержки антидребезга (задний фронт импульса)
                    cnt2--;     // Счетчик задержки
                if(cnt2 <= 0) // Когда досчитал
                    mid_but1 = 0;  // присваиваем промежуточной переменной значение 0
            }

        if(mid_but2 < mid_but1)
            {
                raise = 1;  // Ловим момент изменения переменной - передний фронт импульса
                but_fix = 1;      // Присваиваем 1 промежуточной переменной
            }
        if(mid_but1 < mid_but2)
            {
                fall = 1;  // Ловим момент изменения переменной - задний фронт импульса
                but_fix = 0;      // Присваиваем 0 промежуточной переменной
                cnt1 = 0;   // Сбрасываем счетчик
            }
        mid_but2 = mid_but1;  // Приравниваем промежуточные переменные, чтобы фронт был единичным

        return fall;
}
    
    bool button::GetRaise(int ST_reg)
    {
        itsST_reg = ST_reg;
        
        GetFall(itsST_reg);

        if(but_fix == 1) // Ловим состояние зажатой кнопки
            cnt1++;        // пока зажата - инкрементируем счетчик
        if(cnt1 > 200000 && cnt1%2000 == 0) // Если зажата долго, 2-3 секунды...
            raise = 1; // ...выдаем импульсы длительность в такт и паузой 0,2-0,3 секунды

        return raise;
}




Код

#include "stm32f10x.h"
#include "D:\Работа\Электроника\Keil\Second\button.hpp"

int digit1(int);
int digit2(int, int, int, int);

int main(void)
{
    
        // Разрешаем тактирование порта A
  RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
    
    // Конфигурируем порт А (выводы 1-7) как выходы с максимальным быстродействием 2 Мгц
    GPIOA->CRL &= 0x00000004; //Сброс конфигурации по умолчанию 
    GPIOA->CRL |= 0x22222224; //Конфигурирование порта А (General purpose output push-pull, Output mode, max speed 2 MHz.)
        
    // Конфигурируем порт А (выводы 8-12) как выходы с максимальным быстродействием 2 Мгц
    GPIOA->CRH &= 0x44400000; //Сброс конфигурации по умолчанию 
    GPIOA->CRH |= 0x44422222; //Конфигурирование порта А (General purpose output push-pull, Output mode, max speed 2 MHz.)
    GPIOA->BSRR = 0x00001E00; // Включение выводов 9-12 порта А

    int dig_out = 0; //Переменная для вывода счета    
    int cnt = 0; // Переменная для задания полупериода цикла
    int cnt1 = 0; // Переменная для счетчика задания яркости
    int cnt2 = 1; // Переменная для счетчика сдвига между разрядами
    int bright = 5; // Переменная для задания яркости
    button counter(GPIO_IDR_IDR0, 1);
    
    while(1)
    {
        bool b = counter.GetRaise(GPIOA->IDR);
        if(b)      // Если кнопка нажата...
            {if(dig_out < 9999)   // ...и переменная dig_out меньше чем 9999
                    dig_out++;      // ...инкрементируем dig_out.
                else dig_out = 0; // Если dig_out больше 9999, значит, присваиваем ей значение 0
            }
            
        ++cnt;
        ++cnt1;
        if(cnt1 > 50000)   // Если переменная cnt1 в диапазоне от 0 до 50000
            {
                bright = bright + 1;
                cnt1 = 0;
            }
        if(bright >= 50)
            bright = 5;
        
        int dig1 = dig_out%10;
        int dig2 = (dig_out/10)%10;
        int dig3 = (dig_out/100)%10;
        int dig4 = (dig_out/1000)%10;
            
        if(cnt2 == 1)
            cnt = digit2(dig1, bright, cnt, GPIO_BSRR_BR9);
        if(cnt2 == 2)
            cnt = digit2(dig2, bright, cnt, GPIO_BSRR_BR10);
        if(cnt2 == 3)
            cnt = digit2(dig3, bright, cnt, GPIO_BSRR_BR11);
        if(cnt2 == 4)
            cnt = digit2(dig4, bright, cnt, GPIO_BSRR_BR12);
        if(cnt == 0)
            cnt2++;
        if(cnt2 == 5)
            cnt2 = 1;
    }
}

int digit1(int a)
{
    int dig;
    switch(a)
    {
        case 0:
            dig = (GPIO_BSRR_BR1|GPIO_BSRR_BR2|GPIO_BSRR_BR4|GPIO_BSRR_BS5|GPIO_BSRR_BR6|GPIO_BSRR_BR7|GPIO_BSRR_BR8);
            break;
        
        case 1:
            dig = (GPIO_BSRR_BS1|GPIO_BSRR_BS2|GPIO_BSRR_BR4|GPIO_BSRR_BS5|GPIO_BSRR_BR6|GPIO_BSRR_BS7|GPIO_BSRR_BS8);
            break;
        
        case 2:
            dig = (GPIO_BSRR_BR1|GPIO_BSRR_BR2|GPIO_BSRR_BS4|GPIO_BSRR_BR5|GPIO_BSRR_BR6|GPIO_BSRR_BS7|GPIO_BSRR_BR8);
            break;
        
        case 3:
            dig = (GPIO_BSRR_BS1|GPIO_BSRR_BR2|GPIO_BSRR_BR4|GPIO_BSRR_BR5|GPIO_BSRR_BR6|GPIO_BSRR_BS7|GPIO_BSRR_BR8);
            break;
        
        case 4:
            dig = (GPIO_BSRR_BS1|GPIO_BSRR_BS2|GPIO_BSRR_BR4|GPIO_BSRR_BR5|GPIO_BSRR_BR6|GPIO_BSRR_BR7|GPIO_BSRR_BS8);
            break;
        
        case 5:
            dig = (GPIO_BSRR_BS1|GPIO_BSRR_BR2|GPIO_BSRR_BR4|GPIO_BSRR_BR5|GPIO_BSRR_BS6|GPIO_BSRR_BR7|GPIO_BSRR_BR8);
            break;
        
        case 6:
            dig = (GPIO_BSRR_BR1|GPIO_BSRR_BR2|GPIO_BSRR_BR4|GPIO_BSRR_BR5|GPIO_BSRR_BS6|GPIO_BSRR_BR7|GPIO_BSRR_BR8);
            break;
        
        case 7:
            dig = (GPIO_BSRR_BS1|GPIO_BSRR_BS2|GPIO_BSRR_BR4|GPIO_BSRR_BS5|GPIO_BSRR_BR6|GPIO_BSRR_BS7|GPIO_BSRR_BR8);
            break;
        
        case 8:
            dig = (GPIO_BSRR_BR1|GPIO_BSRR_BR2|GPIO_BSRR_BR4|GPIO_BSRR_BR5|GPIO_BSRR_BR6|GPIO_BSRR_BR7|GPIO_BSRR_BR8);
            break;
        
        case 9:
            dig = (GPIO_BSRR_BS1|GPIO_BSRR_BR2|GPIO_BSRR_BR4|GPIO_BSRR_BR5|GPIO_BSRR_BR6|GPIO_BSRR_BR7|GPIO_BSRR_BR8);
            break;
    }
    return dig;
}


int digit2(int dig, int bright, int cnt, int ST_bit)
{    
    if(cnt >= 1 && cnt < bright)
        GPIOA->BSRR = digit1(dig); // Сброс/установка выводов порта А для вывода результатов счета
        GPIOA->BSRR|=ST_bit;       // Сброс вывода общего порта А
    
    if(cnt >= bright && cnt <= (bright+50))
        GPIOA->BSRR = 0x000001FE; // Включение выводов 1-8 порта А
        ST_bit = ST_bit >> 16;
        GPIOA->BSRR|=ST_bit;       // Включение вывода общего порта А
    
    if (cnt > (bright+50))
        {
            cnt = 0;
        }
    
        return cnt;            
}



Теперь хочу сделать класс для 4-х разрядного семисегментного индикатора, думаю, будет интересно))
PM MAIL   Вверх
math64
Дата 6.4.2016, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Ну, обычно вывод на индикаторы и опрос кнопок лучше делать по прерыванию.
Что-то типа так:
Код

Timer timer;
Button buttons[4];
Indicator indicators[4];

void on_button0_pressed(Button* button);
void on_button1_pressed(Button* button);
void on_button2_pressed(Button* button);
void on_button3_pressed(Button* button);

int main(void)
{
buttons[0].init(button_reg0, on_button0_pressed);
buttons[1].init(button_reg1, on_button1_pressed);
buttons[2].init(button_reg2, on_button2_pressed);
buttons[3].init(button_reg3, on_button3_pressed);
indicators[0].init(indicator_reg0);
indicators[1].init(indicator_reg1);
indicators[2].init(indicator_reg2);
indicators[3].init(indicator_reg3);
timer.init(buttons, 4, indicators, 4);
timer.start();
}

Timer::onInterrupt()
{
indicator[current_indicator_index].show();
current_indicator_index++;
if (current_indicator_index >= indicators_count)
  current_indicator_index = 0;
for(int i=0; i < buttons_count)
   butons[i].checkPressed();
}

PM   Вверх
Alxad
Дата 6.4.2016, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 5.4.2016

Репутация: нет
Всего: нет



Спасибо за совет. Я пока не добрался до прерываний)) Но позже обязательно разберусь.
PM MAIL   Вверх
math64
Дата 6.4.2016, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Без прерваний яркость свечения индикаторов будет неравномерна (если у них нет аппаратного обновления)
PM   Вверх
Alxad
Дата 6.4.2016, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 5.4.2016

Репутация: нет
Всего: нет



У меня плата STM32VLDiscovery. К ней по принципу динамической индикации подключен 4-х разрядный семисегментный индикатор, сегменты напрямую, общие аноды через транзисторы. Пока реализовал банальный счётчик нажатий на пользовательскую кнопку с выводом результата на дисплей, с определением "зажатия" кнопки и ускорением счёта при этом и обнулением счёта после 9999)). При этом я сделал небольшой код, чтобы понять, как влияет скважность на яркость при динамической индикации.
В принципе, кроме запланированных, других неравномерностей яркости не увидел))
PM MAIL   Вверх
math64
Дата 6.4.2016, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



В тестовой программе неравномерность не будет заметна. В реальной программе, когда кроме обработчиков нажатий кнопок появятся другие вычисления, при обновлении дисплея без прерываний это будет заметно.
PM   Вверх
Alxad
Дата 6.4.2016, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 5.4.2016

Репутация: нет
Всего: нет



Понятно. Что ж, спасибо за совет. Думаю, это сэкономило мне пару шишек. Буду разбираться))
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1775 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.