Продолжаю ковырять графический дисплей (GLCD), теперь можно с уверенностью сказать, что с выводом русского алфавита на дисплеи с контроллером ks0108, более менее все понятно.
В целом ничего нового, все буквы хранятся в виде массива, аналогично картинкам. Массив выглядит так:
flash unsigned char font[]={ 0x05, 0x07, 0x20, 0xC0 #ifndef _GLCD_DATA_BYTET_ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, .... #else 0x00,0x00,0x00,0x00,0x00, .... #endif }; |
Первый элемент массива — ширина символов, второй — высота символов, третий — номер первого символа по таблице кодировки — ASCII. Четвертый — количество символов. Далее идет описание графики, как она хранится, было написано в предыдущей статье.
Когда вы в основной программе указываете символ, то высчитывается смещение и по которому из этого массива выдергивается графика. Поэтому, пришлось все специальные символы забивать нулями.
Сам алфавит можно нарисовать в LCD Vision, но из за ограничений бесплатной версии выглядит это все весьма утомительно.
Работа с текстом сложностью не отличается, для вывода строки используется функция
glcd_outtextxy(25,30,"ПРИВЕТ"); |
Первый аргумент — координата по Х, второй — координата по У. Далее пишите желаемый текст и наслаждаетесь результатом. Координаты отсчитываются относительно верхнего левого угла. Для вывода русского алфавита, нужно подключить библиотеку, в которой содержится массив с графикой. Библиотека лежит в папке с проектом под именем font5x7rus.h. Пока что организован вывод только ПРОПИСНЫХ букв, строчные чуть позднее добавлю.
По прошивке особо комментировать нечего, вместо символа можно написать его номер, т.е. ‘А’ будет равнозначно 0xC0. Чтобы разобраться в этом посмотрите ASCII. На других дисплеях пока не тестировал, но на ks0108 вроде работает исправно.
#include <mega8.h> #include <glcd.h> #include <font5x7rus.h> //библиотека с русскоязычной графикой int i=0,x=0, y=0; void main(void) { GLCDINIT_t glcd_init_data; PORTB=0x00; DDRB=0x00; PORTC=0x00; DDRC=0x00; PORTD=0x00; DDRD=0x00; // Specify the current font for displaying text glcd_init_data.font=font5x7; //font5x7; glcd_init(&glcd_init_data); while (1) { for(i=0;i<33;i++) //выводим все буквы алфавита { if(i==20) //после 20 буквы переходим в 0, чтобы на залезть за экран. { y=10; x=0; } glcd_putcharxy(x*6,y,0xC0+i); x++; } y=0; x=0; glcd_outtextxy(25,30,"AVR-START.RU"); //выводим строку в указанной координате glcd_outtextxy(15,40,"ЭЛЕКТРОНИКА ДЛЯ"); glcd_outtextxy(30,50,"НАЧИНАЮЩИХ"); } } |
Результат:
Прошивку можно скачать здесь:
Я конечно новичок, мне стало интересно утверждение Dimamima. Я просто решил проверить в симуляторе Atmel Studio. И скажу что возвращаемые значение & sim[n] и sim[n] абсолютно разные & sim[n] возвращает значение из массива именно то что мне нужно, а sim[n] возвращает хрен знает что, (я ведь новичок по этому не знаю что за значение).
ether — у спасибо, у меня есть эта книга сам и почитаю.
Андрей, а как Вы тестировали эти две разные записи (с & и без него)? Просто в своем готовом коде или писали что-то отдельно?
Для ether:Да в готовом коде, есть запись:
h=pgm_read_byte(&sim[0]); в данном случае возвращает мне число из массива 21 (что нужно), потом написал так :
h=pgm_read_byte(sim[0]); возвращает мне число 148 которое непонятно откуда взялось, может из того же массива не знаю. Да и не важно. Для меня очевидно одно & sim[n] и sim[n] не одно и тоже, об остальном почитаю в книге и по экспериментирую в симуляторе и на контроллере.
Ребята, доброго времени суток. Хочу внести некоторую ясность в рассуждениях о масивах. h=pgm_read_byte(&sim[0]); Переменной h присваивается значение которое возвратит функция pgm_read_byte, есть такое понятие передача аргумент вункции в виде масивов (один из вариантов), возможно число 148 которое взялось ниоткуда является адресом указателя можно проверить если вывести значение указателя как адрес(не разыменовывая)
а как выводить рускоязычный текст на 16×02&
LCD
в 3 уроке есть, если в дисплее не зашит алфавит, то никак
Здравствуйте! Хотелось бы узнать, а как в графическом ЖКИ выводить значение температуры
от датчика DS18B20, какую функцию glcd нужно использовать чтоб поместить в нее переменную температуры. На символьном ЖКИ все понятно.
temper=ds18b20_temperature(0);
sprintf(lcd_buf,»t=%.1f\xdfC»,temper);
lcd_clear();
lcd_puts(lcd_buf);
Можете ли Вы мне написать код для графического ЖКИ по выводу температуры.
после sprintf у вас в lcd_buf уже лежит преобразованная строка, дальше можете посимвольно выводить
Используя вашу библиотеку вывел текст, слова почемуто вперемешку
Дмитрий
вы на форуме бываете еще?