OLED дисплей 128*64 (вроде как ssd1306) показывает текст и фигуры через строку (т.е. одну строку закрашивает, следующую нет, после нее закрашивает и так далее.)

К сожалению, дисплей не симметричен. Первым делом я его перевернул (механически, на 180 градусов). Оказалось, что посадочное место, закрывает часть дисплея свержу и “обнажает” снизу, что требует увеличение размеров “окна” под дисплей. И не важно, что этот корпус мыльница. На её месте, мог быть и более существенный, дорогой и специализированный корпус, что могло привести к “порче” внешнего вида всей конструкции. По этому и обратился за помощью, к компетентным людям, которые смогли решить проблему, программными средствами. И это хорошо. К тому же, поможет другим “творцам”, выйти таким образом из создавшейся ситуации, которые периодически бывают.

Не совсем понятно, что копировать? Ошибки компиляции? Походу, лучше вообще всё кодом писать, это уже понятно. Хорошо, учту этот момент.

Да. Мало того, что результат получается ЧИТАЕМЫМ, так еще и делается проще, чем скриншоты

Я пробовал то, что вы предложили. Скетч компилируется и загружается, но после включения, на дисплее тёмный экран и всё. Если возвращаю к исходному количеству шагов сетки частот, то всё работает. Пытаюсь увеличить, хотя бы на один шаг, то после компиляции и загрузки, тёмный экран.

Скорее всего у вас шаги выбраны вполне логично, из принципа - выбираете нужный разряд и изменяете его. Нужны единицы - выбираете первый разряд, прирост на единицы, нужны тысячи - выбираете третий разряд, прирост на тысячи. Вполне распространенный метод, хотя может и не самый удачный. Изменить тут без переделки скетча вряд ли что возможно. А уж добавить - тем более

Так по этому и спросил. Что нужно изменить в скетче, что бы увеличить количество шагов? То сам понимаю и смог, пытался сделать, но результат отрицательный.

Ну сделайте, например

case 1:  stp = 2;  fstep = 5;         break;

будет меняться на пять единиц, а не на одну. Это если действительно “изменить”. А заниматься за вас именно переделкой способа настройки тут вряд ли кто станет

Делал. Меняет. Вопрос не в этом. Сейчас, шагов перестройки частоты 8. Мне надо допустим 16. Как добавить? Убавлять получается. Я делал 5 шагов, 3 шага. Всё работает. Не получается увеличить количество шагов, экран становится тёмный и всё. Почему? Что в этом коде такого, что не позволяет увеличить количество шагов, хотя бы на один? Может в коде, есть какие то ограничения или в аппаратной части? Не знаю.

Видимо, потому, что вы не даете себе труд разобраться, как работает ваше устройство :wink:
Смотрите, где используется переменная stp, смотрите, что делается в этих кусках кода, анализируйте. Может и поймете, почему у вас выходит черный экран, и что нужно сделать. Делать за вас вряд ли кто согласится…

ЗЫ: не верьте тем, кто убеждает вас, что “Ардуино - это просто” ))

Волшебное слово ОТЛАДКА спасёт !!!

2 лайка

Ваша рекомендация сработала. :+1:
Увеличил количество шагов, перестройки частоты, до необходимого, оптимального уровня. Так же добавил ещё и один, дополнительный диапазон (LW, длинные волны). Всё скомпилировалось и загрузилось.

/**********************************************************************************************************

  10kHz to 225MHz VFO / RF Generator with Si5351 and Arduino Nano, with Intermediate
  Frequency (IF) offset
  (+ or -), RX/TX Selector for QRP Transceivers, Band Presets
  and Bargraph S-Meter. See the schematics for
  wiring and README.txt for details.
  By J. CesarSound - ver 2.0 - Feb/2021.
***********************************************************************************************************/

//Libraries
#include <Wire.h>                 //IDE Standard
#include <Rotary.h>               //Ben  Buxton https://github.com/brianlow/Rotary
#include <si5351.h>               //Etherkit  https://github.com/etherkit/Si5351Arduino
#include <Adafruit_GFX.h>         //Adafruit  GFX https://github.com/adafruit/Adafruit-GFX-Library
#include <Adafruit_SSD1306.h>     //Adafruit SSD1306 https://github.com/adafruit/Adafruit_SSD1306

