Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
0 / 0 / 2
Регистрация: 24.04.2018
Сообщений: 61

Stm32 max7219 SPI

25.03.2019, 17:59. Показов 3873. Ответов 12

Студворк — интернет-сервис помощи студентам
День добрый! Никак не могу настроить работу МК для управления 7 сегментным индикатором.
Вроде все настроил, но индикация молчит.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/**
 ******************************************************************************
 * @file    main.c
 * @author  Ac6
 * @version V1.0
 * @date    01-December-2013
 * @brief   Default main function.
 ******************************************************************************
 */
 
#include "stm32f30x.h"
#include "stm32f30x_gpio.h"
#include "stm32f30x_rcc.h"
#include "stm32f30x_spi.h"
 
#define SCK_Pin  GPIO_Pin_10
#define SCK_Pin_Port GPIOC
 
#define MOSI_Pin GPIO_Pin_12
#define MOSI_Pin_Port GPIOC
 
#define SS_Pin  GPIO_Pin_2
#define SS_Pin_Port GPIOD
 
#define cs_set() SS_Pin_Port->BRR = SS_Pin;
#define cs_reset() SS_Pin_Port->BSRR = SS_Pin;
 
//OPTIONS
#define SCANLIMIT 7
#define INTENSITY_HIGH 12
#define INTENSITY_MED 7
#define INTENSITY_LOW 3
#define DP 0x80
#define MINUS 0x0a
#define BLANK 0x0f
#define DECODEMODE 0xff
 
//OPCODES
#define OP_NOOP   0
#define OP_DIGIT0 1
#define OP_DIGIT1 2
#define OP_DIGIT2 3
#define OP_DIGIT3 4
#define OP_DIGIT4 5
#define OP_DIGIT5 6
#define OP_DIGIT6 7
#define OP_DIGIT7 8
#define OP_DECODEMODE  9
#define OP_INTENSITY   10
#define OP_SCANLIMIT   11
#define OP_SHUTDOWN    12
#define OP_DISPLAYTEST 15
 
void SPISend(uint8_t addr, uint8_t data) {
    cs_set()
    ;
    SPI_I2S_SendData16(SPI3, (((uint16_t) addr << 8) + data));
    cs_reset()
    ;
 
}
 
void SPIInit(void) {
 
    SPI_InitTypeDef SPIConf;
    SPIConf.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    SPIConf.SPI_Mode = SPI_Mode_Master;
    SPIConf.SPI_DataSize = SPI_DataSize_8b;
    SPIConf.SPI_CRCPolynomial = 7;
    SPIConf.SPI_CPOL = SPI_CPOL_Low;
    SPIConf.SPI_CPHA = SPI_CPHA_1Edge;
    SPIConf.SPI_NSS = SPI_NSS_Soft;
    SPIConf.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
    SPIConf.SPI_FirstBit = SPI_FirstBit_MSB;
    SPI_Init(SPI3, &SPIConf);
    SPI_Cmd(SPI3, ENABLE);
}
 
void GPIOInit(void) {
    RCC_AHBPeriphClockCmd(
    RCC_AHBPeriph_GPIOC | RCC_AHBPeriph_GPIOD | RCC_APB1ENR_SPI3EN, ENABLE);
    GPIO_InitTypeDef PORT;
 
    PORT.GPIO_Pin = GPIO_Pin_10 ;
    PORT.GPIO_Speed = GPIO_Speed_2MHz;
    PORT.GPIO_Mode = GPIO_Mode_AF;
    GPIO_Init(GPIOC, &PORT);
 
    PORT.GPIO_Pin = GPIO_Pin_12;
    PORT.GPIO_Speed = GPIO_Speed_2MHz;
    PORT.GPIO_Mode = GPIO_Mode_AF;
    GPIO_Init(GPIOC, &PORT);
 
    PORT.GPIO_Pin = GPIO_Pin_2;
    PORT.GPIO_Speed = GPIO_Speed_2MHz;
    PORT.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_Init(GPIOD, &PORT);
}
 
