А это уже дело каждого. Я держу массив из 80 элементов в контроллере и постоянно "обновляю" информацию на экране.Anjey_N писал(а):Тогда у меня ещё вопрос. Например я хочу выводить в первой строке показания часов. ЧЧ-ММ-СС. Мне нужно каждую секунду выводить всю строку или нарисовать один раз кадр: __ --__--__, а потом выводить раз в секунду значения секунд, раз в минуту значения минут ну и т.д. на указанное место?
LCD - индикатор, проблемы
-
BerZerK-ku
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
- Реклама
- Anjey_N
- Первый раз сказал Мяу!
- Сообщения: 28
- Зарегистрирован: Сб ноя 03, 2007 20:15:42
- Откуда: Энергодар, Украина
Привет всем!
Вот хочу вывести показания часов на индикатор. Опрашиваю часовую м/с DS1307/ Получаю масив rtc[]={секунды, минуты, часы, день недели,дата, месяц, год}. На индикатор вывожу часы, минуты и дату вывожу цифрами, а день недели и месяц словами.
Но похоже я пошёл по сложному пути.
Наверное было бы правильней формировать буфер для вывода строки и эту строку уже выводить на индикатор. Только как это правильно сделать, не знаю!
Как вы в своих устройствах выводили данные на индикатор?
Вот хочу вывести показания часов на индикатор. Опрашиваю часовую м/с 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;
}
/*******************************************************************************/
Как вы в своих устройствах выводили данные на индикатор?
Может я в чём-то и не прав, но это моё мнение
- Anjey_N
- Первый раз сказал Мяу!
- Сообщения: 28
- Зарегистрирован: Сб ноя 03, 2007 20:15:42
- Откуда: Энергодар, Украина
Уважаемые коты! Можно ещёодин вопрос?
Есть функция
И вот же она в основной программе put_str_flash(buffer, "Привет", 16);
Вот на это компилятор выдаёт:
Error[Pe167]: argument of type "char *" is incompatible with parameter of type "unsigned char __flash *" .(аргумент типа "char" несовместим с параметром типа unsigned char __flash ? Как это понять? И как это избежать?
Есть функция
Код: Выделить всё
/*******************************************************************************/
// Функция копирует в буфер 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
/*******************************************************************************/
Вот на это компилятор выдаёт:
Error[Pe167]: argument of type "char *" is incompatible with parameter of type "unsigned char __flash *" .(аргумент типа "char" несовместим с параметром типа unsigned char __flash ? Как это понять? И как это избежать?
Может я в чём-то и не прав, но это моё мнение
Понимать примерно так:Anjey_N писал(а):Уважаемые коты! Можно ещёодин вопрос?
...
Вот на это компилятор выдаёт:
Error[Pe167]: argument of type "char *" is incompatible with parameter of type "unsigned char __flash *" .(аргумент типа "char" несовместим с параметром типа unsigned char __flash ? Как это понять? И как это избежать?
Аргумент типа указатель на char не совместим с параметром типам указатель на размещенный во флеш памяти char . Скорее всего нельзя использовать слово "Привет" в явном виде в аргументах функции (хотя может и другое что-то). Попробуйте определить строку символов "Привет" в флеш-памяти и затем передать в функцию указатель на нее.
- Реклама

