Selaa lähdekoodia

Replace Asoled functions.

Vladimir N. Shilov 1 vuosi sitten
vanhempi
commit
6e0c719fa7
6 muutettua tiedostoa jossa 127 lisäystä ja 107 poistoa
  1. 2 2
      lib/lib.mk
  2. 1 0
      lib/st7735/st7735.h
  3. 123 103
      lib/stab/stab.c
  4. 1 2
      lib/stab/stab_param.h
  5. 0 0
      lib/stab/stab_usart.c
  6. 0 0
      lib/stab/stab_usart.h

+ 2 - 2
lib/lib.mk

@@ -4,9 +4,9 @@ USERLIB = ./lib
 # List of all the Userlib files
 USERSRC =  $(USERLIB)/st7735/st7735.c \
 	$(USERLIB)/st7735/fonts.c \
-	$(USERLIB)/st7735/arial_8_ukr.c
+	$(USERLIB)/st7735/arial_8_ukr.c \
+	$(USERLIB)/stab/stab.c
 # \
-#	$(USERLIB)/stab/stab.c \
 #	$(USERLIB)/eeprom/eeprom.c
           
 # Required include directories

+ 1 - 0
lib/st7735/st7735.h

@@ -245,6 +245,7 @@ extern "C" {
 void ST7735_Init(void);
 void ST7735_DrawPixel(uint16_t x, uint16_t y, uint16_t color);
 void ST7735_WriteString(uint16_t x, uint16_t y, const char* str, FontDef font, uint16_t color, uint16_t bgcolor);
+void ST7735_WriteStringV(uint16_t x, uint16_t y, const char* str, FontDefV font, uint16_t color, uint16_t bgcolor);
 void ST7735_FillRectangle(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t color);
 void ST7735_FillRectangleFast(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t color);
 void ST7735_FillScreen(uint16_t color);

+ 123 - 103
lib/stab/stab.c

@@ -1,7 +1,10 @@
+#include <math.h>
 #include "ch.h"
 #include "hal.h"
+#include "chprintf.h"
 #include "stab_param.h"
-//#include "usart.h"
+//#include "stab_usart.h"
+#include "st7735.h"
 
 /* Версия скетча и длина версии скетча в символах для правильного вывода на дисплей */
 #define VERSION "v0.100"
@@ -24,6 +27,7 @@ static volatile uint16_t PDMust = 0;  // PDM, соответствующий у
 static volatile uint32_t U_sum = 0;   // Среднеквадратичное в сети за секунду, умноженное на 10
 static uint16_t U_real = U_LINE;      // Среднеквадратичное за секунду (целая часть)
 static uint8_t U_real_dec = 0;        // Среднеквадратичное за секунду (дробная часть)
+static char buf[24];                  // common string buffer for chsnprintf()
 
 static volatile uint8_t PID_ust = LINE_FREQ; // Данные для установки регистра сравнения таймера2
 
@@ -47,7 +51,9 @@ static volatile struct flags {  // Флаги
   unsigned  razg_off : 1;     // Флаг останова режима "разгон"
   unsigned  stab_off : 1;     // Флаг аварийного останова стабилизатора
   unsigned  butt : 1;         // Флаг опроса кнопок
+#ifdef USE_EEPROM
   unsigned  writable : 1;     // Флаг записи уставок в EEPROM
+#endif
 #ifdef USE_USART  
   unsigned  uartUnhold : 1;   // Флаг разрешения передачи данных по USART
   unsigned  uartReport : 1;   // Флаг разрешения отправки данных внешнему контроллеру
@@ -74,11 +80,9 @@ static uint8_t cnt_PDMcount;    // Счетчик для перебора уст
 static uint8_t cnt_menuWDT;     // Счетчик секунд для организации отсчета ожидания выхода из меню
 static uint8_t cnt_dspMenu;     // Индикатор режима меню
 
-static uint8_t X_position (const uint8_t x, const uint16_t arg = 0, const uint8_t pix = 6); // Функция возвращает начальную позицию по Х для десятичного числа, в зависимости от количества знаков в нём.
-static uint8_t X_centred (const uint8_t len); // Функция возвращает начальную позицию по Х для текста длинной len знаков, для размещения оного по центру дисплея.
-static uint8_t A_to_HEX (const char a); // Функция переводит символ ASCII в шестнадцатиричную цифру
-static char HEX_to_A (const uint8_t x); // Функция переводит шестнадцатиричную цифру в символ ASCII
-static uint16_t calc_proportion(const uint16_t multiplier1, const uint16_t multiplier2 = Pnom, const uint32_t divider = CICLE);
+static uint8_t X_position(const uint8_t x, const uint16_t arg, const uint8_t pix); // Функция возвращает начальную позицию по Х для десятичного числа, в зависимости от количества знаков в нём.
+static uint8_t X_centred(const uint8_t len); // Функция возвращает начальную позицию по Х для текста длинной len знаков, для размещения оного по центру дисплея.
+static uint16_t calc_proportion(const uint16_t multiplier1, const uint16_t multiplier2, const uint32_t divider);
 
 /*
  * ПРОЦЕДУРЫ И ФУНКЦИИ
@@ -91,8 +95,7 @@ static uint16_t calc_proportion(const uint16_t multiplier1, const uint16_t multi
  * @param х позиция для arg, если бы оно было однозначно;
  * @param pix ширина шрифта в пикселях.
  */
-static uint8_t X_position (const uint8_t x, const uint16_t arg, const uint8_t pix) {
-  //uint8_t pix = 6; // Ширина шрифта в пикселях
+static uint8_t X_position(const uint8_t x, const uint16_t arg, const uint8_t pix) {
   if (arg < 10) {
     return pix * x;
   } else if (arg < 100) {
@@ -109,9 +112,9 @@ static uint8_t X_position (const uint8_t x, const uint16_t arg, const uint8_t pi
  * для размещения оного по центру дисплея.
  * @param len Количество знакомест в тексте
  */
-static uint8_t X_centred (const uint8_t len) {
-  uint8_t wdt = 128; // Ширина дисплея в пикселях
-  uint8_t pix = 6;   // Ширина шрифта в пикселях
+static uint8_t X_centred(const uint8_t len) {
+  uint8_t wdt = ST7735_WIDTH; // Ширина дисплея в пикселях
+  uint8_t pix = 7;   // Ширина шрифта в пикселях
   if (len > wdt/pix) {
     return 0;
   } else {
@@ -119,6 +122,7 @@ static uint8_t X_centred (const uint8_t len) {
   }
 }
 
+#ifdef USE_EEPROM
 /**
  * @brief Функция переводит символ ASCII в шестнадцатиричную цифру,
  * @return при ошибке возвращает 255
@@ -150,6 +154,7 @@ static char HEX_to_A (const uint8_t x) {
     return 'X';
   }
 }
+#endif
 
 /**
  * @brief Подпрограммка остановки режима "Разгон"
@@ -163,7 +168,7 @@ static void stop_razgon(void) {
  * @brief Подпрограммка подсчета Pust
  */
 static void set_Pust(void) {
-  Pust = calc_proportion(PDMust);
+  Pust = calc_proportion(PDMust, Pnom, CICLE);
 }
 
 /**
@@ -223,6 +228,7 @@ static void remember_last_power_setting(void) { // Запомним послед
   }
 }
 
+#ifdef USE_EEPROM
 /**
  * @brief Подпрограмма обмена двух ячеек массива
  * @param arr массив,
@@ -235,6 +241,7 @@ static void change_arr_cell(uint16_t arr[2][ARRAY_SIZE], const uint8_t index, co
   arr[index][index1] = arr[index][index2];// Обмениваемся
   arr[index][index2] = k;
 }
+#endif
 
 /**
  * @brief Инициализация АЦП
@@ -355,16 +362,20 @@ static void Buttons_(void) {
     unsigned butt_3 : 1; // текущее состояние кнопки
     unsigned butt_4 : 1; // текущее состояние кнопки
     unsigned no_select : 1; // вспомогательный флажок для начального меню
+#ifdef USE_EEPROM
     unsigned writePnom : 1; // вспомогательный флажок записи нового Pnom в EEPROM
     unsigned clear_old : 1; // вспомогательный флажок стирания старой уставки из EEPROM
+#endif
   } bt = {}; // Инициализируем структуру с нулевыми членами
   static uint8_t butt_count = 0; // счетчик для устранения дребезга
   static uint8_t butt_force_count = 0; // счетчик для форсирования инкремента/декремента
 
+#ifdef USE_EEPROM
   if (bt.clear_old) { // Стираем старую уставку, если нужно
     eeprom_update_word((uint16_t*)clear_old_addr,EMPTY_CELL_VALUE); // Стираем самую старую уставку
     bt.clear_old = 0; // Снимаем флажок стирания
   }
+#endif
 
   bt.butt_1 = pin_butt_1_STATE;
   bt.butt_2 = pin_butt_2_STATE;
@@ -395,9 +406,11 @@ static void Buttons_(void) {
             if (PDMset[0][0] != 0xffff) { // и есть записанное значение, уходим
               cnt_Pnom_number = 0;
               Pnom = PDMset[0][0]; // По умолчанию установим номинальную мощность из нулевой ячейки
+#ifdef USE_EEPROM
               fl.writable = 1;     // Уставки пишутся в EERPOM
-              //EEPROM_read_PDMs();  // Читаем уставки
-#ifdef USE_USART              
+              EEPROM_read_PDMs();  // Читаем уставки
+#endif
+#ifdef USE_USART
               fl.uartUnhold = 1;   // Разрешим обращение к USART
 #endif              
               cnt_dspMenu = 0;     // Выйдем из менюшки
@@ -455,7 +468,9 @@ static void Buttons_(void) {
             }
             case 4: { //-----Кнопкой "Стоп" пишем значение в память и выходим из менюшки
               bt.writePnom = 1; // Ставим флаг записи нового значения Pnom в EEPROM
+#ifdef USE_EEPROM
               fl.writable = 1;  // Ставим флаг записи уставок в EEPROM
+#endif
             }
             case 8: { //-----Кнопкой "Разгон" выходим из менюшки
               if (Pnom < 10000) { // Если значение реальное...
@@ -465,22 +480,29 @@ static void Buttons_(void) {
                     if (Pnom == PDMset[0][x]) { // Если такое значение уже есть в EEPROM...
                       cnt_Pnom_number = x;      // Запомним порядковый номер совпавшего Pnom
                       bt.writePnom = 0;         // Снимем флаг записи нового значения Pnom в EEPROM
+#ifdef USE_EEPROM
                       fl.writable = 1;          // Ставим флаг записи уставок в EEPROM
+#endif
                       break;
                     }
                   }
                 } else {                        // Если значение выбрано из записанных в EEPROM...
                   bt.writePnom = 0;             // Снимем флаг записи нового значения Pnom в EEPROM
+#ifdef USE_EEPROM
                   fl.writable = 1;              // Ставим флаг записи уставок в EEPROM
+#endif
                 }
-                //
+
                 cnt_PDMcount=0;                 //Сбрасываем счетчик
-                //
+#ifdef USE_EEPROM
                 if (fl.writable) {              // Если уставки пишутся в EERPOM, то
-                  //EEPROM_read_PDMs();           // читаем ранее записанное
+                  EEPROM_read_PDMs();           // читаем ранее записанное
                 }
+#endif
                 if (bt.writePnom) { // Запишем новое значение Pnom, если необходимо
-                  //eeprom_update_word((uint16_t*)(cnt_Pnom_number * 2),Pnom);
+#ifdef USE_EEPROM
+                  eeprom_update_word((uint16_t*)(cnt_Pnom_number * 2),Pnom);
+#endif
                   bt.writePnom = 0; // и сбросим флаг записи нового значения Pnom
                 }
                 cnt_dspMenu = 0;    // Снимаем флаг перехода в меню
@@ -522,6 +544,7 @@ static void Buttons_(void) {
             }
             case 4: { //По кнопке "стоп" записываем уставку, если нужно, принимаем и выходим
               PDMust = PDMset[0][cnt_PDMcount]; //Устанавливаем выбранную мощность ТЭНа
+#ifdef USE_EEPROM
               if (fl.writable) { // Если уставки запоминаются...
                 if (!PDMset[1][cnt_PDMcount]) { // Если просят записать НЕ уже записанное...
                   //eeprom_update_word((uint16_t*)new_addr,PDMset[0][cnt_PDMcount]); // Пишем новую уставку
@@ -566,6 +589,7 @@ static void Buttons_(void) {
                   }
                 }
               }
+#endif /* USE_EEPROM */
               cnt_dspMenu = 0;   //Снимаем флаг перехода в меню
               fl.dspRefresh = 1; //Ставим флаг обновления экрана
               fl.butt = 0;       //После нажатия должна быть пауза
@@ -660,7 +684,7 @@ ISR(TIMER2_COMPA_vect) {
   }
 
   fl.PP_tm = !fl.PP_tm; // Инвертируем флаг полуволны
-  OCR2A = PID_ust;    // Грузим новое значение в регистр сравнения
+  OCR2A = PID_ust; // Грузим новое значение в регистр сравнения
 
   fl.Tout ? TURN_SSR_ON : TURN_SSR_OFF ;  // Включаем или выключаем ТЭН (твердотельное реле)
   fl.TRelay ? TURN_RELAY_ON : TURN_RELAY_OFF ;  // Включаем или выключаем ТЭН (контактное реле)
@@ -791,46 +815,48 @@ ISR(ADC_vect) {
  * @brief Подпрограмма обновления меню
  */
 static void RefreshMenu (void) {
-  ASOled.clearDisplay();
-  ASOled.printString_6x8(F("Ст Принять и записать"), 0, 6);
-  ASOled.printString_6x8(F("Рз Принять без записи"), 0, 7);
-  ASOled.printString_6x8(F("Управление:"), X_position (1), 3);
-  ASOled.printString_6x8(F("P- Выбор"), 0, 4);
+  ST7735_FillScreen(ST7735_BLACK);
+  ST7735_WriteString(0, 6, "Ст Принять и записать", Font_7x10, ST7735_BLUE, ST7735_BLACK);
+  ST7735_WriteString(0, 7, "Рз Принять без записи", Font_7x10, ST7735_BLUE, ST7735_BLACK);
+  ST7735_WriteString(X_position(1, 0, 7), 3, "Управление:", Font_7x10, ST7735_BLUE, ST7735_BLACK);
+  ST7735_WriteString(0, 4, "P- Выбор", Font_7x10, ST7735_BLUE, ST7735_BLACK);
 #ifdef INTERFACE_ALT
 
 #else
-  ASOled.printString_6x8(F("Выберите"), 0, 0);
+  ST7735_WriteString(0, 0, "Выберите", Font_7x10, ST7735_BLUE, ST7735_BLACK);
 #endif
   //
   switch (cnt_dspMenu) { //Проверяем режимы меню
     case 2:  { //Если мы в начальном меню, то...
  #ifdef INTERFACE_ALT
-      ASOled.printString_6x8(F("В"), X_position (20), 0);
-      ASOled.printNumber((long)U_LINE, X_position (16), 0);
-      ASOled.printString_6x8(F("Рном=         Вт"), 0, 1);
+      chsnprintf(buf, 24, "%3u V", U_LINE);
+      ST7735_WriteString(X_position(16, 0, 7), 0, buf, Font_7x10, ST7735_BLUE, ST7735_BLACK);
+      ST7735_WriteString(0, 1, "Рном=         Вт", Font_7x10, ST7735_BLUE, ST7735_BLACK);
  #else
-      ASOled.printString_6x8(F("/введите Рном"), X_position (8), 0);
-      ASOled.printString_6x8(F("Рном=      Вт, (   В)"), 0, 1);
-      ASOled.printNumber((long)U_LINE, X_position (16), 1);
+      ST7735_WriteString(X_position(8, 0, 7), 0, "/введите Рном", Font_7x10, ST7735_BLUE, ST7735_BLACK);
+      chsnprintf(buf, 24, "Рном=      Вт, (%3u V)", U_LINE);
+      ST7735_WriteString(0, 1, buf, Font_7x10, ST7735_BLUE, ST7735_BLACK);
  #endif
-      ASOled.printString_6x8(F("==Мощность нагрузки=="), 0, 2);
-      ASOled.printString_6x8(F("/уменьшение"), X_position (8), 4);
-      ASOled.printString_6x8(F("P+ Увеличение"), 0, 5);
+      ST7735_WriteString(0, 2, "==Мощность нагрузки==", Font_7x10, ST7735_BLUE, ST7735_BLACK);
+      ST7735_WriteString(X_position(8, 0, 7), 4, "/уменьшение", Font_7x10, ST7735_BLUE, ST7735_BLACK);
+      ST7735_WriteString(0, 5, "P+ Увеличение", Font_7x10, ST7735_BLUE, ST7735_BLACK);
       break;
     }
 
     case 1:  { //Если мы в меню выбора уставки, то...
  #ifdef INTERFACE_ALT
-      ASOled.printString_6x8(F("Руст=         Вт"), 0, 1);
+      ST7735_WriteString(0, 1, "Руст=         Вт", Font_7x10, ST7735_BLUE, ST7735_BLACK);
 #else
-      ASOled.printString_6x8(F("уставку"), X_position (9), 0);
-      ASOled.printString_6x8(F("Руст=      Вт"), 0, 1);
+      ST7735_WriteString(X_position(9, 0, 7), 0, "уставку", Font_7x10, ST7735_BLUE, ST7735_BLACK);
+      ST7735_WriteString(0, 1, "Руст=      Вт", Font_7x10, ST7735_BLUE, ST7735_BLACK);
 #endif
-      ASOled.printString_6x8(F("=======Уставка======="), 0, 2);
-      ASOled.printString_6x8(F("P+ Выбор"), 0, 5);
+      ST7735_WriteString(0, 2, "=======Уставка=======", Font_7x10, ST7735_BLUE, ST7735_BLACK);
+      ST7735_WriteString(0, 5, "P+ Выбор", Font_7x10, ST7735_BLUE, ST7735_BLACK);
+#ifdef USE_EEPROM
       if (!fl.writable) {  // Если уставки не пишутся в EEPROM, то...
-        ASOled.printString_6x8(F("Ст Принять без записи"), 0, 6);
+        ST7735_WriteString(0, 6, "Ст Принять без записи", Font_7x10, ST7735_BLUE, ST7735_BLACK);
       }
+#endif
       break;
     }
 
@@ -843,8 +869,8 @@ static void RefreshMenu (void) {
  * @brief Подпрограмма печати строки минусов
  * @param str - номер строки, куда печатать минуса
  */
-static void Asoled_printstring_6x8_minus (const uint8_t str) {
-  ASOled.printString_6x8(F("---------------------"), 0, str);
+static void menu_print_minus(const uint8_t str) {
+  ST7735_WriteString(0, str, "----------------------", Font_7x10, ST7735_RED, ST7735_BLACK);
 }
 
 /**
@@ -865,22 +891,21 @@ void Stab_Init(void) {
 
   pp_Delay(10);   // Подождем 10 полупериодов для гарантированного разрешения
 
-  ASOled.init(); // Инициализируем OLED дисплей
-  //ASOled.SetTurnedOrientation(); // Переворачиваем OLED дисплей
-  ASOled.clearDisplay();  // Очищаем, иначе некорректно работает для дисплеев на SH1106 (косяк библиотеки)
-  ASOled.printString_6x8(F("Стабилизатор мощности"), X_centred (21), 0);
-  ASOled.printString_6x8(F("ТЭНа"), X_centred (4), 1);
+  //ST7735_Init(); // done in main()
+  ST7735_FillScreenFast(ST7735_BLACK);
+  ST7735_WriteString(X_centred(21), 0, "Стабилизатор мощности", Font_7x10, ST7735_BLUE, ST7735_BLACK);
+  ST7735_WriteString(X_centred(4), 1, "ТЭНа", Font_7x10, ST7735_BLUE, ST7735_BLACK);
 #ifdef INTERFACE_ALT
-  ASOled.printString_12x16(F("STAB-AVR"), X_centred (16), 2);
+  ST7735_WriteString(X_centred(16), 2, "STAB-AVR", Font_11x18, ST7735_BLUE, ST7735_BLACK);
 #else
-  ASOled.printString_6x8(F("STAB-AVR"), X_centred (8), 2);
+  ST7735_WriteString(X_centred(8), 2, "STAB-AVR", Font_7x10, ST7735_BLUE, ST7735_BLACK);
+#endif
+  ST7735_WriteString(X_centred(VERSION_LEN), 4, VERSION, Font_7x10, ST7735_BLUE, ST7735_BLACK);
+  ST7735_WriteString(X_centred(10), 6, "JohnJohnov", Font_7x10, ST7735_BLUE, ST7735_BLACK);
+  ST7735_WriteString(X_centred(17), 7, "alcodistillers.ru", Font_7x10, ST7735_BLUE, ST7735_BLACK);
+#ifdef USE_EEPROM
+  EEPROM_read_Pnoms(); // Прочитаем из EEPROM записанные номиналы ТЭНов
 #endif
-  ASOled.printString_6x8(F(VERSION), X_centred (VERSION_LEN), 4);
-  ASOled.printString_6x8(F("JohnJohnov"), X_centred (10), 6);
-  ASOled.printString_6x8(F("alcodistillers.ru"), X_centred (17), 7);
-
-  //EEPROM_read_Pnoms(); // Прочитаем из EEPROM записанные номиналы ТЭНов
-
   pp_Delay(800);       // Подождем 600 полупериодов, пережидаем переходные процессы и любуемся заставкой
 
   fl.dspRefresh = 1;
@@ -966,18 +991,17 @@ void Stab_WorkCycle(void) {
         if (!Pnom || Pnom > 9999) {
           Pnomold = Pnom;
 #ifdef INTERFACE_ALT
-          ASOled.printString_12x16(F("****"), X_position(3,0,12), 0);
+          ST7735_WriteString(X_position(3, 0, 11), 0, "****", Font_11x18, ST7735_BLUE, ST7735_BLACK);
 #else
-          ASOled.printString_6x8(F("****"), X_position(6), 1);
+          ST7735_WriteString(X_position(6, 0, 7), 1, "****", Font_7x10, ST7735_BLUE, ST7735_BLACK);
 #endif
         } else if ((Pnomold != Pnom) || fl.dspRefresh) {
           Pnomold = Pnom;
+          chsnprintf(buf, 24, "%u", Pnom);
 #ifdef INTERFACE_ALT
-          ASOled.printString_12x16(F("    "), X_position(3,0,12), 0);
-          ASOled.printNumber((long)Pnom, X_position(6,Pnom,12), 0);
+          ST7735_WriteString(X_position(6, Pnom, 11), 0, buf, Font_11x18, ST7735_BLUE, ST7735_BLACK);
 #else
-          ASOled.printString_6x8(F("    "), X_position(6), 1);
-          ASOled.printNumber((long)Pnom, X_position(9,Pnom), 1);
+          ST7735_WriteString(X_position(9, Pnom, 7), 1, buf, Font_7x10, ST7735_BLUE, ST7735_BLACK);
 #endif
         }
         fl.dspRefresh = 0;
@@ -987,19 +1011,20 @@ void Stab_WorkCycle(void) {
         static uint16_t PDMold = 0;
         if ((PDMold != PDMset[0][cnt_PDMcount]) || fl.dspRefresh) {
           PDMold = PDMset[0][cnt_PDMcount];
-          uint16_t p = calc_proportion(PDMold); // Считаем уставку с округлением
+          uint16_t p = calc_proportion(PDMold, Pnom, CICLE); // Считаем уставку с округлением
+          chsnprintf(buf, 24, "%u", p);
 #ifdef INTERFACE_ALT
-          ASOled.printString_12x16(F("    "), X_position (3,0,12), 0);
-          ASOled.printNumber((long)p, X_position (6,p,12), 0);
+          ST7735_WriteString(X_position(6, p, 11), 0, buf, Font_11x18, ST7735_BLUE, ST7735_BLACK);
 #else
-          ASOled.printString_6x8(F("    "), X_position (6), 1);
-          ASOled.printNumber((long)p, X_position (9,p), 1);
+          ST7735_WriteString(X_position(9, p, 7), 1, buf, Font_7x10, ST7735_BLUE, ST7735_BLACK);
 #endif
+#ifdef USE_EEPROM
           if (PDMset[1][cnt_PDMcount]) { // Если значение записано в EEPROM
-            ASOled.printString_6x8(F("R"), X_position (20), 1); // поставим значок
+            ST7735_WriteString(X_position(20, 0, 7), 1, "R", Font_7x10, ST7735_BLUE, ST7735_BLACK); // поставим значок
           } else {
-            ASOled.printString_6x8(F(" "), X_position (20), 1); // а если не записано - уберем
+            ST7735_WriteString(X_position(20, 0, 7), 1, " ", Font_7x10, ST7735_BLUE, ST7735_BLACK); // а если не записано - уберем
           }
+#endif
         }
         fl.dspRefresh = 0;
         break;
@@ -1024,49 +1049,47 @@ void Stab_WorkCycle(void) {
 #endif
 
         if (fl.dspRefresh) {  //Обновляем дисплей
-          ASOled.clearDisplay();
+          ST7735_FillScreen(ST7735_BLACK);
 #ifdef INTERFACE_ALT
-          ASOled.printString_6x8(F("Вт       ,  %"), X_position (8), str_ust);
+          ST7735_WriteString(X_position(8, 0, 7), str_ust, "Вт       ,  %", Font_7x10, ST7735_BLUE, ST7735_BLACK);
 #else
-          ASOled.printString_6x8(F("Руст      Вт;    ,  %"), 0, str_ust);
+          ST7735_WriteString(0, str_ust, "Руст      Вт;    ,  %", Font_7x10, ST7735_BLUE, ST7735_BLACK);
 #endif
-          ASOled.printString_6x8(F("Напр.сети        ,  В"), 0, str_Ureal);
-          ASOled.printString_6x8(F("Ном. мощность      Вт"), 0, str_Pnom);
-          ASOled.printNumber((long)Pnom, X_position (17,Pnom), str_Pnom);
-          //ASOled.printString_6x8(F("Реле "), X_position (0), str_Relay);
+          ST7735_WriteString(0, str_Ureal, "Напр.сети        ,  В", Font_7x10, ST7735_BLUE, ST7735_BLACK);
+          chsnprintf(buf, 24, "Ном. мощность %u Вт", Pnom);
+          ST7735_WriteString(0, str_Pnom, buf, Font_7x10, ST7735_BLUE, ST7735_BLACK);
+          //ST7735_WriteString(X_position(0, 0, 7), str_Relay, "Реле ", Font_7x10, ST7735_BLUE, ST7735_BLACK);
         }
 
         static uint16_t U_real_old = 0;
         if ((U_real_old != U_real) || fl.dspRefresh) {
           U_real_old = U_real;
+          chsnprintf(buf, 24, "%u", U_real_old);
 #ifdef INTERFACE_ALT
-          ASOled.printString_12x16(F("   "), X_position (7,100,12) + 5, str_Ureal_big);
-          ASOled.printNumber((long)U_real_old, X_position (7,U_real_old,12) + 5, str_Ureal_big);
+          ST7735_WriteString(X_position(7, U_real_old, 11) + 5, str_Ureal_big, buf, Font_11x18, ST7735_BLUE, ST7735_BLACK);
 #else
-          ASOled.printString_6x8(F("    "), X_position (13), str_Ureal);
-          ASOled.printNumber((long)U_real_old, X_position (16,U_real_old), str_Ureal);
+          ST7735_WriteString(X_position(16, U_real_old, 7), str_Ureal, buf, Font_7x10, ST7735_BLUE, ST7735_BLACK);
 #endif
         }
         static uint8_t U_real_dec_old = 0;
         if ((U_real_dec_old != U_real_dec) || fl.dspRefresh) {
           U_real_dec_old = U_real_dec;
+          chsnprintf(buf, 24, "%u", U_real_dec);
 #ifdef INTERFACE_ALT
-          ASOled.printString_12x16(F(" "), X_position (9,0,12), str_Ureal_big);
-          ASOled.printNumber((long)U_real_dec_old, X_position (9,0,12), str_Ureal_big);
+          ST7735_WriteString(X_position(9, 0, 11), str_Ureal_big, buf, Font_11x18, ST7735_BLUE, ST7735_BLACK);
 #else
-          ASOled.printNumber((long)U_real_dec_old, X_position (18), str_Ureal);
+          ST7735_WriteString(X_position(18, 0, 7), str_Ureal_big, buf, Font_11x18, ST7735_BLUE, ST7735_BLACK);
 #endif
         }
 
         static uint16_t Pust_old = 0;
         if ((Pust_old != Pust) || fl.dspRefresh) {
           Pust_old = Pust;
+          chsnprintf(buf, 24, "%u", Pust_old);
 #ifdef INTERFACE_ALT
-          ASOled.printString_12x16(F("    "), 0, str_ust_big);
-          ASOled.printNumber((long)Pust_old, X_position (3,Pust_old,12), str_ust_big);
+          ST7735_WriteString(X_position(3,Pust_old,11), str_ust_big, buf, Font_11x18, ST7735_BLUE, ST7735_BLACK);
 #else
-          ASOled.printString_6x8(F("    "), X_position (5), str_ust);
-          ASOled.printNumber((long)Pust_old, X_position (8,Pust_old), str_ust);
+          ST7735_WriteString(X_position(8,Pust_old,7), str_ust, buf, Font_7x10, ST7735_BLUE, ST7735_BLACK);
 #endif
         }
 
@@ -1077,52 +1100,49 @@ void Stab_WorkCycle(void) {
           x /= CICLE;
           uint8_t percent = x / 10;     // посчитаем процент
           uint8_t percent_dec = x % 10; // посчитаем десятые процента
+          chsnprintf(buf, 24, "%u.%u", percent, percent_dec);
 #ifdef INTERFACE_ALT
-          ASOled.printString_12x16(F("   "), X_position (7,100,12) + 5, str_ust_big);
-          ASOled.printNumber((long)(percent), X_position (7,percent,12) + 5, str_ust_big);
-          ASOled.printNumber((long)(percent_dec), X_position (9,0,12), str_ust_big);
+          ST7735_WriteString(X_position(7,100,11) + 5, str_ust_big, buf, Font_11x18, ST7735_BLUE, ST7735_BLACK);
 #else
-          ASOled.printString_6x8(F("    "), X_position (13), str_ust);
-          ASOled.printNumber((long)(percent), X_position (16,percent), str_ust);
-          ASOled.printNumber((long)(percent_dec), X_position (18), str_ust);
+          ST7735_WriteString(X_position(13, 0, 7), str_ust, buf, Font_7x10, ST7735_BLUE, ST7735_BLACK);
 #endif
         }
 
         if (fl.Udown || fl.NotZero) {
-          ASOled.printString_6x8(F("-----Авария сети-----"), 0, str_Ustat);
+          ST7735_WriteString(0, str_Ustat, "-----Авария сети-----", Font_7x10, ST7735_BLUE, ST7735_BLACK);
         } else if (fl.Ulow) {
-          ASOled.printString_6x8(F("--Недост.напр. сети--"), 0, str_Ustat);
+          ST7735_WriteString(0, str_Ustat, "--Недост.напр. сети--", Font_7x10, ST7735_BLUE, ST7735_BLACK);
         } else {
-          Asoled_printstring_6x8_minus(str_Ustat);
+          menu_print_minus(str_Ustat);
         }
 
         if (fl.razg_on) {
           static uint8_t count_1 = 0;
           uint8_t x1 = 5 - count_1;
           uint8_t x2 = 20 - x1;
-          ASOled.printString_6x8(F("------<Разгон!>------"), 0, str_Razgon);
-          ASOled.printString_6x8(F("<"), X_position (x1), str_Razgon);
-          ASOled.printString_6x8(F(">"), X_position (x2), str_Razgon);
+          ST7735_WriteString(0, str_Razgon, "------<Разгон!>------", Font_7x10, ST7735_BLUE, ST7735_BLACK);
+          ST7735_WriteString(X_position(x1, 0, 7), str_Razgon, "<", Font_7x10, ST7735_BLUE, ST7735_BLACK);
+          ST7735_WriteString(X_position(x2, 0, 7), str_Razgon, ">", Font_7x10, ST7735_BLUE, ST7735_BLACK);
           if (++count_1 > 5) count_1 = 0;
         } else {
-          Asoled_printstring_6x8_minus(str_Razgon);
+          menu_print_minus(str_Razgon);
         }
 
         {
           static uint8_t trigger = 1;
           if (trigger && fl.stab_off) {
-            ASOled.printString_6x8(F("!!АВАРИЙНЫЙ ОСТАНОВ!!"), 0, str_Relay);
+            ST7735_WriteString(0, str_Relay, "!!АВАРИЙНЫЙ ОСТАНОВ!!", Font_7x10, ST7735_BLUE, ST7735_BLACK);
             trigger = 0;
           } else {
-            Asoled_printstring_6x8_minus(str_Relay);
+            menu_print_minus(str_Relay);
             trigger = 1;
           }
         }
 
         //if (fl.TRelay) {
-        //  ASOled.printString_6x8(F("включено"), X_position (5), str_Relay);
+        //  ST7735_WriteString(X_position(5, 0, 7), str_Relay, "включено", Font_7x10, ST7735_BLUE, ST7735_BLACK);
         //} else {
-        //  ASOled.printString_6x8(F("        "), X_position (5), str_Relay);
+        //  ST7735_WriteString(X_position(5, 0, 7), str_Relay, "        ", Font_7x10, ST7735_BLUE, ST7735_BLACK);
         //}
         fl.dspRefresh = 0;
       }

+ 1 - 2
lib/stab/stab_param.h

@@ -3,6 +3,7 @@
 
 //================================================================
 //===========Настраиваемые параметры==============================
+//#define USE_EEPROM
 //================================================================
 //#define Debug           // Раскомментить для дебажения
 //#define LED_debug       // Раскомментить для вывода на светодиод сигнала управления твердотельным реле
@@ -151,8 +152,6 @@
 #define T_ADC 49    // Определяет интервал между запусками АЦП (200 мкс) f_OCn = f_clk / 2*N*(1 + X), где N - коэффициент деления предделителя, X- содержимое регистра OCRnA
 #define CICLE 500   // Количество полупериодов в полном цикле регулирования (200 полупериодов - 2сек, 500 полупериодов - 5сек, больше ставить не надо)
 
-#define ASOled LD // Заюзаем уже созданный в библиотеке дисплея объект LD
-
 #define SRVDATA_ARR_SIZE 14 // Размер блока памяти для вспомогательных данных
 #define Pnom_ARR_SIZE 8   // Макс. размер массива записанных номинальных мощностей ТЭНа sizeof(Pnom_arr)/sizeof(Pnom_arr[0])
 #define PDMset_ARR_SIZE 6     // Размер массива уставок мощности ТЭНа sizeof(PDMset)/sizeof(PDMset[0]) (ставить не меньше 4)

+ 0 - 0
lib/stab/usart.c → lib/stab/stab_usart.c


+ 0 - 0
lib/stab/usart.h → lib/stab/stab_usart.h