обратный отсчёт времени с выводом на дисплей ST7920
- Войдите на сайт для отправки комментариев
Ср, 11/05/2016 - 07:52
Всем привет. Начнём с начала есть задача выводить на дисплей обратный отсчёт времени. Время задаётся вручную в формате: 00часы 00минуты 00 секунды. Работаю в протеусе так как дисплея на руках пока нет. Проблема в следующем сделал простенький алгоритм обратного отсчёта. Проверил его через порт работает отменно, но как только я начинаю его выводить на дисплей он зависает. Не могу понять в чём причина в протеусе или в коде.
Собственно код:
#include "U8glib.h" U8GLIB_KS0108_128 u8g(22, 23, 24, 25, 26, 27, 28, 29, 37, 33, 34, 36, 35); byte t1[6] {1, 0, 0, 1, 0, 1}; // заданное время unsigned long i = 0; byte m = 0; byte h = 0; unsigned long x = 0; unsigned long s = 0; void setup() { x = t1[0] * 10 + t1[1] + t1[2] * 10 * 60 + t1[3] * 60 + t1[4] * 10 * 60 * 60 + t1[5] * 60 * 60;// переводим время в секунды Serial.begin(9600); } void loop() { u8g.firstPage(); do { u8g.setFont(u8g_font_6x13); u8g.setPrintPos(20, 40); u8g.print("hello"); Serial.println ("hello"); delay (100); while (x > 0) { s = x; //секунды h = 0; m = 0; Serial.println(x); while (s >= 3600) {//часы s -= 3600; h++; }; while (s >= 60) {//минуты s -= 60; m++; }; u8g.setPrintPos(20, 40); u8g.print(h); u8g.setPrintPos(52, 40); u8g.print(m); u8g.setPrintPos(84, 40); u8g.print(s); Serial.println (s); x--; delay (500); } } while ( u8g.nextPage() ); }
Возможно, проблема в том, что метод u8g.print() принимает значение byte, а переменная s у Вас имеет тип unsigned long. Попробуйте закоментировать строки 38 и 39.
В чем причина разделения заданного времени на десятки и единицы?
Спасибо за ответ, но не помогло. Просто это кусок другой программы, в которой ввод осуществляется двумя кнопками одна инкрементирует значение другая декрементирует. Поэтому сделал разделения что бы удобнее было вводить время. То есть отдельно вводим десятки потом единицы вместо того что бы держать кнопку.
А вас не смущает, что вы юзаете
U8GLIB_KS0108_128
тогда как дисплей у вас на контроллере ST7920? Надо бы юзать что-то типа U8GLIB_ST7920_128X64_1X
Нет, не смущает. Если вы внимательно прочтете мой пост там написано, что я работаю пока в протеусе, так как нет экрана под рукой. А в протеусе экрана с контроллером ST7920 нет, есть только ks0108. Я полазил по сайтам почитал и увидел, что люди так и отлаживают программы. Потом просто выставляют другую инициализацию.
Ок, фиг с ним с ks0108, пусть будет. delay внутри цикла отрисовки - ЗАЧЕМ? В документации к u8glib чётко сказано, что внутри цикла отрисовки не должно быть никаких ресурсоёмких функций, делей там совсем не к месту (пусть не ресурсоёмкий - но он тормозит выполнение цикла отрисовки). Вас и это не смущает?
Хорошо, спасибо за ответ. Раньше не смущал теперь смущает. Вроде много чего прочитал про эту библиотеку, но данного аспекта не знал. Видимо так читал. Завтра попробую убрать delay. Сделаю задержку по другому.
Если нужна задержка - её надо выносить из цикла отрисовки. Если при отрисовке надо сразу не всё выводить - конечные автоматы наше всё ;)
Если по ссылке речь о Ваша библиотеке, то вывода текста, в приведенном примере, отличается от Вашего. Может дело в неправильном использовании библиотеки?
В данной библиотеке текст можно выводить двумя способами. Мож так как в примере по ссылке, а можно и так как у меня. В основной программе я вывожу именно так как написано у меня в скетче, и нет не каких проблем.
Кажется, я понял, в чём проблема. В данной библиотеке вывод на экран осуществляется по достижению строки
А цикл while в моём скетче не даёт программе выйти туда. Если я циклы while меня на if программа начинает выводить данные, но с тормозами. С этим мне помо DIYMan. Подсказав про delay. Вопрос теперь такой можно ли как-нибудь все-таки использовать while? Это нужно, потому что в основной программе у меня очень большой код и если использовать if время будет отрабатываться не корректно. Или просто подогнать задержку?