int main() {
    SystemInit();
    GPIOInit();
    SPIInit();
    for (;;) {
        SPISend(OP_DISPLAYTEST, 0);
        SPISend(OP_SHUTDOWN, 1);
        SPISend(OP_INTENSITY, INTENSITY_LOW);
        SPISend(OP_SCANLIMIT, SCANLIMIT);
        SPISend(OP_DECODEMODE, DECODEMODE);
        SPISend(OP_DIGIT0, 7 + DP);
        SPISend(OP_DIGIT1, 6);
        SPISend(OP_DIGIT2, 5 + DP);
        SPISend(OP_DIGIT3, 4);
        SPISend(OP_DIGIT4, 3 + DP);
        SPISend(OP_DIGIT5, 2);
        SPISend(OP_DIGIT6, 1 + DP);
        SPISend(OP_DIGIT7, 0);
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.03.2019, 17:59
Ответы с готовыми решениями:

stm32f103c8t6 spi max7219
Приветствую! При подключении микрухи MAX7219 столкнулся с проблемой, что она некорректно реагирует на отсылаемые ей данные. Я уже...

stm32f103c8t6 spi max7219
Приветствую всем. Долгое время не могу решить проблему касательно связки MAX7219 и stm32 Помогите, пожалуйста, решить проблему.. ...

STM32 MAX7219
Приветствую. Пытаюсь подключить светодиодную матрицу 8 на 8 через микросхемку MAX7219. В результате выполнения программы вместе с нужными...

12
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
25.03.2019, 20:34
Schweigert,
неплохо бы было ждать флага освобождения буффера
C
1
2
3
4
5
6
7
void SPISend(uint8_t addr, uint8_t data) {
    cs_set();
    while (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == RESET);
    SPI_I2S_SendData16(SPI3, (((uint16_t) addr << 8) + data));
    while (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BUSY) == SET);
    cs_reset() ;
}
Во вторых вы пытаетесь отправлять по 16 байт а режим выбрали 8 битный
C
1
    SPIConf.SPI_DataSize = SPI_DataSize_8b;
В третьих вы используете режим фул дуплекс, а по факту ногу MISO не инициализируете, используйте тогда Transmit Only
0
0 / 0 / 2
Регистрация: 24.04.2018
Сообщений: 61
26.03.2019, 18:05  [ТС]
Не смотря на то , что все исправил, результат тот же! Хотя через CubeMX и библиотеку HAL все у меня работало. Но я хочу реализовать все тоже самое, но используя стандартные библиотеки!
0
1 / 1 / 1
Регистрация: 22.12.2009
Сообщений: 42
26.03.2019, 18:31
обычно ЧипСелект сигнал инвертированный, т.е. он должен быть постоянно в "1", перед посылкой должен опускаться в "0", по окончанию -- опять в "1", т.е. сначала cs_reset() а потом cs_set();

может в этом проблемы?
0
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
26.03.2019, 19:53
Schweigert, так у вас еще и модуль SPI не затактирован
C
1
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC | RCC_AHBPeriph_GPIOD | RCC_APB1ENR_SPI3EN, ENABLE);
SPI на шине APB1 сидит, а вы его в шину AHB пихаете
C
1
2
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC | RCC_AHBPeriph_GPIOD, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);
0
0 / 0 / 2
Регистрация: 24.04.2018
Сообщений: 61
26.03.2019, 22:36  [ТС]
хм, не смотря на то , что я все сделал , ничкего не помогло!
Я только недавно взялся за программирование МК и обидно , что элементарные вещи не выходят! Хотя задача вроде тривиальная, подключить 7 сегментный индикатор!

Добавлено через 28 минут
Код выглядет так теперь, но все равно нет никакой реакции


