Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: 44780 , вывод изменяющихся значений
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
pavel-pervomaysk
Добрый вечер всем !
Возникла проблемка при работе с жки , у меня проэкт ATmega8515 + LM7001 + PML009A , (возможно) напишу с чей то помощью .
Проблема собственно такая : с книги скопировал исходник для работы с ЖКИ под 8 бит , переделал его под 4 бита режим , не совсем супер , но работает 05.gif Проблема в том что данные находящиеся во флеше выводятся на экран , а вот к примеру сделать строчку *Volume 00* и чтобы потом с помощью инкремента и декремента менять значения допустим 0 ..... 62 , никак ума не хватает wub.gif
Исходник свой прилагаю , буду рад пинка в нужном направлении twak.gif
rezident
Цитата(Павлик @ Aug 6 2008, 00:31) *
а вот к примеру сделать строчку *Volume 00* и чтобы потом с помощью инкремента и декремента менять значения допустим 0 ..... 62 , никак ума не хватает wub.gif
Используйте команды LCD для позиционирования курсора и выводите число в нужную позицию. Или проблема не в этом?
pavel-pervomaysk
Курсор выставить в нужное место могу , он мигает , а вот получить результат не могу , не пойму правильной логики работы wacko.gif
haker_fox
Цитата(Павлик @ Aug 6 2008, 13:51) *
Курсор выставить в нужное место могу , он мигает , а вот получить результат не могу , не пойму правильной логики работы wacko.gif

Так, а что мешает после установки курсора в нужное место, вывести туда число?
У Вас затруднения с выводом числа на ЖКИ?
Как я понял, Вы водите на ЖКИ строоку из флеша "Volume 00"? Далее Вы хотите измениять 00, чтобы получить к примеру "Volume 01", "Volume 62"?
Вот такой код я используя для вывода целого знакового числа на ЖКИ
Код
void THD44780Service::WriteInt(int32_t figure, bool Zero)
{
  uint8_t buff[10];
  uint8_t i = 0;
  int32_t tmp = figure;

  if(!tmp)
        WriteByte(LCD_ZERO, LCD_DTA);
    if(tmp < 0)
      {
          WriteByte(LCD_MINUS, LCD_DTA);
          tmp*= -1;
      }
    if((tmp < 10) && Zero)
        WriteByte(LCD_ZERO, LCD_DTA);
    while(tmp)
        {
            buff[i++] = tmp % 10;
            tmp/= 10;
        }
    while(i--)
        WriteByte((uint8_t)(buff[i] + LCD_ZERO), LCD_DTA);
}

WriteByte - это функция вывода байта на ЖКИ. Как видно здесь выводятся только данные, не команды (второй параметр WriteByte == LCD_DTA).
x-men
Цитата(Павлик @ Aug 6 2008, 10:51) *
Курсор выставить в нужное место могу , он мигает , а вот получить результат не могу , не пойму правильной логики работы wacko.gif

Задачу надо разбить на несколько элементарных функций, пусть это будет и не самым коротким вариантом, зато при хорошем понимании можно с первого раза достичь желаемого.
Во первых надо выделить буфер переменных данных, в который уже складывать данные в кодах 44780. А далее функции установки начала строки (если их 2 или 4). Определить начальное место в строке для вывода переменной и записать туда содержимое буфера. Функцию очистки знакомест вывода. "Volume" выводить функцией вывода табличного значения во всю строку с 20h, где нет букв.
Некоторые предпочитают выводит содержимое всей строки, обновляя ее целиком.
Все должно получится. Реализацию на сях правда не делал. Года 4 назад на асме для адука делал тоже самое.
haker_fox
Цитата(x-men @ Aug 6 2008, 15:38) *
Во первых надо выделить буфер переменных данных, в который уже складывать данные в кодах 44780.

А зачем буфер?
Если задачу разбить на функции, как Вы предлагаете, что верно! то буфер-то и не нужен: он уже есть внутри ЖК индикатора и называется DDRAM.
Нужно делать вот что:
1. Установить нужное значение переменной. С помощью кнопок, энкодера, через UART, программно - не важно.
2. Очистить дисплей.
3. Вывести строку "Volume: ". В конце пробел!.
4. Вывести число, используя функцию подобную той, что я выше привел.
Это немного не оптимальный (обновляем всю строку), но наиболее интуитивно понятный метод.
Либо вывести строку "Volume: " один раз, но устанавливая курсор в нужную позицию выводить туда переменную.
pavel-pervomaysk
haker_fox на С это все красиво , но я пишу на асме и не понимаю чесно говоря С .
Спасибо пока за советы , сегодня буду вечером пробовать , о результатах отпишусь .
haker_fox
Цитата(Павлик @ Aug 6 2008, 19:46) *
но я пишу на асме и не понимаю чесно говоря С .

А вообще (ИМХО) - зря sad.gif Си учить нужно.
Может быть самое время начать? smile.gif
pavel-pervomaysk
Цитата(haker_fox @ Aug 6 2008, 15:25) *
А вообще (ИМХО) - зря sad.gif Си учить нужно.
Может быть самое время начать? smile.gif


Я вполне согласен a14.gif , чтобы не флудить , о результатах отпишу beer.gif
Dmitry_Od
В 44780 возможно указание адреса в DDRAM и запись нужного байта соответственно по указанному адресу сразу в память, не через регистры, а при последующем "кадре" на жки всё будет видно.

Если работаешь с АСМом, проще некуда, да и размер программы небольшой
ILYAUL
Небольшая лепта 44780+I2C
pavel-pervomaysk
Разобрался я ребята , спасибо за подсказки beer.gif
у меня получилось так :

ldi data,0x80+8 // первая стока + нужное знакоместо
rcall wait_lcd // джем готовности жки
rcall lcd_cmd // передаем команду

ldi data,0xXX // загружаем данные
rcall print_char // выводим их

ldi data,0xС0+8 // вторая стока + нужное знакоместо
rcall wait_lcd // джем готовности жки
rcall lcd_cmd // передаем команду
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.