реклама на сайте
подробности

 
 
> ARM, Кнопка
SimplyLovely
сообщение Nov 7 2013, 11:03
Сообщение #1





Группа: Новичок
Сообщений: 4
Регистрация: 7-11-13
Пользователь №: 79 088



Здравствуйте, столкнулся с проблемой, что не могу найти как сделать однократное прочтение состояния кнопки.

Код
  while(1)
  {
    //Если нажатa кнопка...
    if (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)==1)
    {
      Start();
      GPIO_WriteBit (GPIOB,GPIO_Pin_10, Bit_RESET);
    }
    if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11)==1)
    {
      Time += 1000;
      GPIO_ResetBits (GPIOB,GPIO_Pin_11);
    }
    if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12)==1)
    {
      Time -= 1000;
      GPIO_WriteBit (GPIOB,GPIO_Pin_12, Bit_RESET);
    }
        
  }


Мне нужно что бы нажатие кнопки включало функцию один раз, а не несколько раз на протяжении всего времени нажатия.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Nov 7 2013, 11:43
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Кто-нибудь может объяснить, что должна делать вот эта строка?
CODE
GPIO_WriteBit (GPIOB,GPIO_Pin_10, Bit_RESET);


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
SimplyLovely
сообщение Nov 7 2013, 11:59
Сообщение #3





Группа: Новичок
Сообщений: 4
Регистрация: 7-11-13
Пользователь №: 79 088



Цитата(Сергей Борщ @ Nov 7 2013, 14:43) *
Кто-нибудь может объяснить, что должна делать вот эта строка?
Код
GPIO_WriteBit (GPIOB,GPIO_Pin_10, Bit_RESET);


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

Но не получилось.

Цитата(igorle @ Nov 7 2013, 14:39) *
Код
  int is_pressed = 0;
  while(1)
  {
    //Если нажатa кнопка...
    if (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)==1)
    {
        /* Защита от дребезга  */
        if (is_pressed < 200 && is_pressed++ != 100 )
            Start();
        GPIO_WriteBit (GPIOB,GPIO_Pin_10, Bit_RESET);
    }
    else
        is_pressed = 0;
    ...
    sleep(1);
  }


Говорит что функция sleep() задана неявно
Видимо без этой функции работать не будет.
А как можно обрабатывать нажатие не через цикл?
Заодно прилагаю код полностью.
Код
//Не забываем подключить заголовочный файл с описание регистров микроконтроллера

#include "stm32f10x.h"
#include "stm32f10x_conf.h"

static __IO uint32_t TimingDelay;

void Delay_ms(__IO uint32_t nTime);//обьявляем функцию отсчета времени

void Start (void); //обьявляем функцию начала работы мотора
  
unsigned int Time = 1000;//переменная хранящая время задержки

//Наша главная функция

void main(void)
{
  SysTick_Config(24000);

  //Разрешаем тактирование шины порта B
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

  //Объявляем структуру для настройки порта
  GPIO_InitTypeDef GPIO_Buttons;

  //Заполняем структуру начальными значениями
  GPIO_StructInit(&GPIO_Buttons);

  /* Запишем в поле GPIO_Pin структуры GPIO_Init_struct номер вывода порта, который мы будем     настраивать далее */
  GPIO_Buttons.GPIO_Pin  = (GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12);

  // Подобным образом заполним поля GPIO_Speed и GPIO_Mode
  GPIO_Buttons.GPIO_Speed= GPIO_Speed_2MHz;
  GPIO_Buttons.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  
  //Передаем заполненную структуру, для выполнения действий по настройке регистров
  GPIO_Init(GPIOB, &GPIO_Buttons);
  
  //Разрешаем тактирование шины порта C
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
  
  //Объявляем структуру для настройки порта
  GPIO_InitTypeDef GPIO_Motor;

  //Заполняем структуру начальными значениями
  GPIO_StructInit(&GPIO_Motor);
  
  // Настраеваем пины вывода управления мотором
  GPIO_Motor.GPIO_Pin  = (GPIO_Pin_8 | GPIO_Pin_9);
  GPIO_Motor.GPIO_Speed= GPIO_Speed_2MHz;
  GPIO_Motor.GPIO_Mode = GPIO_Mode_Out_PP;
  
  // Передаем заполненую структуру, для выполнения действий по настройке регистров
  GPIO_Init(GPIOC, &GPIO_Motor);
  
int is_pressed = 0;
  while(1)
  {
    //Если нажатa кнопка...
     if (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)==1)
    {
        /* Защита от дребезга  */
        if (is_pressed < 200 && is_pressed++ != 100 )
            Start();
    }
    else
        is_pressed = 0;

    if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11)==1)
    {
      /* Защита от дребезга  */
        if (is_pressed < 200 && is_pressed++ != 100 )
            Time += 1000;
    }
    else
        is_pressed = 0;
    
    if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12)==1)
    {
      /* Защита от дребезга  */
        if (is_pressed < 200 && is_pressed++ != 100 )
            Time -= 1000;
    }
    else
        is_pressed = 0;
    
        
  }
}

void Start (void) //функция начала работы
{
  GPIO_SetBits(GPIOC, GPIO_Pin_9);
  Delay_ms(1000);
  GPIO_ResetBits(GPIOC, GPIO_Pin_9);
  Delay_ms(Time);
  GPIO_SetBits(GPIOC, GPIO_Pin_8);
  Delay_ms(1000);
  GPIO_ResetBits(GPIOC, GPIO_Pin_8);
}


//Функция временной задержки
void Delay_ms(__IO uint32_t nTime)
{
  TimingDelay = nTime;
  while(TimingDelay != 0);
}

void TimingDelay_Decrement(void)
{
  if (TimingDelay != 0x00)
  {
    TimingDelay--;
  }
}

//Обработчик прерывания системного таймера
void SysTick_Handler(void)
{
  TimingDelay_Decrement();
}


Сообщение отредактировал SimplyLovely - Nov 7 2013, 11:48
Go to the top of the page
 
+Quote Post
kovigor
сообщение Nov 7 2013, 13:57
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(SimplyLovely @ Nov 7 2013, 14:59) *
Так я думал сбрасывать бит нажатия кнопки.

Вот вам блок-схема, с подавлением дребезга, ожиданиями нажатий и отпусканий:
http://zalil.ru/34799986

Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 18:53
Рейтинг@Mail.ru


Страница сгенерированна за 0.01401 секунд с 7
ELECTRONIX ©2004-2016