/
AVLGU
/
STM32F072_Programming
Обзор
Документация
Войти
/
AVLGU
/
STM32F072_Programming
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop
keyboard4.c
186 строк
4 KB
AVLGU
working
26 ноя 2025, 12:40
26 ноя 2025, 12:40
f30743e
Код
Авторство
О чём код?
#include "keyboard4.h" #define BOUNCE_TIME 5 static void CheckButtons12 (void); static void CheckButtons15 (void); void InitKeyboard (void) { RCC->AHBENR |= RCC_AHBENR_GPIOAEN; RCC->AHBENR |= RCC_AHBENR_GPIOCEN; //PA4, PA5 - PD INPUT GPIOA->MODER &= ~(GPIO_MODER_MODER4 | GPIO_MODER_MODER5); // reset on leg 4,5 GPIOA->PUPDR &= ~(GPIO_PUPDR_PUPDR4 | GPIO_PUPDR_PUPDR5); // reset PUPDR on leg 0 GPIOA->PUPDR |= (GPIO_PUPDR_PUPDR4_1 | GPIO_PUPDR_PUPDR5_1); // PDR on leg 0 // PC12, PA15 - OUTPUT GPIOC->MODER &= ~(GPIO_MODER_MODER12); // reset on legs 12,15 GPIOC->MODER |= (GPIO_MODER_MODER12_0); // 1 on 0st bit on legs 12,15 GPIOA->MODER &= ~(GPIO_MODER_MODER15); // reset on legs 12,15 GPIOA->MODER |= (GPIO_MODER_MODER15_0); // 1 on 0st bit on legs 12,15 } /*static volatile uint8_t led0=0; static volatile uint8_t led1=0; static volatile uint8_t led2=0; static volatile uint8_t led3=0;*/ static volatile uint8_t bounce_counter[4] = {0}; static volatile uint8_t led_state[4] = {0,0,0,0}; static volatile uint8_t button_state[4] = {0}; //volatile uint8_t button_steady_state[4] = {0}; //static volatile uint8_t button_time[4] = {0}; static volatile uint8_t key_num=0; void Debouncing (void) { for (key_num = 0; key_num < 4; key_num++) { if (button_state[key_num]/*&&(bounce_counter[key_num]<=BOUNCE_TIME)*/) { bounce_counter[key_num]++; } else bounce_counter[key_num]=0; //prev_button_state[key_num] = button_state[key_num]; if (bounce_counter[key_num] == BOUNCE_TIME) { button_steady_state[key_num] = 1;//!button_steady_state[key_num]; led_state[key_num] = !led_state[key_num]; } else { button_steady_state[key_num] = 0; //bounce_counter[key_num]=0; } } } void CheckButtons(void) { CheckButtons12(); //__NOP(); __NOP(); CheckButtons15(); } void CheckButtons12 (void) { GPIOC->BSRR = GPIO_BSRR_BS_12; button_state[0] = (GPIOA->IDR)&GPIO_IDR_5; button_state[2] = (GPIOA->IDR)&GPIO_IDR_4; GPIOC->BSRR = GPIO_BSRR_BR_12; } void CheckButtons15 (void) { GPIOA->BSRR = GPIO_BSRR_BS_15; button_state[1] = (GPIOA->IDR)&GPIO_IDR_4; button_state[3] = (GPIOA->IDR)&GPIO_IDR_5; GPIOA->BSRR = GPIO_BSRR_BR_15; } void LightLeds (void) { /* for (led_num = 0; led_num < 4; led_num++) { if (button_steady_state[led_num]) { led_state[led_num] = !led_state[led_num]; } }*/ GPIOC->BSRR = led_state[0] ? GPIO_BSRR_BS_8 : GPIO_BSRR_BR_8; GPIOC->BSRR = led_state[1] ? GPIO_BSRR_BS_6 : GPIO_BSRR_BR_6; GPIOC->BSRR = led_state[2] ? GPIO_BSRR_BS_9 : GPIO_BSRR_BR_9; GPIOC->BSRR = led_state[3] ? GPIO_BSRR_BS_7 : GPIO_BSRR_BR_7; } /* void OLD__CheckButtons (void) { //GPIOC->ODR &= ~(GPIO_ODR_6 | GPIO_ODR_7 | GPIO_ODR_8 | GPIO_ODR_9);//light off GPIOC->ODR |= GPIO_ODR_12; if ((GPIOA->IDR)&GPIO_IDR_5)// 1 button { if(led0) led0 =0; else led0 =1; //counter = 0; //GPIOC->ODR |= GPIO_ODR_8; //REWRITE WITH BSRR } if ((GPIOA->IDR)&GPIO_IDR_4)// 2 button { if(led2) led2 =0; else led2 =1; //counter = 2; //GPIOC->ODR |= GPIO_ODR_9; } GPIOC->ODR &= ~GPIO_ODR_12; // add SLEEP GPIOA->ODR |= GPIO_ODR_15; if ((GPIOA->IDR)&GPIO_IDR_4)// 3 button { if(led1) led1 =0; else led1 =1; //counter = 1; //GPIOC->ODR |= GPIO_ODR_6; } if ((GPIOA->IDR)&GPIO_IDR_5)// 4 button { if(led3) led3 =0; else led3 =1; //counter = 3; //GPIOC->ODR |= GPIO_ODR_7; } GPIOA->ODR &= ~GPIO_ODR_15; } void OLD__SpinLights (void) { if (led1) GPIOC->BSRR = GPIO_BSRR_BS_6; else GPIOC->BSRR = GPIO_BSRR_BR_6; if (led2) GPIOC->BSRR = GPIO_BSRR_BS_9; else GPIOC->BSRR = GPIO_BSRR_BR_9; if (led3) GPIOC->BSRR = GPIO_BSRR_BS_7; else GPIOC->BSRR = GPIO_BSRR_BR_7; if (led0) GPIOC->BSRR = GPIO_BSRR_BS_8; else GPIOC->BSRR = GPIO_BSRR_BR_8; // if (counter==1) { GPIOC->BSRR = GPIO_BSRR_BS_6; //GPIOC->ODR |= GPIO_ODR_6; //LIGHT ON LEG 6 red -1 } else if(counter==2) { GPIOC->BSRR = GPIO_BSRR_BS_9; //GPIOC->ODR |= GPIO_ODR_9; //LIGHT ON LEG 9 green - 2 } else if(counter==3) { GPIOC->BSRR = GPIO_BSRR_BS_7; //GPIOC->ODR |= GPIO_ODR_7; //LIGHT ON LEG 7 blue -3 } else if(counter==0) { GPIOC->BSRR = GPIO_BSRR_BS_8; //GPIOC->ODR |= GPIO_ODR_8; //LIGHT ON LEG 8 orange -4 }// }*/