C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/**
 ******************************************************************************
 * @file    main.c
 * @author  Ac6
 * @version V1.0
 * @date    01-December-2013
 * @brief   Default main function.
 ******************************************************************************
 */
 
#include "stm32f30x.h"
#include "stm32f30x_gpio.h"
#include "stm32f30x_rcc.h"
#include "stm32f30x_spi.h"
 
#define SCK_Pin  GPIO_Pin_10
#define SCK_Pin_Port GPIOC
 
#define MOSI_Pin GPIO_Pin_12
#define MOSI_Pin_Port GPIOC
 
#define SS_Pin  GPIO_Pin_2
#define SS_Pin_Port GPIOD
 
#define cs_set() SS_Pin_Port->BRR = SS_Pin;
#define cs_reset() SS_Pin_Port->BSRR = SS_Pin;
 
//OPTIONS
#define SCANLIMIT 7
#define INTENSITY_HIGH 12
#define INTENSITY_MED 7
#define INTENSITY_LOW 3
#define DP 0x80
#define MINUS 0x0a
#define BLANK 0x0f
#define DECODEMODE 0xff
 
//OPCODES
#define OP_NOOP   0
#define OP_DIGIT0 1
#define OP_DIGIT1 2
#define OP_DIGIT2 3
#define OP_DIGIT3 4
#define OP_DIGIT4 5
#define OP_DIGIT5 6
#define OP_DIGIT6 7
#define OP_DIGIT7 8
#define OP_DECODEMODE  9
#define OP_INTENSITY   10
#define OP_SCANLIMIT   11
#define OP_SHUTDOWN    12
#define OP_DISPLAYTEST 15
 
void SPISend(uint8_t addr, uint8_t data) {
    cs_set();
    while (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == RESET);
    SPI_I2S_SendData16(SPI3, (((uint16_t) addr << 8) + data));
    while (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY) == SET);
    cs_reset() ;
}
 
void SPIInit(void) {
 
 
    SPI_InitTypeDef SPIConf;
    SPIConf.SPI_Direction = SPI_Direction_1Line_Tx ;
    SPIConf.SPI_Mode = SPI_Mode_Master;
    SPIConf.SPI_DataSize = SPI_DataSize_16b;
    SPIConf.SPI_CRCPolynomial = 7;
    SPIConf.SPI_CPOL = SPI_CPOL_Low;
    SPIConf.SPI_CPHA = SPI_CPHA_1Edge;
    SPIConf.SPI_NSS = SPI_NSS_Soft;
    SPIConf.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
    SPIConf.SPI_FirstBit = SPI_FirstBit_MSB;
    SPI_Init(SPI3, &SPIConf);
    SPI_Cmd(SPI3, ENABLE);
}
 
void GPIOInit(void) {
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC | RCC_AHBPeriph_GPIOD, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);
    GPIO_InitTypeDef PORT;
 
    PORT.GPIO_Pin = GPIO_Pin_10; // SCK
    PORT.GPIO_Speed = GPIO_Speed_Level_3;
    PORT.GPIO_Mode = GPIO_Mode_AF;
    GPIO_Init(GPIOC, &PORT);
 
    PORT.GPIO_Pin = GPIO_Pin_12; // MOSI
    PORT.GPIO_Speed = GPIO_Speed_Level_3;
    PORT.GPIO_Mode = GPIO_Mode_AF;
    GPIO_Init(GPIOC, &PORT);
 
    PORT.GPIO_Pin = GPIO_Pin_2; // SS
    PORT.GPIO_Speed = GPIO_Speed_Level_3;
    PORT.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_Init(GPIOD, &PORT);
}
 
void SysTick_Init(void) {
    /****************************************
     *SystemFrequency/1000      1ms         *
     *SystemFrequency/100000    10us        *
     *SystemFrequency/1000000   1us         *
     *****************************************/
    while (SysTick_Config(SystemCoreClock / 1000000) != 0) {
    } // One SysTick interrupt now equals 1us
 
}
 
