Бегущая строка в LCD на HD44780.

 

Поиск "готового решения" бегущей строки на Си результата не дал. Поэтому пришлось делать самому.

Этот "кусок" кода позволяет выводить бегущую строку (справа-налево), в любом месте и с использованием любого количества знакомест, в LCD индикаторах с контроллером HD44780 или аналогичном.

Первое, на чем нужно остановиться, это то, что язык Си не позволяет работать со строками "напрямую". То есть невозможно скопировать символ из одной строки в другую при помощи оператора присваивания (=)... для этого нужно использовать специальную функцию strncpy(). Вообще говоря, для работы со строками в Си используются несколько функций. В самоМучителях использованию этих функций посвящена отдельная глава. В Help'e на CV_AVR описание функций для работы со троками находится в разделе " String Functions". Прототипы этих функций находятся в файле string.h.

"...исходная строка..." - строка символы из которой нужно выводить в "бегущей" строке;

"...отображаемые символы..." - собственно "бегущая строка".

Для организации бегущей строки выбран такой алгоритм:

1. Отображаемые символы сдвигаются справо налево. Крайний левый при этом "теряется".

2. После сдвига, в крайний правый символ копируется очередной символ из исходной строки.

3. При достижении конца исходной строки, очередным становится первый символ исходной строки.

Для сдвига символов - для сдвигаемой ячейки считывается код символа из экранного ОЗУ (DDRAM) HD44780 и записывается в левостоящую ячейку ОЗУ.

Согласно DataSheet на HD44780 левый символ верхней строки имеет адрес в DDRAM - 0x00, а левый символ нижней строки - 0x40. При этом нужно помнить, что для того чтобы обратиться именно к экранному ОЗУ (а не к ОЗУ знакогенератора) необходимо чтобы бит RS был равен 1 (RS является старшим битом в байте адреса см.DataSheet).

В итоге получаем, что для того чтобы "обратиться" ко второму слева символу верхней строки необходимо "работать" с адресом 0x01 | 0x80 = 0x81.

Функции записи и чтения "внутреннего содержимого" HD44780 есть в библиотеке (прототипы в lcd.h ).... поэтому ..собственно программа:

 

/* для CV_AVR

В данном примере бегущая строка выводиться в разряды с 8 (0xC7) по 16 нижней строки 16-ти разрядного индикатора.

*/

.......

#include <lcd.h>

........

unsigned char n_sim=1,m_end=43; //43 - дина строки в примере
...........

beg_stroka(){
unsigned char i;

// сдвиг бегущей строки

if(beg_str){
for(i=0;i<9;i++)lcd_write_byte(0xC7+i,lcd_read_byte(0xC8+i));
beg_str=0;

// запись очередного символа в крайний правую позицию

lcd_gotoxy(15,1);
lcd_putchar(ish_str[n_sim]);
if(++n_sim>m_end)n_sim=1;
}
}

Глоссарий:

n_sim - указатель положения текущего символа в исходной строке;

m_end - общее количество символов в исходной строке;

beg_str - бит "разрещающий" сдвиг. C его помощью можно регулировать скорость "бега";

ish_str[] - исходная строка.

 

Скорее всего, в каждом из существующих компиляторов Си имеются библиотечные функции для работы с HD44780. Поэтому "переделать" программу под "свой" компилятор не составит труда.

Исходную строку я "готовлю" при помощи известной утилиты "HD44780.exe". При ее использовании, в коментариях, указывается длина строки: "/* Maximum length of a line: 43 byte */"

 

(C)STAS633

01.07.06г.

Главная

Hosted by uCoz