//User   preferences
//------------------------------------------------------------------------------------------------------------
#define IF  455              // 455    //Enter your IF frequency, ex: 455 = 455kHz, 10700 = 10.7MHz,
                             //0 = to direct convert receiver or RF generator, + will add and - will subtract IF   //offfset.
#define BAND_INIT  1         //Enter your initial Band (1-21) at startup, 
                             //ex: 1 = Freq Generator, 2 = 800kHz (MW), 7 = 7.2MHz (40m), 11 = 14.1MHz (20m). 
#define XT_CAL_F   33000     //Si5351 calibration factor, adjust to get exatcly 10MHz. Increasing  this value will decreases the frequency and vice versa.
#define S_GAIN     404       //Adjust the sensitivity of Signal Meter A/D input: 101 = 500mv; 202 = 1v;  303 = 1.5v; 404 = 2v; 505 = 2.5v; 1010 = 5v (max).
#define tunestep   A0        //The  pin used by tune step push button.
#define band       A1        //The pin used  //by band selector push button.
#define rx_tx      A2        //The pin used by  RX / TX selector switch, RX = switch open, TX = switch closed to GND. When in TX, the IF value is not considered.
#define adc        A3        //The pin used by  Signal Meter A/D input.
//------------------------------------------------------------------------------------------------------------

Rotary r = Rotary(2, 3);
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);
Si5351 si5351(0x60);         //Si5351 I2C Address 0x60

unsigned long freq, freqold, fstep;
long interfreq = IF, interfreqold = 0;
long cal = XT_CAL_F;
unsigned int smval;
byte encoder = 1;
byte stp, n = 1;
byte count, x, xo;
bool sts = 0;
unsigned int period = 100;
unsigned long time_now = 0;

ISR(PCINT2_vect) {
  char
  result = r.process();
  if (result == DIR_CW) set_frequency(1);
  else if  (result == DIR_CCW) set_frequency(-1);
}

void set_frequency(short dir)
  {
  if (encoder == 1) {          //Up/Down frequency
    if (dir == 1) freq = freq + fstep;
    if (freq >= 225000000) freq = 225000000;
    if (dir == -1) freq = freq - fstep;
    if (fstep == 1000000 && freq <= 1000000) freq = 1000000;
    else if (freq < 4000) freq = 4000;
  }
  if (encoder == 1) {          //Up/Down graph tune pointer
    if (dir == 1) n = n + 1;
    if (n > 42) n = 1;
    if (dir == -1) n = n - 1;
    if (n < 1) n = 42;
  }
}

void setup() {
  Wire.begin();
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.ssd1306_command(0xA0);
  display.ssd1306_command(0xC0);
  display.clearDisplay();
  display.setTextColor(WHITE);
  display.display();

  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  pinMode(tunestep, INPUT_PULLUP);
  pinMode(band, INPUT_PULLUP);
  pinMode(rx_tx, INPUT_PULLUP);


  //statup_text();  //If you hang on startup, comment

  si5351.init(SI5351_CRYSTAL_LOAD_8PF, 0, 0);
  si5351.set_correction(cal, SI5351_PLL_INPUT_XO);
  si5351.drive_strength(SI5351_CLK0,  SI5351_DRIVE_8MA);
  si5351.output_enable(SI5351_CLK0, 1);   //1  - Enable / 0 - Disable CLK
  si5351.output_enable(SI5351_CLK1, 0);
  si5351.output_enable(SI5351_CLK2, 0);

  PCICR |= (1 << PCIE2);
  PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);

  sei();

  count = BAND_INIT;
  bandpresets();
  stp = 4;
  setstep();
}

void
  loop() {
  if (freqold != freq) {
    time_now = millis();
    tunegen();
    freqold = freq;
  }

  if (interfreqold != interfreq) {
    time_now = millis();
    tunegen();
    interfreqold = interfreq;
  }

  if
  (xo != x) {
    time_now = millis();
    xo = x;
  }

  if (digitalRead(tunestep) == LOW) {
    time_now = (millis() + 300);
    setstep();
    delay(300);
  }

  if (digitalRead(band) == LOW) {
    time_now = (millis() + 300);
    inc_preset();
    delay(300);
  }

  if (digitalRead(rx_tx) == LOW)
  {
    time_now = (millis() + 300);
    sts = 1;
  } else sts = 0;


  if ((time_now + period) > millis()) {
    displayfreq();
    layout();
  }
  sgnalread();
}

