diff --git a/Projects/epwm_test_biss_c_cpu2/src/buttons.c b/Projects/epwm_test_biss_c_cpu2/src/buttons.c index 5fe8595..36c9cc0 100644 --- a/Projects/epwm_test_biss_c_cpu2/src/buttons.c +++ b/Projects/epwm_test_biss_c_cpu2/src/buttons.c @@ -1,7 +1,7 @@ /* * buttons.c * - * Created on: 15 ���. 2024 �. + * Created on: 15 авг. 2024 г. * Author: sedov */ @@ -13,7 +13,7 @@ #include "pwm_init.h" #include "i2c_oled.h" #define MAX_SCREENS 5; -//button 0 - ������ 1-����� 2-���� 3-���� 4- ���� +//button 0 - ничего 1-вверх 2-вниз 3-пуск 4- стоп uint16_t Button_Sost = 0; volatile uint16_t buttonClik=0, ScreenSost=0, button=0 ; extern uint16_t I2C_TXdata[]; @@ -26,10 +26,10 @@ typedef enum { MENU_TEMP, MENU_BRIGHT_FUTURE, MENU_DIAKONT, - MENU_ITEMS_COUNT // ���������� ������� ���� + MENU_ITEMS_COUNT // Количество пунктов меню } MenuItem; -// ���������� ���������� ��� �������� �������� ������ ���� +// Глобальная переменная для хранения текущего пункта меню MenuItem currentMenuItem = MENU_START; __interrupt void buttonclik_isr(void) @@ -40,8 +40,8 @@ __interrupt void buttonclik_isr(void) } int buttonsRead(){ int err1,err2; - err1=I2CWrite(0x25, 0, 0, false, &Button_Sost); // ����� ������� ������ ������ ���� ������ - err2=I2CRead(0x25, 1, true, &Button_Sost); // ������ ��������� ����� + err1=I2CWrite(0x25, 0, 0, false, &Button_Sost); // Перед чтением всегда должна быть запись + err2=I2CRead(0x25, 1, true, &Button_Sost); // Читаем состояние порта if(err1 != 0 || err2 != 0){ return 1; }else{ @@ -53,13 +53,13 @@ void buttonsInit(void) { uint16_t Conf0 = 0xFE; uint16_t Conf1 = 0xFF; - I2CWrite(0x25, 6, 1, true, &Conf1); // ���������������� ������ �� ���� + I2CWrite(0x25, 6, 1, true, &Conf1); // Конфигурирование кнопок на вход I2CWrite(0x25, 7, 1, true, &Conf1); - I2CWrite(0x25, 0, 0, false, &Button_Sost); // ����� ������� ������ ������ ���� ������ - I2CRead(0x25, 1, true, &Button_Sost); // ������ ��������� ����� + I2CWrite(0x25, 0, 0, false, &Button_Sost); // Перед чтением всегда должна быть запись + I2CRead(0x25, 1, true, &Button_Sost); // Читаем состояние порта - // ��������� ���������� XINT3 + // Настройка прерывания XINT3 EALLOW; PieVectTable.XINT3_INT = &buttonclik_isr; IER |= M_INT12; @@ -73,37 +73,37 @@ void buttonsInit(void) { int buttonsDisp(){ if(buttonClik!=0){ - //������ ��������� ������ + //читаем состояние кнопок if(buttonsRead()){ - //��������� ������ ������ + //обработка ошибки чтения return 1; } Button_Sost=Button_Sost&0xF; switch(Button_Sost){ case 0xD: if(button < 0XFF) - button+=0XFF;//���� + button+=0XFF;//ПУСК break; case 0xB: if(button >= 0XFF) - button-=0XFF;//���� + button-=0XFF;//СТОП break; case 0xE: if(button < 0XFF){ - button++;//���� + button++;//ВЕРХ if(button>MENU_ITEMS_COUNT-1){ button=0; }} break; case 0x7: if(button < 0XFF) - button--;//���� + button--;//ВЕРХ if(button==0xFFFF){ button=MENU_ITEMS_COUNT-1; } break; -// default: - //��������� ������ ������ + default: + //несколько кнопок нажали } SSD1306_Fill(SSD1306_COLOR_BLACK); Button_Sost=0; @@ -208,24 +208,24 @@ void MenuDisp(){ void MenuBilder(void) { uint16_t i,yPos; char tempStr[5]; - uint16_t topItem = currentMenuItem; // ������� ������� ����� + uint16_t topItem = currentMenuItem; // Верхний видимый пункт if (topItem > 2) { topItem = currentMenuItem - 2; } - // ������� ����� + // Очищаем экран SSD1306_Fill(SSD1306_COLOR_BLACK); - // ��������� ��������� + // Отрисовка заголовка SSD1306_DrawFilledRectangle(0, 0, 128, 10, SSD1306_COLOR_WHITE); SSD1306_GotoXY(30, 1); SSD1306_Puts("START MENU", &Font_7x10, SSD1306_COLOR_BLACK); - // ��������� ������� ���� + // Отрисовка пунктов меню for ( i = 0; i < 4 && (topItem + i) < MENU_ITEMS_COUNT; i++) { - yPos = 13 + i*13; // ������������ ������� ������ + yPos = 13 + i*13; // Вертикальная позиция пункта - // ��������� ���������� ������ + // Выделение выбранного пункта if (topItem + i == currentMenuItem) { SSD1306_DrawFilledRectangle(0, yPos, 128, 13, SSD1306_COLOR_WHITE); } else { @@ -234,19 +234,19 @@ void MenuBilder(void) { if(yPos==52){ yPos-=2; } - // ����� ������ ������ + // Вывод номера пункта SSD1306_GotoXY(5, yPos + 3); - // ���������� sprintf ��� �������������� ����� � ������ - // �������������� ����� � ������ "�������" + // Используем sprintf для преобразования числа в строку + // Преобразование числа в строку "вручную" uint8_t num = topItem + i + 1; - tempStr[0] = '0' + (num / 10); // ������� - tempStr[1] = '0' + (num % 10); // ������� - tempStr[2] = '\0'; // ����-���������� + tempStr[0] = '0' + (num / 10); // Десятки + tempStr[1] = '0' + (num % 10); // Единицы + tempStr[2] = '\0'; // Нуль-терминатор if (topItem + i == currentMenuItem) { SSD1306_Puts(tempStr, &Font_7x10, SSD1306_COLOR_BLACK); }else SSD1306_Puts(tempStr, &Font_7x10, SSD1306_COLOR_WHITE); - SSD1306_GotoXY(20, yPos + 3); // ����� ��� �������� ������ + SSD1306_GotoXY(20, yPos + 3); // Сдвиг для названия пункта switch (topItem + i) { case MENU_START: @@ -271,3 +271,4 @@ void MenuBilder(void) { } } } + diff --git a/Projects/epwm_test_biss_c_cpu2/src/frmmstr_run.c b/Projects/epwm_test_biss_c_cpu2/src/frmmstr_run.c index d94a211..92e3070 100644 --- a/Projects/epwm_test_biss_c_cpu2/src/frmmstr_run.c +++ b/Projects/epwm_test_biss_c_cpu2/src/frmmstr_run.c @@ -80,8 +80,8 @@ static uint16_t diod = 0; fault_read_clr(); fault_read_ports(); }else{ -// buttonsDisp(); -// ScreenDisp(); + buttonsDisp(); + ScreenDisp(); } } diff --git a/Projects/epwm_test_biss_c_cpu2/src/i2c_oled.c b/Projects/epwm_test_biss_c_cpu2/src/i2c_oled.c index 832680b..f955f98 100644 --- a/Projects/epwm_test_biss_c_cpu2/src/i2c_oled.c +++ b/Projects/epwm_test_biss_c_cpu2/src/i2c_oled.c @@ -97,15 +97,15 @@ uint8_t SSD1306_Init(void) { void SSD1306_setPosition(uint8_t column, uint8_t page) { if (column > SSD1306_WIDTH - 1) { - column = 0; // + column = 0; // Ограничение столбца } if (page > 7) { - page = 0; // + page = 0; // Ограничение страницы } - SSD1306_WRITECOMMAND(0x20+column); // - SSD1306_WRITECOMMAND(SSD1306_PAGEADDR+page); // - // SSD1306_WRITECOMMAND(7); // + SSD1306_WRITECOMMAND(0x20+column); // Начальный адрес столбца + SSD1306_WRITECOMMAND(SSD1306_PAGEADDR+page); // Начальный адрес страницы + // SSD1306_WRITECOMMAND(7); // Конечный адрес страницы } @@ -118,9 +118,9 @@ void SSD1306_UpdateScreen(void) { SSD1306_WRITECOMMAND(0x10); SSD1306_WRITECOMMAND(0x00); for (column = 0; column < SSD1306_WIDTH; column++) { // - SSD1306_setPosition(column, page); // - 0, - m - // - I2C_TXdata[0] = 0x40; // : + SSD1306_setPosition(column, page); // Начало столбца - 0, страница - m + // Запись данных в буфер дисплея + I2C_TXdata[0] = 0x40; // Байт управления: данные for ( i = 0; i < SSD1306_WIDTH; i++) { I2C_TXdata[i + 1] = SSD1306_Buffer[SSD1306_WIDTH*page + i]; } @@ -130,7 +130,7 @@ void SSD1306_UpdateScreen(void) { } } -void SSD1306_UpdateScreenFAST(void) { +void SSD1306_UpdateScreenAFAST(void) { uint8_t page; uint8_t column; @@ -140,12 +140,12 @@ void SSD1306_UpdateScreen SSD1306_WRITECOMMAND(0x10); SSD1306_WRITECOMMAND(0x00); for (column = 0; column < SSD1306_WIDTH-60; column++) { // - SSD1306_setPosition(column+60, page); // - 0, - m + SSD1306_setPosition(column+60, page); // Начало столбца - 0, страница - m - // - I2C_TXdata[0] = 0x40; // : - // I2C - I2C_TXdata[0] = 0x40; // + // Запись данных в буфер дисплея + I2C_TXdata[0] = 0x40; // Байт управления: данные + // Заполнить буфер I2C данными из буфера дисплея + I2C_TXdata[0] = 0x40; // Команда записи данных I2C_TXdata[1] = SSD1306_Buffer[SSD1306_WIDTH*page + column]; I2CWriteOLED(I2C_SLAVE_ADDRESS, 2, true); } @@ -176,9 +176,9 @@ void SSD1306_DrawPixel(uint16_t x, uint16_t y, SSD1306_COLOR_t color) { color = (SSD1306_COLOR_t)!color; } - // + // Правильно вычисляем индекс байта в буфере uint16_t byteIndex = x + (y / 8) * SSD1306_WIDTH; - // + // Правильно вычисляем индекс бита в байт uint8_t bitIndex = y % 8; if (color == SSD1306_COLOR_WHITE) { @@ -251,19 +251,19 @@ char SSD1306_Putc(char ch, FontDef_t* Font, SSD1306_COLOR_t color) { return ch; } void reverseString(char *str) { - if (str == NULL) { // NULL + if (str == NULL) { // Проверка на NULL указатель return; } - char *end = str; // + char *end = str; // Указатель на конец строки while (*end) { end++; } - end--; // + end--; // Перемещаем указатель на последний символ строки char temp; while (str < end) { - temp = *str; // + temp = *str; // Меняем местами символы *str = *end; *end = temp; @@ -660,11 +660,11 @@ char* ulongToStr(unsigned long num, char* buffer) { unsigned long startnum=num; if (num == 0) { *buffer++ = '0'; - *buffer++ = '0'; // - + *buffer++ = '0'; // Добавляем нуль-терминатор return buffer; } - char temp[10]; // + char temp[10]; // Буфер для временного хранения цифр int i = 0; while (num > 0) { @@ -674,30 +674,30 @@ char* ulongToStr(unsigned long num, char* buffer) { if(startnum<=9){ *buffer++ = '0'; } - // + // Копируем цифры в обратном порядке в основной буфер while (i > 0) { *buffer++ = temp[--i]; } - *buffer = '\0'; // - + *buffer = '\0'; // Добавляем нуль-терминатор return buffer; } -// -// true, , false +// Функция для отображения времени с момента запуска +// Возвращает true, если время было обновлено, иначе false bool displayUptime(void) { - static unsigned long lastDisplayedTime = 0; // + static unsigned long lastDisplayedTime = 0; // Последнее отображённое время - // , + // Проверяем, нужно ли обновлять дисплей if (uptimeSeconds == lastDisplayedTime) { - return false; // + return false; // Время не изменилось } - // , + // Время изменилось, обновляем дисплей unsigned long hours = uptimeSeconds / 3600; unsigned int minutes = (uptimeSeconds % 3600) / 60; unsigned int seconds = uptimeSeconds % 60; - // + // Формируем строку времени char timeStr[16] = "UP "; char *ptr = timeStr + 3; ptr = ulongToStr(hours, ptr); @@ -710,19 +710,19 @@ bool displayUptime(void) { SSD1306_Puts(timeStr, &Font_7x10, SSD1306_COLOR_WHITE); } - // + // Запоминаем последнее отображённое время lastDisplayedTime = uptimeSeconds; SSD1306_UpdateScreen(); - return true; // + return true; // Время было обновлено } void displayTemp(void) { static int OldeqepTemperature = 0; uint16_t temp, eqepTemperature = geteqepTemperature(); temp= eqepTemperature; char temp_str[11]; - //int seconds = 30; // + //int seconds = 30; // Пример значения секунд - // 6 + // Заполняем первые 6 символов вручную temp_str[0] = 'T'; temp_str[1] = 'E'; temp_str[2] = 'M'; @@ -735,19 +735,19 @@ void displayTemp(void) { temp_str[9] = ' '; temp_str[10] = ' '; - // 2 for - // - // + // Заполняем последние 2 символа секундами через цикл for + // Преобразуем сотни + // Флаг для отслеживания вывода цифр int i=5; bool startedOutput = false; - // + // Преобразование сотен if (temp >= 100 || startedOutput) { temp_str[i] = (temp / 100) + '0'; i++; startedOutput = true; } temp %= 100; - // + // Преобразование десятков if (temp >= 10 || startedOutput) { temp_str[i] = (temp / 10) + '0'; startedOutput = true; @@ -756,7 +756,7 @@ void displayTemp(void) { temp_str[i] = temp%10 + '0'; i++; - // + // Отображаем температуру SSD1306_Puts(temp_str, &Font_11x18, SSD1306_COLOR_WHITE); OldeqepTemperature = eqepTemperature; diff --git a/Projects/epwm_test_biss_c_cpu2/src/i2c_oled.h b/Projects/epwm_test_biss_c_cpu2/src/i2c_oled.h index 4d36d4f..aaa5479 100644 --- a/Projects/epwm_test_biss_c_cpu2/src/i2c_oled.h +++ b/Projects/epwm_test_biss_c_cpu2/src/i2c_oled.h @@ -3,7 +3,7 @@ // // Defines // -typedef unsigned char uint8_t; +//typedef unsigned char uint8_t; #define I2C_SLAVE_ADDRESS 0x3C #define MAX_BUFFER_SIZE 0x10 @@ -16,7 +16,7 @@ typedef unsigned char uint8_t; #define GPIO_PIN_SCLA 1 // GPIO number for I2C SCLA -// OLED- +// Макрос для отправки команды на OLED-дисплей #define SSD1306_WRITECOMMAND(cmd) \ do { \ I2C_TXdata[0] = 0x00; \ @@ -44,3 +44,5 @@ typedef enum { } SSD1306_COLOR_t; + +void SSD1306_UpdateScreen(void); diff --git a/Projects/epwm_test_biss_c_cpu2/src/init_perif.c b/Projects/epwm_test_biss_c_cpu2/src/init_perif.c index e972757..bde9833 100644 --- a/Projects/epwm_test_biss_c_cpu2/src/init_perif.c +++ b/Projects/epwm_test_biss_c_cpu2/src/init_perif.c @@ -34,7 +34,7 @@ struct CPUTIMER_VARS CpuTimer0; struct CPUTIMER_VARS CpuTimer1; struct CPUTIMER_VARS CpuTimer2; -unsigned long uptimeSeconds = 0; // +unsigned long uptimeSeconds = 0; // Глобальная переменная для часов __interrupt void cpuTimer0ISR(void) {