LCD - индикатор, проблемы

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Сообщение BerZerK-ku »

Anjey_N писал(а):Тогда у меня ещё вопрос. Например я хочу выводить в первой строке показания часов. ЧЧ-ММ-СС. Мне нужно каждую секунду выводить всю строку или нарисовать один раз кадр: __ --__--__, а потом выводить раз в секунду значения секунд, раз в минуту значения минут ну и т.д. на указанное место?

А это уже дело каждого. Я держу массив из 80 элементов в контроллере и постоянно "обновляю" информацию на экране.
Аватара пользователя
Anjey_N
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Сб ноя 03, 2007 20:15:42
Откуда: Энергодар, Украина

Сообщение Anjey_N »

Привет всем!
Вот хочу вывести показания часов на индикатор. Опрашиваю часовую м/с DS1307/ Получаю масив rtc[]={секунды, минуты, часы, день недели,дата, месяц, год}. На индикатор вывожу часы, минуты и дату вывожу цифрами, а день недели и месяц словами.

Код: Выделить всё


/******************************************************************************/
//  Вывод на индикатор данных времени
void put_time_lcd(unsigned char a)
{
  send_data(lcd_kod(a >> 4));
  send_data(lcd_kod(a & 0x0F));
}

/******************************************************************************/
//  Вывод на индикатор "день недели"
void put_day_lcd(unsigned char a)
{
  switch  (a)
  {
    case  1 : show_str(" Пн "); break;
    case  2 : show_str(" Вт "); break;
    case  3 : show_str(" Ср "); break;
    case  4 : show_str(" Чт "); break;
    case  5 : show_str(" Пт "); break;
    case  6 : show_str(" Сб "); break;
    case  7 : show_str(" Вс "); break;
  default:  break;
  }
}

/******************************************************************************/
//  Вывод на индикатор "месяц"
void put_month_lcd(unsigned char a)
{
  switch  (a)
  {
    case  1   : show_str("янв"); break;
    case  2   : show_str("фев"); break;
    case  3   : show_str("мар"); break;
    case  4   : show_str("апр"); break;
    case  5   : show_str("мая"); break;
    case  6   : show_str("июн"); break;
    case  7   : show_str("июл"); break;
    case  8   : show_str("авг"); break;
    case  9   : show_str("сен"); break;
    case  16  : show_str("окт"); break;
    case  17  : show_str("ноя"); break;
    case  18  : show_str("дек"); break;
  default:  break;
  }
}
/*******************************************************************************/
// Прорисовка кадра 0
void videokadr_0(void)
{
  send_command(LCD_CLEAR);
//  В верхней строке формируем число, месяц, день недели и время
  goto_str_pos(1,0);
  put_time_lcd(rtc[4]);       //  выводим дату
  put_month_lcd(rtc[5]);      //  выводим месяц
  put_day_lcd(rtc[3]);        //  выводим день
  put_time_lcd(rtc[2]);       //  выводим часы
  if(l == !0) show_str("-");
    else show_str(" ");
    l = !l;                   //  переменная мигания (частота - 2 Гц)
  put_time_lcd(rtc[1]);       //  выводим минуты
//  В нижней строке формируем температуру на улице и в помещении
 // goto_str_pos(2,0);
 // show_str("У=       П=     ",0);
  //goto_str_pos(2,2);
 // put_temperatura(tds1);
 // goto_str_pos(2,12);
 // put_temperatura(tds2);
}

/*******************************************************************************/
//  Вывод строки на дисплей
void show_str(unsigned char *s)
{
  while(*s != 0) send_data(get_lcd_rus_char(*s++));
 
}

/*******************************************************************************/
//  Перевод данных в код индикатора
unsigned char lcd_kod(unsigned char data)
{
  return data + 0x30;
}

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

Но похоже я пошёл по сложному пути. :cry: Наверное было бы правильней формировать буфер для вывода строки и эту строку уже выводить на индикатор. Только как это правильно сделать, не знаю!
Как вы в своих устройствах выводили данные на индикатор?
Может я в чём-то и не прав, но это моё мнение
Аватара пользователя
Anjey_N
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Сб ноя 03, 2007 20:15:42
Откуда: Энергодар, Украина

Сообщение Anjey_N »

Уважаемые коты! Можно ещёодин вопрос?
Есть функция

Код: Выделить всё

/*******************************************************************************/
//  Функция копирует в буфер buf строку  str из FLASH
//  Общее количество скопированных символов не будет превышать len
//  Если размер str меньше len, то буфер будет заполнен пробелами
void put_str_flash(unsigned char *buf, unsigned char __flash *str, unsigned char len)
{
unsigned char i;
  for(i = 0; i < len; i ++)
  {
    if(*str != 0) *buf++ = *str++;
      else *buf++ = ' ';
  }
} //  end put_str_flash

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

И вот же она в основной программе put_str_flash(buffer, "Привет", 16);
Вот на это компилятор выдаёт:
Error[Pe167]: argument of type "char *" is incompatible with parameter of type "unsigned char __flash *" .(аргумент типа "char" несовместим с параметром типа unsigned char __flash ? Как это понять? И как это избежать?
Может я в чём-то и не прав, но это моё мнение
smac
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

Anjey_N писал(а):Уважаемые коты! Можно ещёодин вопрос?
...
Вот на это компилятор выдаёт:
Error[Pe167]: argument of type "char *" is incompatible with parameter of type "unsigned char __flash *" .(аргумент типа "char" несовместим с параметром типа unsigned char __flash ? Как это понять? И как это избежать?

Понимать примерно так:
Аргумент типа указатель на char не совместим с параметром типам указатель на размещенный во флеш памяти char . Скорее всего нельзя использовать слово "Привет" в явном виде в аргументах функции (хотя может и другое что-то). Попробуйте определить строку символов "Привет" в флеш-памяти и затем передать в функцию указатель на нее.
Аватара пользователя
Anjey_N
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Сб ноя 03, 2007 20:15:42
Откуда: Энергодар, Украина

Сообщение Anjey_N »

Последовал совету - всё работает. Спасибо
Может я в чём-то и не прав, но это моё мнение
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»