|
@@ -0,0 +1,77 @@
|
|
|
+Как проверить состояние пина порта?
|
|
|
+Скажем 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 //кнопка в состоянии "нажато" (после отловленного события "нажатие кнопки") - в нашем случае неинтересно
|
|
|
+ {
|
|
|
+ }
|
|
|
+ }
|