void tunegen() {
  si5351.set_freq((freq +
  (interfreq * 1000ULL)) * 100ULL, SI5351_CLK0);
}

void displayfreq() {

  unsigned int m = freq / 1000000;
  unsigned int k = (freq % 1000000) / 1000;
  unsigned int h = (freq % 1000) / 1;

  display.clearDisplay();
  display.setTextSize(2);

  char buffer[15] = "";
  if (m < 1) {
    display.setCursor(41, 1); sprintf(buffer, "%003d.%003d", k, h);
  }
  else if (m < 100) {
   display.setCursor(5,  1); 
   sprintf(buffer, "%2d.%003d.%003d", m, k, h);
  }
  else if (m >= 100)
  {
    unsigned int h = (freq % 1000) / 10;
    display.setCursor(5, 1); sprintf(buffer,  "%2d.%003d.%02d", m, k, h);
  }
  display.print(buffer);
}

void
  setstep() {
  switch (stp) {
    case 1: stp = 2; fstep = 1; break;
    case 2: stp = 3; fstep = 10; break;
    case 3: stp = 4; fstep = 100; break;
    case 4: stp = 5; fstep = 1000; break;
    case 5: stp = 6; fstep = 5000;  break;
    case 6: stp = 7; fstep = 8330; break;
    case 7: stp = 8; fstep = 9000; break;
    case 8: stp = 9; fstep = 10000; break;
    case 9: stp = 10; fstep = 12500; break;
    case 10: stp = 11; fstep = 25000; break;
    case 11: stp = 12; fstep = 100000; break;
    case 12: stp = 1; fstep = 1000000; break;
  }
}

void inc_preset()
  {
  count++;
  if (count > 22) count = 1;
  bandpresets();
  delay(50);
}

void
  bandpresets() {
  switch (count)  {
    case  1: freq = 100000; tunegen(); break;
    case  2: freq = 153000; break;
    case  3: freq = 522000; break;
    case  4: freq = 1800000; break;
    case  5: freq = 3650000; break;
    case  6: freq = 4985000; break;
    case  7: freq = 6180000; break;
    case  8: freq = 7200000; break;
    case  9: freq = 10000000; break;
    case 10: freq = 11780000; break;
    case 11: freq = 13630000; break;
    case 12: freq = 14100000; break;
    case 13: freq = 15000000; break;
    case 14: freq = 17655000; break;
    case 15: freq = 21525000; break;
    case 16: freq = 27015000; break;
    case 17: freq = 28400000; break;
    case 18: freq = 50000000; break;
    case 19: freq = 100000000; break;
    case 20: freq = 130000000; break;
    case 21: freq = 144000000; break;
    case 22: freq = 220000000; break;
    
  }
  si5351.pll_reset(SI5351_PLLA);
  stp = 4; setstep();
}

void layout() {
  display.setTextColor(WHITE);
  display.drawLine(0, 20, 127, 20, WHITE);
  display.drawLine(0, 43, 127, 43, WHITE);
  display.drawLine(105, 24, 105, 39, WHITE);
  display.drawLine(87,  24, 87, 39, WHITE);
  display.drawLine(87, 48, 87, 63, WHITE);
  display.drawLine(15, 55, 82, 55, WHITE);
  display.setTextSize(1);
  display.setCursor(50, 23);
  display.print("STEP");
  display.setCursor(50, 33);
  if (stp == 2)    display.print("1Hz"); 
  if (stp == 3)    display.print("10Hz"); 
  if (stp == 4)    display.print("100Hz");
  if (stp == 5)    display.print("1k"); 
  if (stp == 6)    display.print("5k");
  if (stp == 7)    display.print("8.33k");
  if (stp == 8)    display.print("9k");
  if (stp == 9)    display.print("10k"); 
  if (stp == 10)   display.print("12.5k");
  if (stp == 11)   display.print("25k");
  if (stp == 12)   display.print("100k");
  if (stp == 1)   display.print("1M");
    
  display.setTextSize(1);
  display.setCursor(92, 48);
  display.print("IF:");
  display.setCursor(92, 57);
  display.print(interfreq);

  display.print("k");
  display.setTextSize(1);
  display.setCursor(110, 23);
  if (freq < 1000000) display.print("kHz");
  if (freq >= 1000000) display.print("MHz");
  display.setCursor(110, 33);
  if (interfreq == 0)
  display.print("VFO");
  if (interfreq != 0) display.print("L O");
  display.setCursor(91, 28);
  if (!sts) display.print("RX"); if (!sts) interfreq = IF;
  if (sts)  display.print("TX"); if (sts) interfreq = 0;
  bandlist(); drawbargraph();
  display.display();
}

