Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.73/122: Рейтинг темы: голосов - 122, средняя оценка - 4.73
z-z
170 / 169 / 56
Регистрация: 22.06.2011
Сообщений: 980
1

обработка нажатия пользовательской кнопки

25.06.2012, 21:47. Просмотров 24743. Ответов 34
Метки нет (Все метки)

написал, чтобы при нажатии кнопки менялось состояние диодов. но что то не стабильно он работает. иногда надо нажимать 5-6 раз, чтобы переключить состояние. хотя иногда переклчается сразу. в чем может быть проблема?

Код
   unsykned int control;
control = 1;

while(1)
{
if((GPIOA->IDR&0x01)==1) //нажатие кнопки
{
control = control << 1;
if (control>2) control = 1;
}
if(control == 1)
{
GPIOC->BSRR = GPIO_BSRR_BS9;
GPIOC->BSRR = GPIO_BSRR_BR8;
}
if(control == 2)
{
GPIOC->BSRR = GPIO_BSRR_BS8;
GPIOC->BSRR = GPIO_BSRR_BR9;
}

}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.06.2012, 21:47
Ответы с готовыми решениями:

Обработка нажатия кнопки
Есть кнопка без фиксатора( нажали отпустили и она разомкнулась) Как обработать событие нажали, она...

Обработка нажатия кнопки...
Есть программа для AVR, имитирует работу светофора, написана с Code Vision AVR. #define B_g...

Обработка нажатия кнопки
Добрый день! Есть некий класс с функциями: сlass job { function...

Обработка нажатия кнопки
Здравствуйте. Имеется HTML код самой кнопки: &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;meta...

34
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 966
25.06.2012, 22:03 2
Дребез контактов. Тебе кажется что ты нажимаешь 1 раз а на самом деле контакты очень быстро замыкаются/размыкаются в процессе однократного нажатия.
0
z-z
170 / 169 / 56
Регистрация: 22.06.2011
Сообщений: 980
25.06.2012, 22:10 3
эм... то есть этого никак не избежать?)
0
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 966
25.06.2012, 22:12 4
Нужно реже опрашивать кнопку. Только и всего.
0
z-z
170 / 169 / 56
Регистрация: 22.06.2011
Сообщений: 980
25.06.2012, 22:13 5
дык а как? мне нажать кнопку и ждать, пока цикл проверки кнопки сработает?))
0
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 966
25.06.2012, 22:15 6
ну задержка-то совсем небольшая может быть. Человек её особо то и не заметит.
0
z-z
170 / 169 / 56
Регистрация: 22.06.2011
Сообщений: 980
25.06.2012, 22:17 7
да, кстати, я пробовал по больше держать... думал наоборот, типо кнопка не успевает сработать... так вот иногда более стабильно работает, если долго удерживать)
0
0 / 0 / 0
Регистрация: 23.05.2012
Сообщений: 216
26.06.2012, 06:13 8
Вот проверенная функция кнопки, правда для AVR, но без разницы.
Код
char GetB_MODE()
{
if (PINC.3) return 0;
delay_ms(DelayB);
if (!PINC.3) while (!PINC.3);
else return 0;
return 0x01;
}
DelayB обычно достаточно 50мс.
Вывод подтянут к питанию.
Срабатывает после отпускания.
0
4 / 4 / 0
Регистрация: 12.03.2013
Сообщений: 24
26.06.2012, 08:05 9
delay, ага, отличное решение =\
0
0 / 0 / 0
Регистрация: 19.01.2011
Сообщений: 72
26.06.2012, 10:18 10
Цитата Сообщение от buy
delay, ага, отличное решение =\
Судя по тому, что о дребезге контактов ТС слышит впервые:
Цитата Сообщение от z-z
иногда надо нажимать 5-6 раз, чтобы переключить состояние. хотя иногда переклчается сразу. в чем может быть проблема?
это наиболее подходящее решение ;)
0
z-z
170 / 169 / 56
Регистрация: 22.06.2011
Сообщений: 980
26.06.2012, 23:16 11
md5sum, а что применять, когда уже не первый раз буду слышать?)

и если можно, добавлю сюда же. как делать, если надо, например, половину выводов порта использовать? вот надо изменить состояние на половине из них, перечислять все в GPIOB->ODR ^= не очень удобно, а в цикл не получилось загнать типо
for(k=0; k<10;k++)
{
GPIOB->ODR ^= GPIO_ODR_ODRk;
}
0
0 / 0 / 0
Регистрация: 12.04.2010
Сообщений: 3,260
27.06.2012, 05:48 12
Использовать логическое ИЛИ
0
0 / 0 / 0
Регистрация: 19.01.2011
Сообщений: 72
27.06.2012, 10:30 13
Цитата Сообщение от z-z
md5sum, а что применять, когда уже не первый раз буду слышать?)
Ну.. вариантов много. Я предпочитаю заводить один таймер на период 50-100 милисек. И в основном цикле программы проверять флаг от этого таймера и выполнять какие либо периодические действия: опрос кнопок, вывод буфера на экран, и т.д.
Касательно кнопок при этом не нужны delay. Если кнопка нажата при первом опросе - просто запомним ее состояние, при втором выполним код нажатия (точнее поставим флаг, что кнопка нажата или вернем состояние в случае функции), если при последующих опросах кнопка все еще нажата, то можно отловить "длинное" нажатие и выполнить соотв. кусок.

