1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- Как проверить состояние пина порта?
- Скажем 4 пина порта С?
- просто.
- Можно использовать стандартную библиотеку:
- if (GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_4)== Bit_RESET)....
- Можно и так(само коротко и быстро:
- if (GPIOС->IDR & GPIO_IDR_IDR4)...
- #define pin_X (GPIOС->IDR & GPIO_IDR_IDR4)
- if (pin_X == 1) {......}
- -=-=-
- Код:
- #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; //переключит четные
- -=-=-=-=-=-
- а как тогда событие нажатия отследить?
- Ну, как-то так (одновременно и с дребезгом поборемся):
- Код:
- #define MAXCNT 10
- char flip=0, pressed=0;
- while(1)
- {
- if((GPIOA->IDR&0x01)==0) //кнопка не нажата (или 0 читается во впемя дребезга) - готовимся к обработке
- {
- pressed=0;
- cntr=0;
- }
- else
- if(!pressed) //кнопка вроде бы нажата, но возможно это пока что только дребезг
- {
- cntr++; // сосчитаем до десяти в надежде, что за это время переходные процессы завершатся
- if(cntr>MAXCNT) // десять последних проходов кнопка в состоянии "нажато" - считаем, что событие "нажатие кнопки" свершилось
- { // тут соб-сно ваша реакция на событие "нажатие кнопки", т.е. переход от 0 к 1
- flip=!flip; // организуем простейший двоичный переключатель ("flip-flop")
- if(flip) // и в зависимости от его состояния выполняем ту или иную ветвь
- {
- GPIOC->BSRR = GPIO_BSRR_BS9;
- GPIOC->BSRR = GPIO_BSRR_BR8;
- }
- else
- {
- GPIOC->BSRR = GPIO_BSRR_BS8;
- GPIOC->BSRR = GPIO_BSRR_BR9;
- }
- pressed=1; // отработав событие "нажатие кнопки", отключаем проверку на это событие -> до следующего отпускания кнопки
- }
- }
- else //кнопка в состоянии "нажато" (после отловленного события "нажатие кнопки") - в нашем случае неинтересно
- {
- }
- }
|