void bandlist() {
  display.setTextSize(2);
  display.setCursor(0, 25);
  if (count == 1) display.print("GEN"); 
  if (count == 2) display.print("LW"); 
  if (count == 3) display.print("MW"); 
  if (count == 4) display.print("160m");
  if (count == 5) display.print("80m"); 
  if (count == 6) display.print("60m"); 
  if (count == 7) display.print("49m"); 
  if (count == 8) display.print("40m");
  if (count == 9) display.print("31m"); 
  if (count == 10) display.print("25m"); 
  if (count == 11) display.print("22m"); 
  if (count == 12) display.print("20m");
  if (count == 13) display.print("19m"); 
  if (count == 14) display.print("16m"); 
  if (count == 15) display.print("13m"); 
  if (count == 16) display.print("11m");
  if (count == 17) display.print("10m");
  if (count == 18) display.print("6m"); 
  if (count == 19) display.print("WFM");
  if (count == 20) display.print("AIR");
  if (count == 21) display.print("2m");
  if (count == 22) display.print("1m");
  if (count == 1) interfreq = 0; 
  else if (!sts) interfreq = IF;
}

void
  sgnalread() {
  smval = analogRead(adc); x = map(smval, 0, S_GAIN, 1, 14); if (x > 14) x = 14;
}

void drawbargraph() {
  byte y = map(n, 1, 42, 1, 14);
  display.setTextSize(1);

  //Pointer
  display.setCursor(0, 48);
  display.print("TU");
  switch (y) {
    case  1: display.fillRect(15, 48, 2, 6, WHITE); break;
    case  2: display.fillRect(20, 48, 2, 6, WHITE); break;
    case  3: display.fillRect(25, 48, 2, 6, WHITE); break;
    case  4: display.fillRect(30, 48, 2, 6, WHITE); break;
    case  5: display.fillRect(35, 48, 2, 6, WHITE); break;
    case  6: display.fillRect(40, 48, 2, 6, WHITE); break;
    case  7: display.fillRect(45, 48, 2, 6, WHITE); break;
    case  8: display.fillRect(50, 48, 2, 6, WHITE); break;
    case  9: display.fillRect(55, 48, 2, 6, WHITE); break;
    case 10: display.fillRect(60, 48, 2, 6, WHITE); break;
    case 11: display.fillRect(65, 48, 2, 6, WHITE); break;
    case 12: display.fillRect(70, 48, 2, 6, WHITE); break;
    case 13: display.fillRect(75, 48, 2, 6, WHITE); break;
    case 14: display.fillRect(80, 48, 2, 6, WHITE); break;
  }

  //Bargraph
  display.setCursor(0, 57);
  display.print("SM");
  switch (x) {
    case 14: display.fillRect(80, 58, 2, 6, WHITE);
    case 13: display.fillRect(75, 58, 2, 6, WHITE);
    case 12: display.fillRect(70, 58, 2, 6, WHITE);
    case 11: display.fillRect(65, 58, 2, 6, WHITE);
    case 10: display.fillRect(60, 58, 2, 6, WHITE);
    case  9: display.fillRect(55, 58, 2, 6, WHITE);
    case  8: display.fillRect(50, 58, 2, 6, WHITE);
    case  7: display.fillRect(45, 58, 2, 6, WHITE);
    case  6: display.fillRect(40, 58, 2, 6, WHITE);
    case  5: display.fillRect(35, 58, 2, 6, WHITE);
    case  4: display.fillRect(30, 58, 2, 6, WHITE);
    case  3: display.fillRect(25, 58, 2, 6, WHITE);
    case  2: display.fillRect(20, 58, 2, 6, WHITE);
    case  1: display.fillRect(15, 58, 2, 6, WHITE);
  }
}

void
  statup_text() {
  display.setTextSize(1); 
  display.setCursor(13, 18);
  display.print("Si5351 VFO/RF GEN");
  display.setCursor(6, 40);
  display.print("JCR RADIO - Ver 2.0");
  display.display(); delay(2000);
}

Проблема затемнения дисплея решена, но не понятна сама по себе. Если добавляю строки шагов перестройки частоты или дополнительного диапазона, то дисплей перестает отображать информацию, при этом, сам синтезатор работает и перестраивается. Экспериментально, было установлено, что если уменьшить отведенные, до минимально возможного для отображения информации “знакоместа” (удаляю пробелы перед частотой и окончания “Hz”, в окончании отображаемого шага частоты), то дисплей работает нормально. Например. Было.
if (stp == 2) display.print(" 1Hz");
if (stp == 3) display.print(" 10Hz");
if (stp == 4) display.print(" 1kHz");
if (stp == 5) display.print(" 5kHz");
При добавлении шага, дисплей затемнялся.
После удаления пробелов и частично “Hz”, дисплей стал отображать нормально.
if (stp == 2) display.print(“1Hz”);
if (stp == 3) display.print(“10Hz”);
if (stp == 4) display.print(“100Hz”);
if (stp == 5) display.print(“1k”);
if (stp == 6) display.print(“5k”);
Такое ощущение, что не хватает памяти, что ли?
В принципе, вопрос решен. Остался только второй вопрос. Это отображение начальной информации, на дисплее, при включении. “Разремил” 87 строку скетча.

statup_text(); //If you hang on startup, comment

Дисплей стал отображать начальный экран, но, теперь он отображается постоянно.


Изменения параметра delay(2000); в ту или иную сторону, результата не дало.

void
  statup_text() {
  display.setTextSize(1); 
  display.setCursor(13, 18);
  display.print("Si5351 VFO/RF GEN");
  display.setCursor(6, 40);
  display.print("JCR RADIO - Ver 2.0");
  display.display(); delay(2000);

Что не так?

Попробуйте закомментировать //display.display();
delay() перенести на следующую строку

delay(2000); - это подождать 2 секунды, плюс сама инициализация сколько-то времени занимает. Так что ждать надо секунд 5-10. Ждал столько?

А зачем? Это же просто сброс буфера в экран.

1 лайк

Ну должен же кто-то и глупость сморозить))

1 лайк

Закомментировал, перенес delay();. Темный экран и более ни чего.

И минуту ждал. Надпись на дисплее, не уходит

Покажи следующим сообщением САМЫЙ последний вариант кода, который загружаешь.

/**********************************************************************************************************

  10kHz to 225MHz VFO / RF Generator with Si5351 and Arduino Nano, with Intermediate
  Frequency (IF) offset
  (+ or -), RX/TX Selector for QRP Transceivers, Band Presets
  and Bargraph S-Meter. See the schematics for
  wiring and README.txt for details.
  By J. CesarSound - ver 2.0 - Feb/2021.
***********************************************************************************************************/

//Libraries
#include <Wire.h>                 //IDE Standard
#include <Rotary.h>               //Ben  Buxton https://github.com/brianlow/Rotary
#include <si5351.h>               //Etherkit  https://github.com/etherkit/Si5351Arduino
#include <Adafruit_GFX.h>         //Adafruit  GFX https://github.com/adafruit/Adafruit-GFX-Library
#include <Adafruit_SSD1306.h>     //Adafruit SSD1306 https://github.com/adafruit/Adafruit_SSD1306

//User   preferences
//------------------------------------------------------------------------------------------------------------
#define IF  455              // 455    //Enter your IF frequency, ex: 455 = 455kHz, 10700 = 10.7MHz,
                             //0 = to direct convert receiver or RF generator, + will add and - will subtract IF   //offfset.
#define BAND_INIT  1         //Enter your initial Band (1-21) at startup, 
                             //ex: 1 = Freq Generator, 2 = 800kHz (MW), 7 = 7.2MHz (40m), 11 = 14.1MHz (20m). 
#define XT_CAL_F   33000     //Si5351 calibration factor, adjust to get exatcly 10MHz. Increasing  this value will decreases the frequency and vice versa.
#define S_GAIN     404       //Adjust the sensitivity of Signal Meter A/D input: 101 = 500mv; 202 = 1v;  303 = 1.5v; 404 = 2v; 505 = 2.5v; 1010 = 5v (max).
#define tunestep   A0        //The  pin used by tune step push button.
#define band       A1        //The pin used  //by band selector push button.
#define rx_tx      A2        //The pin used by  RX / TX selector switch, RX = switch open, TX = switch closed to GND. When in TX, the IF value is not considered.
#define adc        A3        //The pin used by  Signal Meter A/D input.
//------------------------------------------------------------------------------------------------------------

Rotary r = Rotary(2, 3);
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);
Si5351 si5351(0x60);         //Si5351 I2C Address 0x60

unsigned long freq, freqold, fstep;
long interfreq = IF, interfreqold = 0;
long cal = XT_CAL_F;
unsigned int smval;
byte encoder = 1;
byte stp, n = 1;
byte count, x, xo;
bool sts = 0;
unsigned int period = 100;
unsigned long time_now = 0;

ISR(PCINT2_vect) {
  char
  result = r.process();
  if (result == DIR_CW) set_frequency(1);
  else if  (result == DIR_CCW) set_frequency(-1);
}

void set_frequency(short dir)
  {
  if (encoder == 1) {          //Up/Down frequency
    if (dir == 1) freq = freq + fstep;
    if (freq >= 225000000) freq = 225000000;
    if (dir == -1) freq = freq - fstep;
    if (fstep == 1000000 && freq <= 1000000) freq = 1000000;
    else if (freq < 4000) freq = 4000;
  }
  if (encoder == 1) {          //Up/Down graph tune pointer
    if (dir == 1) n = n + 1;
    if (n > 42) n = 1;
    if (dir == -1) n = n - 1;
    if (n < 1) n = 42;
  }
}

void setup() {
  Wire.begin();
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.ssd1306_command(0xA0);
  display.ssd1306_command(0xC0);
  display.clearDisplay();
  display.setTextColor(WHITE);
  display.display();

  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  pinMode(tunestep, INPUT_PULLUP);
  pinMode(band, INPUT_PULLUP);
  pinMode(rx_tx, INPUT_PULLUP);

  
  // statup_text();  //If you hang on startup, comment
  
  si5351.init(SI5351_CRYSTAL_LOAD_8PF, 0, 0);
  si5351.set_correction(cal, SI5351_PLL_INPUT_XO);
  si5351.drive_strength(SI5351_CLK0,  SI5351_DRIVE_8MA);
  si5351.output_enable(SI5351_CLK0, 1);   //1  - Enable / 0 - Disable CLK
  si5351.output_enable(SI5351_CLK1, 0);
  si5351.output_enable(SI5351_CLK2, 0);

  PCICR |= (1 << PCIE2);
  PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);

  sei();

  count = BAND_INIT;
  bandpresets();
  stp = 4;
  setstep();
}

void
  loop() {
  if (freqold != freq) {
    time_now = millis();
    tunegen();
    freqold = freq;
  }

  if (interfreqold != interfreq) {
    time_now = millis();
    tunegen();
    interfreqold = interfreq;
  }

  if
  (xo != x) {
    time_now = millis();
    xo = x;
  }

  if (digitalRead(tunestep) == LOW) {
    time_now = (millis() + 300);
    setstep();
    delay(300);
  }

  if (digitalRead(band) == LOW) {
    time_now = (millis() + 300);
    inc_preset();
    delay(300);
  }

  if (digitalRead(rx_tx) == LOW)
  {
    time_now = (millis() + 300);
    sts = 1;
  } else sts = 0;


  if ((time_now + period) > millis()) {
    displayfreq();
    layout();
  }
  sgnalread();
}

void tunegen() {
  si5351.set_freq((freq +
  (interfreq * 1000ULL)) * 100ULL, SI5351_CLK0);
}

void displayfreq() {

  unsigned int m = freq / 1000000;
  unsigned int k = (freq % 1000000) / 1000;
  unsigned int h = (freq % 1000) / 1;

  display.clearDisplay();
  display.setTextSize(2);

  char buffer[15] = "";
  if (m < 1) {
    display.setCursor(41, 1); sprintf(buffer, "%003d.%003d", k, h);
  }
  else if (m < 100) {
   display.setCursor(5,  1); 
   sprintf(buffer, "%2d.%003d.%003d", m, k, h);
  }
  else if (m >= 100)
  {
    unsigned int h = (freq % 1000) / 10;
    display.setCursor(5, 1); sprintf(buffer,  "%2d.%003d.%02d", m, k, h);
  }
  display.print(buffer);
}

void
  setstep() {
  switch (stp) {
    case 1: stp = 2; fstep = 1; break;
    case 2: stp = 3; fstep = 10; break;
    case 3: stp = 4; fstep = 100; break;
    case 4: stp = 5; fstep = 1000; break;
    case 5: stp = 6; fstep = 5000;  break;
    case 6: stp = 7; fstep = 8330; break;
    case 7: stp = 8; fstep = 9000; break;
    case 8: stp = 9; fstep = 10000; break;
    case 9: stp = 10; fstep = 12500; break;
    case 10: stp = 11; fstep = 25000; break;
    case 11: stp = 12; fstep = 100000; break;
    case 12: stp = 1; fstep = 1000000; break;
  }
}

void inc_preset()
  {
  count++;
  if (count > 22) count = 1;
  bandpresets();
  delay(50);
}

void
  bandpresets() {
  switch (count)  {
    case  1: freq = 100000; tunegen(); break;
    case  2: freq = 153000; break;
    case  3: freq = 522000; break;
    case  4: freq = 1800000; break;
    case  5: freq = 3650000; break;
    case  6: freq = 4985000; break;
    case  7: freq = 6180000; break;
    case  8: freq = 7200000; break;
    case  9: freq = 10000000; break;
    case 10: freq = 11780000; break;
    case 11: freq = 13630000; break;
    case 12: freq = 14100000; break;
    case 13: freq = 15000000; break;
    case 14: freq = 17655000; break;
    case 15: freq = 21525000; break;
    case 16: freq = 27015000; break;
    case 17: freq = 28400000; break;
    case 18: freq = 50000000; break;
    case 19: freq = 87500000; break;
    case 20: freq = 118000000; break;
    case 21: freq = 144000000; break;
    case 22: freq = 220000000; break;
    
  }
  si5351.pll_reset(SI5351_PLLA);
  stp = 4; setstep();
}

void layout() {
  display.setTextColor(WHITE);
  display.drawLine(0, 20, 127, 20, WHITE);
  display.drawLine(0, 43, 127, 43, WHITE);
  display.drawLine(105, 24, 105, 39, WHITE);
  display.drawLine(87,  24, 87, 39, WHITE);
  display.drawLine(87, 48, 87, 63, WHITE);
  display.drawLine(15, 55, 82, 55, WHITE);
  display.setTextSize(1);
  display.setCursor(50, 23);
  display.print("STEP");
  display.setCursor(50, 33);
  if (stp == 2)    display.print("1Hz"); 
  if (stp == 3)    display.print("10Hz"); 
  if (stp == 4)    display.print("100Hz");
  if (stp == 5)    display.print("1k"); 
  if (stp == 6)    display.print("5k");
  if (stp == 7)    display.print("8.33k");
  if (stp == 8)    display.print("9k");
  if (stp == 9)    display.print("10k"); 
  if (stp == 10)   display.print("12.5k");
  if (stp == 11)   display.print("25k");
  if (stp == 12)   display.print("100k");
  if (stp == 1)   display.print("1M");
    
  display.setTextSize(1);
  display.setCursor(92, 48);
  display.print("IF:");
  display.setCursor(92, 57);
  display.print(interfreq);

  display.print("k");
  display.setTextSize(1);
  display.setCursor(110, 23);
  if (freq < 1000000) display.print("kHz");
  if (freq >= 1000000) display.print("MHz");
  display.setCursor(110, 33);
  if (interfreq == 0)
  display.print("VFO");
  if (interfreq != 0) display.print("L O");
  display.setCursor(91, 28);
  if (!sts) display.print("RX"); if (!sts) interfreq = IF;
  if (sts)  display.print("TX"); if (sts) interfreq = 0;
  bandlist(); drawbargraph();
  display.display();
}

