Содержание
Урок 1. Первый проект
Урок 2. Управление кнопками
Урок 3. Подключение LCD
Урок 4. Использование ШИМ
Урок 5. Таймеры
Урок 6.1. Статическая индикация
Урок 6.2. Динамическая индикация
Урок 7.1. Генерация звука
Урок 7.2. Генерация звука. Продолжение
Урок 8.1. Передача данных через UART
Урок 8.2. Передача данных через UART. Продолжение»
Урок 9. Передача данных через SPI
Урок 10. Изучение АЦП. Простой вольтметр
Урок 11. Получение синуса при помощи ШИМ
Урок 12. Измерение температуры
Урок 13. Внешние прерывания.
Урок 14. Использование отладчика
Урок 15.1. Управление инкрементальным энкодером
Урок 15.2. Управление громкостью, при помощи энкодера
Урок 16. Управление RGB светодиодом
Урок 17. Использование ИК
Урок 18.1. Знакомство с графическим дисплеем
Урок 18.2 Вывод изображения на графический дисплей
Урок 18.3 Вывод русскоязычного текста
Урок 19. Формирование сигнала, при помощи ЦАП (R2R)
Урок 20. Опрос матричной клавиатуры
Урок 21. Сторожевой таймер
Урок 22.1 Воспроизведение wav. Введение.
Урок 22.2 Воспроизведение wav. Продолжение.
Урок 23.1 Работа с внешней памятью
Урок 23.2 Работа с файловой системой Fat

Продолжаю ковырять графический дисплей (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_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,"НАЧИНАЮЩИХ");
      }
}

Результат:

glcd_rus

Прошивку можно скачать здесь:

Update: поясняющая картинка, как получаются буквы
alfabet

47 комментариев: Урок 18.3. Вывод русскоязычного текста на GLCD

  • Я конечно новичок, мне стало интересно утверждение 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&

  • в 3 уроке есть, если в дисплее не зашит алфавит, то никак

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Свежие записи
Последние комментарии
  • Загрузка...
Архивы
Счетчик
Яндекс.Метрика