/
AVLGU
/
STM32F072_Programming
Обзор
Документация
Войти
/
AVLGU
/
STM32F072_Programming
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop
leds4.c
156 строк
4 KB
AVLGU
работало Tx прерыванию, это попытка на Rx. еще не тестил
16 дек 2025, 16:42
16 дек 2025, 16:42
9fcf23c
Код
Авторство
О чём код?
#include "leds4.h" #include "SPI.h" #include "keyboard4.h" void InitLeds(void) { //PC6-PC9 LEDs RCC->AHBENR |= RCC_AHBENR_GPIOCEN; GPIOC->MODER &= ~(GPIO_MODER_MODER6 | GPIO_MODER_MODER7 | GPIO_MODER_MODER8 | GPIO_MODER_MODER9); // reset on legs 6,7,8,9 GPIOC->MODER |= (GPIO_MODER_MODER6_0 | GPIO_MODER_MODER7_0 | GPIO_MODER_MODER8_0 | GPIO_MODER_MODER9_0); // 1 on 0st bit on legs 6,7 //GPIOC->ODR |= GPIO_ODR_6; //LIGHT ON LEG 6 red -1 //GPIOC->ODR |= GPIO_ODR_7; //LIGHT ON LEG 7 blue -3 //GPIOC->ODR |= GPIO_ODR_8; //LIGHT ON LEG 6 orange -4 //GPIOC->ODR |= GPIO_ODR_9; //LIGHT ON LEG 9 green - 2 } volatile uint8_t curr_row = 0; volatile uint16_t leds_row[8] = {0}; volatile uint16_t leds_column[8] = {0}; volatile uint8_t button_steady_state[4] = {0}; static volatile uint16_t data = 0; volatile uint16_t data_column[8] = {0b00000000, 0b00100100, 0b01011010, 0b01000010, 0b00100100, 0b00011000, 0b00011000, 0b00000000}; void MovePicture(void) { uint16_t temp; // up if(button_steady_state[0] == 1) { temp = data_column[7]; for(int i = 7; i > 0; i--) { data_column[i] = data_column[i-1]; } data_column[0] = temp; } // left if(button_steady_state[3] == 1) { for(int i = 0; i < 8; i++) { temp = data_column[i] >> 7; data_column[i] = (data_column[i]&127)<< 1; data_column[i] |= temp; } } // down if(button_steady_state[2] == 1) { temp = data_column[0]; for(int i = 0; i < 7; i++) { data_column[i] = data_column[i+1]; } data_column[7] = temp; } // right if(button_steady_state[1] == 1) { for(int i = 0; i < 8; i++) { temp = (data_column[i]&1)<<7; data_column[i] >>= 1; data_column[i] |= temp;/* temp = (data_column[i] & 0x01) ? 0x80 : 0; // ???????? ?????? data_column[i] >>= 1; // ???????? ?? 8 ??? ? ????????? ??????????? ??? ? ??????? ??????? data_column[i] = (data_column[i] & 0xFF) | temp;*/ } } } void OldMovePicture(void) { uint8_t i; uint16_t temp; // check if button pressed for(i = 0; i < 4; i++) { if(button_steady_state[i] == 1) { switch(i) { case 0: // down temp = leds_row[0]; for(i = 0; i < 7; i++) { leds_row[i] = leds_row[i + 1]; } leds_row[7] = temp; break; case 3: // left temp = leds_column[0]; for(i = 0; i < 7; i++) { leds_column[i] = leds_column[i + 1]; } leds_column[7] = temp; break; case 2: // up temp = leds_row[7]; for(i = 7; i > 0; i--) { leds_row[i] = leds_row[i - 1]; } leds_row[0] = temp; break; case 1: // right temp = leds_column[7]; for(i = 7; i > 0; i--) { leds_column[i] = leds_column[i - 1]; } leds_column[0] = temp; break; } button_steady_state[i] = 0; break; } } } //for SPI old interrupt on Tx void DisplayOnScreen(void) { uint8_t row; uint16_t data_row = 1; for(row = 0; row < 8; row++) { data = ((data_row<<(7-row))<<8) | data_column[row]; // or data_row<<(7-row) | [7-row] SPI2_Transmit(data); } } //for SPI interrupt on Rx uint16_t CurrDataCalc(void) { if (curr_row<8) { uint16_t data_row = 1; data = ((data_row<<(7-curr_row))<<8) | data_column[curr_row]; } return data; }