int main() {
 
 
    SystemInit();
    GPIOInit();
    SPIInit();
 
    for (;;) {
        SPISend(OP_DISPLAYTEST, 0);
        SPISend(OP_SHUTDOWN, 1);
 
        SPISend(OP_DECODEMODE, DECODEMODE);
        SPISend(OP_DIGIT0, 7 + DP);
        SPISend(OP_DIGIT1, 6);
        SPISend(OP_DIGIT2, 5 + DP);
        SPISend(OP_DIGIT3, 4);
        SPISend(OP_DIGIT4, 3 + DP);
        SPISend(OP_DIGIT5, 2);
        SPISend(OP_DIGIT6, 1 + DP);
        SPISend(OP_DIGIT7, 0);
    }
}
Добавлено через 29 минут
немного поменял функцию отправки. Ждём пока опустошится Tx буфер затем только Чипселект. После данной правки, все сегменты зажглись , но на этом и все!
C
1
2
3
4
5
6
7
8
void SPISend(uint8_t addr, uint8_t data) {
 
    while (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == RESET);
    cs_set();
    SPI_I2S_SendData16(SPI3, (((uint16_t) addr << 8) + data));
    while (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY) == SET);
    cs_reset() ;
}
0
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
27.03.2019, 09:09
Schweigert, А если отладчиком пройтись по строчкам?
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,856
27.03.2019, 09:53
Цитата Сообщение от Schweigert Посмотреть сообщение
max7219
взято отсюда https://pro-diod.ru/electronic... kacii.html

MAX7219 и MAX7221 отличаются только интерфейсом. У MAX7219 интерфейс Serial 3-Wire, у MAX7221 — Serial SPI.
что такое Serial 3-Wire я не знаю(пока), но почему вы все управление используете SPI?
0
0 / 0 / 2
Регистрация: 24.04.2018
Сообщений: 61
27.03.2019, 12:46  [ТС]
Serial 3-Wire это по сути и есть SPI прочитанно тут: https://www.microchip.com/forums/m202051.aspx

Вот мой проект созданный CubeMX и использована библиотека HAL. Небольшая игра. Все работает как нужно.
Вложения
Тип файла: zip Game_MAX7219_SPI.zip (6.82 Мб, 21 просмотров)
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,856
27.03.2019, 15:01
Цитата Сообщение от Schweigert Посмотреть сообщение
Serial 3-Wire это по сути и есть SPI
по сути может и да, а вот в частности???
например скорость, начальная установка, какой бит идет в начале, по какому фронту считываются данные?
serial 3-wire interface standard defined by National Semiconductor. The MICROWIRE protocol is essentially a subset of the SPI interface, CPOL = 0 and CPHA = 0.
вот это вот соответствует
Цитата Сообщение от Schweigert Посмотреть сообщение
SPIConf.SPI_CPOL = SPI_CPOL_Low;
SPIConf.SPI_CPHA = SPI_CPHA_1Edge;
я не знаю
Цитата Сообщение от Schweigert Посмотреть сообщение
Вот мой проект созданный CubeMX
смотрим инициализацию
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
static void MX_SPI3_Init(void) {
 
    /* SPI3 parameter configuration*/
    hspi3.Instance = SPI3;
    hspi3.Init.Mode = SPI_MODE_MASTER;
    hspi3.Init.Direction = SPI_DIRECTION_2LINES;
    hspi3.Init.DataSize = SPI_DATASIZE_8BIT;
    hspi3.Init.CLKPolarity = SPI_POLARITY_LOW;
    hspi3.Init.CLKPhase = SPI_PHASE_1EDGE;
    hspi3.Init.NSS = SPI_NSS_SOFT;
    hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
    hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB;
    hspi3.Init.TIMode = SPI_TIMODE_DISABLE;
    hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
    hspi3.Init.CRCPolynomial = 7;
    hspi3.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
    hspi3.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
    if (HAL_SPI_Init(&hspi3) != HAL_OK) {
        _Error_Handler(__FILE__, __LINE__);
    }
 
}
и
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void SPIInit(void) {
 
 
    SPI_InitTypeDef SPIConf;
    SPIConf.SPI_Direction = SPI_Direction_1Line_Tx ;
    SPIConf.SPI_Mode = SPI_Mode_Master;
    SPIConf.SPI_DataSize = SPI_DataSize_16b;
    SPIConf.SPI_CRCPolynomial = 7;
    SPIConf.SPI_CPOL = SPI_CPOL_Low;
    SPIConf.SPI_CPHA = SPI_CPHA_1Edge;
    SPIConf.SPI_NSS = SPI_NSS_Soft;
    SPIConf.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
    SPIConf.SPI_FirstBit = SPI_FirstBit_MSB;
    SPI_Init(SPI3, &SPIConf);
    SPI_Cmd(SPI3, ENABLE);
}
и что общего? в одном (рабочем)передаем 8 бит, в другом 16
в одном 2 линии в другом одна
0
0 / 0 / 2
Регистрация: 24.04.2018
Сообщений: 61
27.03.2019, 19:42  [ТС]
Там где мы передаем 8 bit можно устроить так :
C
1
2
3
4
5
6
7
8
9
10
11
void Send_7219(uint8_t rg, uint8_t dt) {
    cs_set()
    ;
 
    aTxBuf[0] = rg;
    HAL_SPI_Transmit(&hspi3, (uint8_t*) aTxBuf, 1, 5000);
    aTxBuf[0] = dt;
    HAL_SPI_Transmit(&hspi3, (uint8_t*) aTxBuf, 1, 5000);
    cs_reset()
    ;
}
Передаем 8 бит (адрес) и тут же остальные 8 бит(данные)!

