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

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

25.06.2012, 21:47. Просмотров 21939. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.06.2012, 21:47
Ответы с готовыми решениями:

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

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

Обработка тактовой кнопки
Вобщем решил поднять тему обработки тактовых кнопок. Какое самое лучшее...

Загрузка пользовательской прошивки "на лету"
Привет. Есть Keil, stm32f4 и две прошивки - основная и пользовательская....

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

34
Midvid
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 966
25.06.2012, 22:03 #2
Дребез контактов. Тебе кажется что ты нажимаешь 1 раз а на самом деле контакты очень быстро замыкаются/размыкаются в процессе однократного нажатия.
0
z-z
169 / 168 / 56
Регистрация: 22.06.2011
Сообщений: 980
25.06.2012, 22:10 #3
эм... то есть этого никак не избежать?)
0
Midvid
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 966
25.06.2012, 22:12 #4
Нужно реже опрашивать кнопку. Только и всего.
0
z-z
169 / 168 / 56
Регистрация: 22.06.2011
Сообщений: 980
25.06.2012, 22:13 #5
дык а как? мне нажать кнопку и ждать, пока цикл проверки кнопки сработает?))
0
Midvid
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 966
25.06.2012, 22:15 #6
ну задержка-то совсем небольшая может быть. Человек её особо то и не заметит.
0
z-z
169 / 168 / 56
Регистрация: 22.06.2011
Сообщений: 980
25.06.2012, 22:17 #7
да, кстати, я пробовал по больше держать... думал наоборот, типо кнопка не успевает сработать... так вот иногда более стабильно работает, если долго удерживать)
0
moksir
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
buy
4 / 4 / 0
Регистрация: 12.03.2013
Сообщений: 24
26.06.2012, 08:05 #9
delay, ага, отличное решение =\
0
md5sum
0 / 0 / 0
Регистрация: 19.01.2011
Сообщений: 72
26.06.2012, 10:18 #10
Цитата Сообщение от buy
delay, ага, отличное решение =\
Судя по тому, что о дребезге контактов ТС слышит впервые:
Цитата Сообщение от z-z
иногда надо нажимать 5-6 раз, чтобы переключить состояние. хотя иногда переклчается сразу. в чем может быть проблема?
это наиболее подходящее решение ;)
0
z-z
169 / 168 / 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
BykTiho
0 / 0 / 0
Регистрация: 12.04.2010
Сообщений: 3,260
27.06.2012, 05:48 #12
Использовать логическое ИЛИ
0
md5sum
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
169 / 168 / 56
Регистрация: 22.06.2011
Сообщений: 980
27.06.2012, 11:13 #14
Цитата Сообщение от md5sum
GPIOB->ODR ^= GPIO_ODR_ODR1|GPIO_ODR_ODR2|GPIO_ODR_ODRx;
вот я это и имел ввиду, хотел что то типа гирлянды сделать, может по тупому, но ко всем выводам порта В подключил диоды. так мне воот так вот все выводы описывать лень было)) поэтому хотел как то через цикл, но не идет, что то не нравится ему)
0
md5sum
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
0 / 0 / 0
Регистрация: 24.06.2012
Сообщений: 9
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]

а, стало быть, выполняет переключение светодиодов - бессмысленное и беспощадное - все то время, пока кнопка нажата. Соответственно, на выходе получает то, что получает - случайное состояние...
0
z-z
169 / 168 / 56
Регистрация: 22.06.2011
Сообщений: 980
29.06.2012, 00:34 #17
oordvork, а как тогда событие нажатия отследить?
0
R_uro
0 / 0 / 0
Регистрация: 06.04.2010
Сообщений: 1,088
29.06.2012, 00:43 #18
Как-то малопонятно все в этих СТМ32..
Как проверить состояние пина порта?
Скажем 4 пина порта С?
0
moksir
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
169 / 168 / 56
Регистрация: 22.06.2011
Сообщений: 980
29.06.2012, 22:56 #20
md5sum, опять к вопросу о "массовом" переключении выводов... а если все надо включать и выключать их всех по очереди? включил 0, выключил 0, включил 1, выключил 1...... и так до конца... неужели никак нельзя сократить код? обязательно для каждого вывода писать GPIOB->ODR ^= ??))
0
29.06.2012, 22:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.06.2012, 22:56

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

Обработка нажатия на кнопки
Всем привет! У меня есть несколько кнопок на форме. Допустим 5. Мне надо...

Создать параграф с произвольным текстом по нажатию кнопки
Объясните, пожалуйста, в чём ошибка. По нажатию кнопки должен создаться...


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

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

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