Цитата Сообщение от z-z
и если можно, добавлю сюда же. как делать, если надо, например, половину выводов порта использовать? вот надо изменить состояние на половине из них, перечислять все в GPIOB->ODR ^= не очень удобно
GPIOB->ODR ^= GPIO_ODR_ODR1|GPIO_ODR_ODR2|GPIO_ODR_ODRx;
0
z-z
170 / 169 / 56
Регистрация: 22.06.2011
Сообщений: 980
27.06.2012, 11:13 14
Цитата Сообщение от md5sum
GPIOB->ODR ^= GPIO_ODR_ODR1|GPIO_ODR_ODR2|GPIO_ODR_ODRx;
вот я это и имел ввиду, хотел что то типа гирлянды сделать, может по тупому, но ко всем выводам порта В подключил диоды. так мне воот так вот все выводы описывать лень было)) поэтому хотел как то через цикл, но не идет, что то не нравится ему)
0
0 / 0 / 0
Регистрация: 19.01.2011
Сообщений: 72
27.06.2012, 12:01 15
Синтаксис не нравится :)

Код
#define GPIO_ODR_ODR0                        ((uint16_t)0x0001)            /*!< Port output data, bit 0 */
#define GPIO_ODR_ODR1                        ((uint16_t)0x0002)            /*!< Port output data, bit 1 */
#define GPIO_ODR_ODR2                        ((uint16_t)0x0004)            /*!< Port output data, bit 2 */
GPIO_ODR_ODR0 это макросы описывающие битовую маску.
Хотите изменить сразу несколько - пишите как я в примере или укажите свою маску:
Код
GPIOB->ODR ^=0x00ff; //переключит младшие 8 ног.
или что-б потом самому легче читалось:
Код
/* маска для 8-ми нечетных ног */
#define ODD_0_8 0x0055
/* маска для 8-ми четных ног */
#define EVEN_0_8 0x00AA
GPIOB->ODR ^= ODD_0_8; //переключит нечетные
GPIOB->ODR ^= EVEN_0_8; //переключит четные
Но советую начать с описания языка Си....
0
oordvork
28.06.2012, 10:51 16
За обсуждением технической проблемы как-то упустили логическую - вместо отслеживания события нажатия кнопки топик стартер проверяет ее состояние:
Цитата Сообщение от z-z
написал, чтобы при нажатии кнопки менялось состояние диодов.

[bla-bla-bla]
Код:
if((GPIOA->IDR&0x01)==1) //нажатие кнопки
{
control = control << 1;
if (control>2) control = 1;
}
[bla-bla-bla]

а, стало быть, выполняет переключение светодиодов - бессмысленное и беспощадное - все то время, пока кнопка нажата. Соответственно, на выходе получает то, что получает - случайное состояние...
z-z
170 / 169 / 56
Регистрация: 22.06.2011
Сообщений: 980
29.06.2012, 00:34 17
oordvork, а как тогда событие нажатия отследить?
0
0 / 0 / 0
Регистрация: 06.04.2010
Сообщений: 1,088
29.06.2012, 00:43 18
Как-то малопонятно все в этих СТМ32..
Как проверить состояние пина порта?
Скажем 4 пина порта С?
0
0 / 0 / 0
Регистрация: 23.05.2012
Сообщений: 216
29.06.2012, 06:25 19
R_uro, просто.
Можно использовать стандартную библиотеку:
if (GPIO_ReadInputDataByt(GPIOC,GPIO_Pin_4)== Byt_RESIT)....
Можно и так(само коротко и быстро:
if (GPIOС->IDR & GPIO_IDR_IDR4)...
0
z-z
170 / 169 / 56
Регистрация: 22.06.2011
Сообщений: 980
29.06.2012, 22:56 20
md5sum, опять к вопросу о "массовом" переключении выводов... а если все надо включать и выключать их всех по очереди? включил 0, выключил 0, включил 1, выключил 1...... и так до конца... неужели никак нельзя сократить код? обязательно для каждого вывода писать GPIOB->ODR ^= ??))
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.06.2012, 22:56

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

Обработка нажатия кнопки
Добрый вечер! Пытаюсь сделать простой калькулятор на Java c использованием компонентов Swing. При...

Обработка нажатия кнопки.
напишите пример кода пожалуйста! Кнопку кикаешь, на чекбоксе появляется галочка, еще раз кликаеш,...

Обработка нажатия кнопки
Уже 2 часа пытаюсь настроить эту нехитрую операцию, и вроде примеров сети много. Но нажатие кнопки...

Обработка нажатия кнопки
Здравствуйте! Осваиваю обработку событий JAVA и столкнулся с проблемой. Я хочу чтобы по нажатию на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.