Если мы выбрали 16 бит, то передаем сразу все!

Проблема моя в том, что где то какая то мелоч не так настроена, и все, никакого результата!
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,856
27.03.2019, 20:19
Цитата Сообщение от Schweigert Посмотреть сообщение
Проблема моя в том, что где то какая то мелоч не так настроена,
включи отладчик, а в нем смотри свой SPI
сначала на проекте CUbe а потом на другом и смотри в чем различие
Цитата Сообщение от Schweigert Посмотреть сообщение
Если мы выбрали 16 бит, то передаем сразу все!
может быть в этом косяк?
настрой на 8 и попробуй
сначала нужно локализовать проблему
max7219 у меня нет, а покупать за 400 рублей, для того чтобы побаловаться, как то не хочется
0
0 / 0 / 2
Регистрация: 24.04.2018
Сообщений: 61
01.06.2019, 13:22  [ТС]
Вернулся к этому проекту и о чудо, все работает. Кому интересно вот архив с проектом!!
Вложения
Тип файла: zip STM32_MAX7219_SPI.zip (5.81 Мб, 60 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.06.2019, 13:22
Помогаю со студенческими работами здесь

STM32 + SPI
Собственно, проблема. Мой нижеприведенный код, по идее, должен изменять настройки SPI и включать его. Но когда я прохожу программу...

SPI stm32 CMSIS
Здравствуйте. Я уже создавал похожую тему но использовал HAL. Теперь появилась необходимость использования CMSIS для оптимизации прошивки....

SPI и UART на STM32
Здравствуйте! Возник следующий вопрос. Как отправить значение (в шестнадцатеричном коде) по UARTу в регистр данных SPI? Есть...

STM32 + SPI SD FATFS
Всем привет. Пробую запустить файловую систему на Micro SD картe. Микроконтроллер STM32F407. Запись в блок и чтение с него работает: ...

Зависает SPI на STM32
Всем добрый день! Подключал STM32 к разным устройствам по SPI... Проект создал в Кубе, и пользовался HAL библиотеками.. на скорости SPI...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru