UART TTL терминал на Nano + LCD5110

ma35tr0
Offline
Зарегистрирован: 28.06.2015

Всего доброго дня. Принимайте в ряды :)
Имею ардуино нано и экранчик 5110. Собрал себе UART-терминал, заменил TinyFont на SmallFont и тут все строки побежали. Скажите, как это можно исправить?
С ардуино не работал, но терминал привлек своей простотой и крайней необходимостью. При шрифте TinyFont все очень мелко и колв-во символов на строке = 21, а строк = 8. Заменил на SmallFont и получил 14 и 5 соответственно. Но смещение строк (ScreenShift) идет с задержкой в 7строк. Т.е. когда печатается уже 6-12 строки, ранние строки не идут вверх, а потом скачок.
Который день бьюсь, ничего не получается. Буду признателен, если кто откликнется.

#include <LCD5110_Graph.h> // Подключение библиотеки LCD5110_Graph
LCD5110 myGLCD(8,9,10,11,12); // SCLK, DN(MOSI), D/C, RST, SCE
extern uint8_t TinyFont[]; // Будет использоваться внешний шрифт TinyFont
char screen[168];
int currentPosition=0;
//--------------------------------
void setup()
{
  Serial.begin(9600);
  myGLCD.InitLCD(); // Инициализация дисплея
  myGLCD.setFont(TinyFont); // Установка шрифта
  myGLCD.print("Terminal v1.1 ", CENTER, 0);
  myGLCD.print("by mini-tech.com.ua", CENTER, 6);
  myGLCD.update(); // Обновление содержимого дисплея
  delay (3000);
  myGLCD.clrScr();
}
//--------------------------------
void loop()
{
byte incomeByte;  
while (Serial.available()>0) // Если в буфере Serial порта есть доступные даные 
{
  incomeByte=Serial.read(); // Считывание байта в переменную incomeByte
  switch (incomeByte)
  {
    case '\n':{
      while ((currentPosition+1)%14 != 1){
        screen[currentPosition]=' ';
        currentPosition++;}
        break;} 
    case '\r':{ 
      while ((currentPosition+1)%14 != 1){
        currentPosition--;
        screen[currentPosition]=' ';}
        break;}
    default:
      screen[currentPosition]=char(incomeByte); // Преобразование полученного байта в тип char 
      currentPosition++; // и его помещение в массив screen. Переход на след. позицию  
  }
  if (currentPosition > 167){ // Если экран заполнен
    screenShift(); // Вызов функции сдвига экрана вверх на одну строку
    currentPosition=147;} // Перемещение в начало последней строки   
}
screenPrint(screen); // Вызов функции вывода данных на дисплей
}
//--------------------------------
void screenPrint(char displayMatrix[168]) // Функция вывода данных на дисплей
{
  char line[21]; // Строка экрана
  int i, j;
  for(i=0; i<5; i++){ // Цикл для строк
    for(j=0; j<21; j++){ // Цикл для символов
       line[j]=displayMatrix[i*14+j];} // Наполнение текущей строки
    myGLCD.print(line, 0, i*10); // Печать строки в буффер дисплея
    myGLCD.update();} // Обновление содержимого дисплея
}
//--------------------------------
void screenShift()// Функция сдвига содержимого дисплея на одну строку вверх
{
for (int i=0; i<147; i++){ // Каждый символ по очереди копируется на ту же 
  screen[i]=screen[i+14];} // позицию в верхней строке
for (int i=147; i<168; i++){ // Последняя строка 
  screen[i]=' ';} // заполняется пробелами
}  
ma35tr0
Offline
Зарегистрирован: 28.06.2015

Я так понял, никому это не интересно и никто не желает помочь новичку.