void bandlist() {
  display.setTextSize(2);
  display.setCursor(0, 25);
  if (count == 1) display.print("GEN"); 
  if (count == 2) display.print("LW"); 
  if (count == 3) display.print("MW"); 
  if (count == 4) display.print("160m");
  if (count == 5) display.print("80m"); 
  if (count == 6) display.print("60m"); 
  if (count == 7) display.print("49m"); 
  if (count == 8) display.print("40m");
  if (count == 9) display.print("31m"); 
  if (count == 10) display.print("25m"); 
  if (count == 11) display.print("22m"); 
  if (count == 12) display.print("20m");
  if (count == 13) display.print("19m"); 
  if (count == 14) display.print("16m"); 
  if (count == 15) display.print("13m"); 
  if (count == 16) display.print("11m");
  if (count == 17) display.print("10m");
  if (count == 18) display.print("6m"); 
  if (count == 19) display.print("WFM");
  if (count == 20) display.print("AIR");
  if (count == 21) display.print("2m");
  if (count == 22) display.print("1m");
  if (count == 1) interfreq = 0; 
  else if (!sts) interfreq = IF;
}

void
  sgnalread() {
  smval = analogRead(adc); x = map(smval, 0, S_GAIN, 1, 14); if (x > 14) x = 14;
}

void drawbargraph() {
  byte y = map(n, 1, 42, 1, 14);
  display.setTextSize(1);

  //Pointer
  display.setCursor(0, 48);
  display.print("TU");
  switch (y) {
    case  1: display.fillRect(15, 48, 2, 6, WHITE); break;
    case  2: display.fillRect(20, 48, 2, 6, WHITE); break;
    case  3: display.fillRect(25, 48, 2, 6, WHITE); break;
    case  4: display.fillRect(30, 48, 2, 6, WHITE); break;
    case  5: display.fillRect(35, 48, 2, 6, WHITE); break;
    case  6: display.fillRect(40, 48, 2, 6, WHITE); break;
    case  7: display.fillRect(45, 48, 2, 6, WHITE); break;
    case  8: display.fillRect(50, 48, 2, 6, WHITE); break;
    case  9: display.fillRect(55, 48, 2, 6, WHITE); break;
    case 10: display.fillRect(60, 48, 2, 6, WHITE); break;
    case 11: display.fillRect(65, 48, 2, 6, WHITE); break;
    case 12: display.fillRect(70, 48, 2, 6, WHITE); break;
    case 13: display.fillRect(75, 48, 2, 6, WHITE); break;
    case 14: display.fillRect(80, 48, 2, 6, WHITE); break;
  }

  //Bargraph
  display.setCursor(0, 57);
  display.print("SM");
  switch (x) {
    case 14: display.fillRect(80, 58, 2, 6, WHITE);
    case 13: display.fillRect(75, 58, 2, 6, WHITE);
    case 12: display.fillRect(70, 58, 2, 6, WHITE);
    case 11: display.fillRect(65, 58, 2, 6, WHITE);
    case 10: display.fillRect(60, 58, 2, 6, WHITE);
    case  9: display.fillRect(55, 58, 2, 6, WHITE);
    case  8: display.fillRect(50, 58, 2, 6, WHITE);
    case  7: display.fillRect(45, 58, 2, 6, WHITE);
    case  6: display.fillRect(40, 58, 2, 6, WHITE);
    case  5: display.fillRect(35, 58, 2, 6, WHITE);
    case  4: display.fillRect(30, 58, 2, 6, WHITE);
    case  3: display.fillRect(25, 58, 2, 6, WHITE);
    case  2: display.fillRect(20, 58, 2, 6, WHITE);
    case  1: display.fillRect(15, 58, 2, 6, WHITE);
  }
}

void statup_text() {
  display.setTextSize(1); 
  display.setCursor(13, 18);
  display.print("Si5351 VFO/RF GEN");
  display.setCursor(6, 40);
  display.print("JCR RADIO - Ver 2.0");
  display.display(); 
  delay(2000);
}

Так это же не он, если судить по 87 строке…

Он и есть. Просто я закомментировал 87 строку, что бы скетч рабочий был, иначе начальный экран выводится на дисплей и всё.