Воспроизведение видео на жк от nokia с помощью atmega32

Использование цветного дисплея от Nokia 6610 | Digital Chip – Цифровые устройства

После благополучных тестов с монохромными дисплеями Nokia 1100, Nokia 1202 и т.д. появилось острое желание попробовать запустить и поиграться с цветным дисплеем – выбор пал на Nokia 6610 и ему подобных.

Различные дисплеи Nokia 6610

Почему? Есть несколько причин. Он относительно недорог (сильно зависит от ареала обитания его будущего хозяина

Источник: http://digitalchip.ru/ispolzovanie-tsvetnogo-displeya-ot-nokia-6610

Подключение дисплея к микроконтроллеру

Источник: http://radioskot.ru/publ/mk/podkljuchenie_displeja_k_mikrokontrolleru/9-1-0-702

Playing video on nokia color LCD just using an 8 bit AVR! [A mad Project 😉 ]

SD CARD + ATMEGA32 + NOKIA COLOR LCD = VIDEO PLAYER!!!

Hi,

I am introducing my new video player made using an atmega32 microcontroller and nokia color LCD. I got a 65K color LCD from an old nokia 6030 mobile phone.  I directly soldered 10 thin enamelled coper wire from the 0.5 cm square area of the thin flexible pcb of the LCD to a berg strip fixed on another board. For me it was the most difficult part of this project because I don't have any tiny tip soldering iron and an lcd connector (5×2) socket with me.

   After that I interfaced the lcd with atmega32 via SPI. Then initialized the lcd and displayed some color patterns and confirmed the LCD is working.

    Now my next step is to display a still image on the LCD. I used python image library to extract pixel information from any image file (jpeg, png etc) and I streamed it to avr via uart using pyserial and displayed the image successfully on the LCD with 16bit color depth. 

    After that I used an SD card to store the converted pixel information (132×132*2) bytes/picture. Then I interfaced the SD card with same SPI of atmega32 and displayed the image stored on it. I used FAT16 filesystem. The sd card part is not a problem for me because I have already done more projects on SD/MMC cards and I copied my previous code for that. 

    So after displaying the still image, I thought of making a slide show on the lcd.

For that I wrote a python script to convert all images in a folder (on my pc) to a 132x132x2 byte files which is nothing but the uncompressed pixel information stored as new files.

Then I copied all these converted files to SD card (file.lcd) and displayed them as an image slide show with 1 second time gap between each image.

    Since I successfully did the image slide show, then suddenly the idea of making a video player came to my mind. Because video is nothing but a slide show at high frame rate. 

Then I used ffmpeg to convert a sample video to frames at 15 frames/second & 132×65 resolution. Then I used my python script to convert each still images to pixel information at 16 bit/pixel. Here instead of making small small files, I just collected all the picture information of adjacent frames into a single file and named  as my_video.lcd.Then I copied that file to memory card and modified the avr program to display it on the LCD. It access the FAT16 file system, then search for *.lcd files and if found, it returns the starting cluster address of that file and then stream that cluster to the LCD very fast. NOW VIDEO IS PLAYED (without audio)!!!!! ….Almost half of the project is finished….
Next half: (audio mixing)

       I played 15 fps 16bit/pixel on the lcd. Now comes the next headache. Video should have audio. :-(…. Then I started thinking how to include audio. I used ffmpeg(in pc) to extract audio from the video file to 8 bit mono wav. Since wav is uncompressed audio, it is easy to handle it using a microcontroller with hardware PWM. Then I modified my python script.

I just opened the wav file and discarded the first 44 bytes (wav header) and then after that, I read the audio sample byte by byte and injected it in between the video information after some calculations(see the math below) related to the bit rate of both audio and video to decide the mixing ratio.

         For the perfect audio video synchronization, I implemented an error correction code in the converter, which monitors the synchronization error while mixing the audio-video bytes and when the error reaches a threshold value equivalent, it writes a dummy audio sample instead of real audio sample and thus prevents the accumulation of error and thus perfect audio video synchronization is achieved for hours of continuous video playback..

Now in avr, i need to extract the audio and video and need to send the audio to an audio circular buffer which will be send to PWM using a timer interrupt and video directly to LCD. If any single byte mismatch occurred between the video and audio byte, every thing will get collapsed. I then modified the avr code to do as above and finally I played video with audio! 🙂 

Math: (about audio video mixing) 

Video byte rate = 9 frames/second = 9*132*65*2 = 154440 bytes/second
Audio byte rate = 11000 bytes/second
Video sample / audio sample rate = 154440/11000 =  14.04
It means, after every 14 bytes of video, I need to put a byte of audio sample in the final video file.
So, It is fine, but there is a small problem… 14.04 means this .04 error which will accumulate on the way and will affect the audio video synchronization badly, it will be worst in long videos. To prevent this, I need to skip adding a real audio sample after every (1/.04) * 14 = 350 video bytes, when it reaches this value, I need to put a dummy audio sample, may be the previous sample itself. Thus the audio will not overtake the video due to the .04 error and thus audio video synchronization is achieved…

LCD controller:

     I believe the LCD which I got from the original nokia phone have Philips PCF8833 controller. Because I did the coding according to that controller specifications. In some example codes, I found we need display invertion command, but in my case don't know why, no need to use display inversion.

Note:

The python script is written for linux OS with python 2.x

AVR C code is written for AVR-GCC compiler in linux. 

Photos:

Circuit diagram:

Source code for ATmega32 (avr-gcc)

Источник: http://blog.vinu.co.in/2012/06/avr-video-player-on-nokia-color-lcd.html

TV – дисплей

Любительская измерительная схема на микроконтроллере,

с программной конвертацией информации  в виде текста, на экран телевизора  или монитора,

имеющих низкочастотный AV вход. 

Давненько уже было желание подружить, схему на МК с выводом информации на телевизионный экран.

И очень кстати  такой  интересный вариант программы, сделал товарищ Soir.

Преимущества вывода информации от схемы с МК на экран телевизора по  сравнению с дисплеем , очевиден по нескольким причинам.

Это размер такого дисплея,   доступны от 3.5″  до х”  ( цена 3.5″ от 15$, что в принципе это уже конкурентоспособное с обычными ЖК индикаторами).

За один раз количество выводимой текстовой информации, с помощью МК на такой дисплей, до 640 текстовых знаков (а это уже, вне конкуренции).

Схема №1

Программа может работать, как без внешнего источника видео сигнала  (схема №1).

И универсально,  с внешним источником  видеосигнала, текст будет наложен на ваше видео,

а так же без внешнего источника видео сигнала , текст автономно будет выведен на экран (схема №2).

Схема №2

*на схеме, входные цепи АDC измерителей показаны условно, по этим  измерительным цепям,  какое в данном случае применить схемное решение для измерений, (входные напряжения для портов МК РС0 ….. РС3  от 0 до +2 .56V) пользователь принимает решение самостоятельно.

Детали отмеченные пунктиром, можно не ставить , но на всякий случай можно предусмотреть место для их установки (R2 только для схемы №2 производит регулировку насыщенности фона под текстом, на данный момент, в программе не использован в полной мере).
Детали ATmega168, LM1881, DS1307, 2хDS18b20, кварц 16MHz

Установленные кнопки в схеме предназначены только для коррекции текущего времени и даты.

Длительным нажатие Кн2 , делаем вход в это меню коррекции, и далее Кн1 +,    Кн2 >    , Кн3-.

При правильно прошитом МК и собранной схеме, при первом запуске  схема начинает работать сразу, а на экране будет видно наложенное изображение на экране TV. 

Если понадобится подстройка : сложностей не должно возникнуть ,  подстраивается только резистор R-1. Чтобы согласовать уровни сигналов А и В.

Для примера, осциллограмма работы программы, без внешнего видеосигнала на входе. 

 

Осциллограммы А и В не регулируемые.

Выход сигналов с МК в виде осциллограмм А и В, с помощью резистора R-1 смешиваются, до вида осциллограммы С. 
Далее, сигнал в виде осциллограммы С,   идет на вход AV  телеприемника.

FUSE: Программа МК работает с внешним кварцем, на частоте 16MHz.

Несколько фото отображения информации, на мониторе 7″  и  42″.

Видео – пример http://youtu.be отображения информации на TV экране.

  Прошивка, TV – ATmega 168.

You have no rights to post comments.
Недостаточно прав для комментирования

Источник: http://sxem.org/2-vse-stati/raznoe/106-tv-displej

Дисплейный модуль на ATMega8/168/328

При разработке микроконтроллерных поделок практически всегда возникает потребность реализации пользовательского ввода и вывода.

Часто функции ввода информации берёт на себя клавиатура (реже – энкодер), а для отображения состояния устройства используются либо светодиоды, либо светодиодные семисегментные индикаторы, либо ЖК-дисплеи (текстовые вроде 16х2 или графические).

Последний вариант часто выигрывает по соотношению цена/возможности если использовать недорогой экран от телефонов Nokia 5110. Разрешающая способность экрана 84х48 позволяет выводить до 5 строк текста длиной до 16 символов. Естественно, помимо текста можно выводить и графику.

С таким экраном обычно можно реализовать горазо более удобный пользовательский интерфейс, по сравнению с экранами 16х2, и тем более, по сравнению с семисегментными индикаторами.

Этот модуль изначально разрабатывался для тестера микросхем, но возможности его применения видятся существенно более широкими. Хотелось сделать нечто вроде ардуины, но более пригодное для практического использования (реализация подобного функционала на ардуине как правило приводит к рождению макаронноно монстра из нескольких плат и кучи проводов).

Схема и описание

Модуль содержит:

  • микроконтроллер ATMega8/168/328
  • дисплей nokia 5110
  • 5-кнопочный джойстик
  • бипер или динамик
  • UART-разъём, через который модулем можно управлять (может работать с сигналами как 3В так и 5В, т.к. имеется преобразователь уровня на транзисторе VT1)
  • пять линий ввода/вывода (среди которых три входа АЦП и два вывода ШИМа) плюс 2 отдельных вывода АЦП
  • стабилизатор напряжения на 3.3В

Схема модуля

Печатные платы

В итоге получилась компактная плата, на основе которой можно создать множетсво простых автономных вещей подключив всего несколько деталей (например, метеостанцию, или другие измерительные проборы).

Либо можно использовать модуль в составе другой микроконтроллерной системы, подключив его двумя проводами по интерфейсу UART.

В частности, модуль можно легко подключить к ПК через преобразователь USB to UART, что удобно, например, для быстрой разработки прототипов пользовательского интерфейса – можно по-быстрому набросать программу управления на каком-нибудь питоне, и при этом нет необходимости постоянного перепрограммирования микроконтроллера.

Печатные платы модуля

Также сделал расширенную версию платы с монтажным полем и дополнительной кнопкой сброса.

Внешний вид модуля

Прошивка и исходники

Прошивку для модуля можно взять из репозитория тестера микросхем на гитхабе: github.com/trol73/avr-ic-tester-v2 (директория firmware/display). Для компиляции испольузется avr-builder.

В директории misc/display_python есть питоновская библиотека для работы с дисплеем на ПК и небольшой пример ее использования. В директории firmware/tester/src есть библиотека для управления модулем для AVR (файлы controller.h и controller.c).

Библиотеки позвоялют рисовать по экрану, выводить символы и строки, проигрывать звуки разной тональности и длительности, работать с клавиатурой и управлять подсветкой дисплея.

При этом, вся работа по отображению выполняется на МК дисплейного модуля, что разгружает основной МК – асинхронная передача нескольких байт по UART занимает гораздо меньше времени, чем отрисовка картинки не экране. Модуль асинхронно принимает команды и складирует их в буффер, параллельно выполняя по очереди.

Основному модулю нет необходимости ждать завершения выполнения команд – он только добавляет задачи на отрисовку и продолжает заниматься своим делом.

Если же основной модуль хочет дождаться выполнения команд, он может вызвать метод CtrSync(uint8_t code), который передаёт числовой аргумент тестеру и получает его же в ответ (эту функцию можно использовать для контроля ошибок передачи). Так же роль метода синхронизации может выполнять функция опроса клавиатуры uint8_t ReadKeyboard(uint8_t *keys). Этот методы возвращает битовую маску кодов для нажатых клавиш. Если аргумент keys не NULL, а массив размеом 5 байт, то сюда будут сохранены длительности удержания клавиш в нажатом состоянии.

Протокол взаимодействия

Дисплей управляется по интерфейсу UART, по умолчанию скорость подключения равна 57600 бод. Протокол передачи двоичный – сначала передаётся байт команды, затем, её аргументы (если они есть). Коды команд описаны в файле api_codes.

h, в комментариях там указано, сколько байт аргументов принимает команда. У некоторых команд, работающих со строками, количество байт аргументов переменно и зависит от длины строки.

Команда может возвращать данные (например, CMD_SYNC или READ_KEYBOARD).

Вот список кодов:

#define CMD_SYNC 0 // 1 bytes
#define LCD_SET_CONTRAST 1 // 1 bytes
#define LCD_CLEAR 2 // 0 bytes
#define DRAW_PIXEL_1 3 // 2 bytes
#define DRAW_PIXEL_0 4 // 2 bytes
#define INVERT_PIXEL 5 // 2 bytes
#define DRAW_LINE_1 6 // 4 bytes
#define DRAW_LINE_0 7 // 4 bytes
#define FILL_RECT_1 8 // 4 bytes
#define FILL_RECT_0 9 // 4 bytes
#define DRAW_RECT_1 10 // 4 bytes
#define DRAW_RECT_0 11 // 4 bytes
#define DRAW_CIRCLE_1 12 // 3 bytes
#define DRAW_CIRCLE_0 13 // 3 bytes
#define FILL_CIRCLE_1 14 // 3 bytes
#define FILL_CIRCLE_0 15 // 3 bytes
#define INVERT_AREA 16 // 4 bytes
#define DRAW_CHAR_XY 17 // 3 bytes
#define DRAW_CHAR 18 // 1 bytes
#define DRAW_STRING_XY 19 // variable
#define DRAW_STRING 20 // variable
#define LCD_WRITE 21 // 0 bytes
#define READ_KEYBOARD 22 // 0 bytes
#define SET_HIGHLIGHT 23 // 2 bytes
#define BEEP 24 // 3 bytes
#define DRAW_CENTERED_STRING 25 // variable
#define SET_STRING_INTERVAL 26 // 1 bytes
#define DRAW_CHAR_XY_OVER 27 // 3 bytes
#define DRAW_CHAR_OVER 28 // 1 byte
#define SET_KEYBOARD_BEEP 29 // 1 bytes

Основная группа – команды рисования DRAW_xxx, FILL_xxx, INVERT_AREA. Например, команда DRAW_CHAR_XY рисует символ в указанные координаты, после чего устанавливает текущую позицию в конец нарисованного символа. Т.е.

, если передать команде аргументы (x, y, 'A'), то буква 'A' будет нарисована с начальными координатами (x, y), а после рисования текущими координатами дисплея станут (x + 5, y), тут 5 – это ширина символа.

Команда DRAW_CHAR рисует символ в текущую позицию после чего также увеличивает текущую координату X на ширину нарисованного символа. Команды DRAW_CHAR/DRAW_STRING рисуют символы чёрным цветом по белому фону, т.е., явно затирая фон и окрашивая его в белый цвет.

Нарисовать символ не трогая фон можно командами DRAW_CHAR_OVER/DRAW_CHAR_XY_OVER. Если хочется нарисовать белый символ на чёрном фоне, то поможет команда INVERT_AREA.

Кроме команд рисования есть команда подачи звукового сигнала требуемой частоты и длительности – BEEP, управления подсветкой экрана – SET_HIGHLIGHT (подсветку пожно включить, выключить или установить авторежим, когда экран будет светится указанное время после каждого нажатия клавиши). Также можно включить режим биппера при нажатии клавиш – SET_KEYBOARD_BEEP.

Фьюзы

Ресурсы

Схема модуля в PDF
Печатная плата (Gerber-файлы)
github.com/trol73/avr-ic-tester-v2

Источник: http://trolsoft.ru/ru/sch/display-atmega8

Рассматриваем плату Iskra Neo от Амперки

Недавно к нам в Занимательную робототехнику попала плата Iskra Neo от компании Амперка. Вместе с Makerspace и Семеном Таракановым мы посмотрели на плату и спешим поделиться впечатлениями.

Итак, в апреле на актуальной волне импортозамещения российская компания Амперка анонсировала плату Iskra Neo.

Iskra Neo — платформа для разработки с микроконтроллером ATmega32U4. Она является эквивалентом итальянской Arduino Leonardo, но производится в России. Конечно, плату лишь условно можно назвать российской, потому что все ее радиоэлектронные компоненты импортные.

Заявляется, что плата не хуже по качеству, чем итальянский аналог. Iskra Neo совместима с платами расширения, датчиками и другими электронными модулями.

Цена

Это достаточно бюджетная микроконтроллерная плата — ее цена составляет 890 рублей без учета доставки.

Это дешевле, чем оригинальная итальянский Arduino Leonardo (в той же Амперке она продается за  1 790 рублей).

Одновременно, нельзя не сказать, что это несколько дороже, чем китайские клоны на AliExpress (но здесь придется долго ждать, плюс есть другие особенности, не относящиеся к теме этого обзора).

В общем и целом, цена Iskra Neo весьма привлекательна.

Внешний вид

Для начала сравним внешний вид. Вместо свойственного ардуинам и интелам синего — тут благородный светло-серый. В остальном платы визуально схожи.

Arduino Leonardo (слева) и Iskra Neo (справа)

Размер плат одинаковый. Форм-фактор совпадает. Расположение разъемов USB и питания, кнопки Reset, пинов, чипа ATmega32U4 практически идентичное.

Характеристики

Iskra Neo имеет те же характеристики, что и оригинальная Arduino Leonardo:

  • Микроконтроллер: ATmega32U4
  • Тактовая частота: 16 МГц
  • Флеш-память: 32 КБ (из них 4 КБ занято загрузчиком)
  • SRAM-память: 2,5 КБ
  • EEPROM-память: 1 КБ
  • Рабочее напряжение: 5 В
  • Рекомендуемое входное напряжение: 7–12 В
  • Максимальный ток с пина 5V: 1 А
  • Максимальный ток с пина ввода-вывода: 40 мА
  • Максимальный суммарный ток с пинов ввода-вывода: 200 мА
  • Портов ввода-вывода общего назначения: 20
  • Портов с поддержкой ШИМ: 7
  • Портов, подключенных к АЦП: 12
  • Разрядность АЦП: 10 бит
  • Аппаратные интерфейсы: UART, I²C, SPI
  • Габариты: 69×53 мм

Iskra Neo под микроскопом

Получив плату, мы  отправились в Пермский Makerspace к Семену Тараканову. Makerspace — отличное место, где можно делать различные креативные вещи. Семен знаком с производством плат и у него есть кое-что более точное чем глаза.

Далее это наши глаза

Питание на плату можно подавать, как с компьютера через microUSB-порт, так и через гнездо питания 2,1 мм. Источник определяется автоматически. В случае питания через гнездо, рекомендуемое входное напряжение от 7 до 12 В. Большое внимание у Семена вызвал островок меди с большим количеством отверстий около регулятора LD33..

На плате 20 пинов ввода-вывода, среди которых 7 с ШИМ, 12 аналоговых входов, 1 аппаратный интерфейс UART (Serial), 1 аппаратный интерфейс I2C, 5 пинов, поддерживающих аппаратное прерывание.

При работе из Arduino IDE, в настройках среды нужно выбирать плату «Arduino Leonardo».

Смотрите видео, в котором Семен расскажет подробнее об устройстве платы, ее компонентах и выдаст некоторые секреты:

Источник: http://edurobots.ru/2015/05/rassmatrivaem-iskra-neo-ot-amperki/

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}
");let k=document.querySelector(".flat_pm_modal[data-id-modal=\""+a.ID+"\"]");if(-1===d.indexOf("go"+"oglesyndication")?flatPM_setHTML(k,d):jQuery(k).html(b+d),"px"==a.how.popup.px_s)e.bind(h,()=>{e.scrollTop()>a.how.popup.after&&(e.unbind(h),f.unbind(i),j())}),void 0!==a.how.popup.close_window&&"true"==a.how.popup.close_window&&f.bind(i,()=>{e.unbind(h),f.unbind(i),j()});else{let b=setTimeout(()=>{f.unbind(i),j()},1e3*a.how.popup.after);void 0!==a.how.popup.close_window&&"true"==a.how.popup.close_window&&f.bind(i,()=>{clearTimeout(b),f.unbind(i),j()})}f.on("click",".flat_pm_modal .flat_pm_crs",()=>{jQuery.arcticmodal("close")})}if(void 0!==a.how.outgoing){let b,c="0"==a.how.outgoing.indent?"":" style=\"bottom:"+a.how.outgoing.indent+"px\"",e="true"==a.how.outgoing.cross?"":"",f=jQuery(window),g="scroll.out"+a.ID,h=void 0===flatPM_getCookie("flat_out_"+a.ID+"_mb")||"false"!=flatPM_getCookie("flat_out_"+a.ID+"_mb"),i=document.createElement("div"),j=jQuery("body"),k=()=>{void 0!==a.how.outgoing.cookie&&"false"==a.how.outgoing.cookie&&h&&(jQuery(".flat_pm_out[data-id-out=\""+a.ID+"\"]").addClass("show"),j.on("click",".flat_pm_out[data-id-out=\""+a.ID+"\"] .flat_pm_crs",function(){flatPM_setCookie("flat_out_"+a.ID+"_mb",!1)})),(void 0===a.how.outgoing.cookie||"false"!=a.how.outgoing.cookie)&&jQuery(".flat_pm_out[data-id-out=\""+a.ID+"\"]").addClass("show")};switch(a.how.outgoing.whence){case"1":b="top";break;case"2":b="bottom";break;case"3":b="left";break;case"4":b="right";}jQuery("body > *").eq(0).before("
"+e+"
");let m=document.querySelector(".flat_pm_out[data-id-out=\""+a.ID+"\"]");-1===d.indexOf("go"+"oglesyndication")?flatPM_setHTML(m,d):jQuery(m).html(e+d),"px"==a.how.outgoing.px_s?f.bind(g,()=>{f.scrollTop()>a.how.outgoing.after&&(f.unbind(g),k())}):setTimeout(()=>{k()},1e3*a.how.outgoing.after),j.on("click",".flat_pm_out .flat_pm_crs",function(){jQuery(this).parent().removeClass("show").addClass("closed")})}countMode&&(flat_count["block_"+a.ID]={},flat_count["block_"+a.ID].count=1,flat_count["block_"+a.ID].click=0,flat_count["block_"+a.ID].id=a.ID)}catch(a){console.warn(a)}}function flatPM_start(){let a=flat_pm_arr.length;if(0==a)return flat_pm_arr=[],void jQuery(".flat_pm_start, .flat_pm_end").remove();flat_body=flat_body||jQuery("body"),!flat_counter&&countMode&&(flat_counter=!0,flat_body.on("click","[data-flat-id]",function(){let a=jQuery(this),b=a.attr("data-flat-id");flat_count["block_"+b].click++}),flat_body.on("mouseenter","[data-flat-id] iframe",function(){let a=jQuery(this),b=a.closest("[data-flat-id]").attr("data-flat-id");flat_iframe=b}).on("mouseleave","[data-flat-id] iframe",function(){flat_iframe=-1}),jQuery(window).on("beforeunload",()=>{jQuery.isEmptyObject(flat_count)||jQuery.ajax({async:!1,type:"POST",url:ajaxUrlFlatPM,dataType:"json",data:{action:"flat_pm_ajax",data_me:{method:"flat_pm_block_counter",arr:flat_count}}})}).on("blur",()=>{-1!=flat_iframe&&flat_count["block_"+flat_iframe].click++})),flat_userVars.init();for(let b=0;bflat_userVars.textlen||void 0!==a.chapter_sub&&a.chapter_subflat_userVars.titlelen||void 0!==a.title_sub&&a.title_subc&&cc&&c>d&&(b=flatPM_addDays(b,-1)),b>e||cd||c-1!=flat_userVars.referer.indexOf(a))||void 0!==a.referer.referer_disabled&&-1!=a.referer.referer_disabled.findIndex(a=>-1!=flat_userVars.referer.indexOf(a)))&&(c=!0),c||void 0===a.browser||(void 0===a.browser.browser_enabled||-1!=a.browser.browser_enabled.indexOf(flat_userVars.browser))&&(void 0===a.browser.browser_disabled||-1==a.browser.browser_disabled.indexOf(flat_userVars.browser)))){if(c&&void 0!==a.browser&&void 0!==a.browser.browser_enabled&&-1!=a.browser.browser_enabled.indexOf(flat_userVars.browser)&&(c=!1),!c&&(void 0!==a.geo||void 0!==a.role)&&(""==flat_userVars.ccode||""==flat_userVars.country||""==flat_userVars.city||""==flat_userVars.role)){flat_pm_then.push(a),flatPM_setWrap(a),flat_body.hasClass("flat_pm_block_geo_role")||(flat_body.addClass("flat_pm_block_geo_role"),flatPM_ajax("flat_pm_block_geo_role")),c=!0}c||(flatPM_setWrap(a),flatPM_next(a))}}}let b=jQuery(".flatPM_sticky");b.each(function(){let a=jQuery(this),b=a.data("height")||350,c=a.data("top");a.wrap("
");let d=a.parent()[0];flatPM_sticky(this,d,c)}),debugMode||countMode||jQuery("[data-flat-id]:not([data-id-out]):not([data-id-modal])").contents().unwrap(),flat_pm_arr=[],jQuery(".flat_pm_start, .flat_pm_end").remove()}
   На сей раз хочу вам рассказать как подключить дисплей от мобильного телефона Nokia 1202 к микроконтроллеру Atmega8. Программируем в среде CodeVision. Кое где могу и ошибаться. Сам только не давно разобрался что к чему.

Опыта в программировании не имею и библиотеки для работы с дисплеем писал не я. Они скопированы с одного проекта в интернете. Там прописаны все нужные функции и есть шрифт 5*8 латинские буквы и кириллица.

Есть так же пару символов 12*16 и 24*32, которые использовал автор библиотек в своем устройстве. Если их удалить, то шрифт 5*8 будет занимать около 700 байт флеша микроконтроллера. Поэтому микроконтроллер для проекта надо брать “пожирней”.

В моем случае использована Atmega8. Вполне достаточно. Все файлы – исходники, библиотеку и так далее, качаем здесь.

Принципиальная схема подключения ЖК дисплея к МК

   Нарисовал схему подключения. Для питания дисплея нужно напряжение 3,3V. Если запитывать микроконтроллер от 5V, то ставим резисторные делители и микросхему 78L33. В случае питания всей схемы от 3,3V резисторные делители не нужны. Вроде Atmega8A может работать от 3,3V при условие, что частота не выше 8 МГц. Лично я не пробовал.

У меня все собрано на отладочной плате с питанием от 5V. Перед самим дисплеем ставить по питанию электролит большой емкости ни в коем случае не надо. В самом начале работы контроллер подает на дисплей команды инициализации. Для заряда конденсатора нужно время. Пока он зарядится и дисплей начнет работать пройдет некоторое время, и команды инициализации он не получит.

Конечно это миллисекунды, но в даном случае эффект ощутим. 

Схема распиновки дисплея

   У дисплея Nokia 1202 9-ти битный SPI интерфейс. У выбранного нами микроконтроллера такой роскоши нет. По этому для связи с дисплеем мы используем не аппаратный, а программный SPI, так сказать “ногодрыг”. Как создавать новые проекты в CodeVision рассказывать не буду – думайте сами. Скажу только, что все выводы PORTB надо настроить на выход. В настройках проекта нужно поставить галочку на “Store Global Constants in FLASH Memory”. Данное действие нужно для того, чтоб массивы шрифтов и наших картинок хранились во флеше.

   Итак, проект мы создали. Выбрали микроконтроллер, задали тактовую частоту, настроили проект. Что дальше? А дальше нужно добавить библиотеки для работы с дисплеем и библиотеки задержек. Распаковываем архив. Там есть два файла. Их нужно скопировать в определенные папки. Надеюсь CodeVision вы установили прямо на диск C:. Если да, то файлы копируем по соответствующим путям:  C:cvavrevalinc для файла 1100.inc, и C:cvavrevallib для файла 1100.h . 

   Еще хочу сказать, что назначение пинов микроконтроллера можно изменять в файле 1100.h. Тогда и схема подключения изменится. Начинаем кодить. Просто выведем какую-то надпись на дисплей основным шрифтом 5*8. В самом начале добавим библиотеки.

 #include < 1100.h> // библиотека дисплея
 #include // библиотека задержек

   В самом низу до основного цикла while(1){} делаем инициализацию дисплея и его очистку.

 lcd_init(); // инициализация дисплея
 lcd_clear(); // очистка дисплея

   Нашу надпись поставим так же до основного цикла. Пусть сперва контролер выведет послание на дисплей, а после крутится в основном цикле. Пишем вот это:

 print_string(“Выводим надпись”,5,0); print_string(“Какую сами хотим”,0,1);

 print_string(“БУХАРЬ”,10,2);

   Думаю здесь все понятно. Первая цифра – координата по оси x на дисплее. Она может принимать значение от 0 до 96. Вторая – строка. Она от 0 до 7. В принципе там помещается 8 с половиной строк, но на пол строки мы читать не будем. Компилируем и прошиваем. Смотрим результат. Можно так же установить Proteus, и протестировать в нем. Контроллер можно настроить для работы от внутреннего генератора на частоту заданную в проекте с задержкой при старте 64 мсек. Добавляю архив с скомпилированным проектом. Частота 8 Мгц.

   Но как уже писал в начале, в библиотеке есть еще и другие символы. Правда там нет букв, а только цифры. Теперь немного усложним задачу. Пусть надпись не будет инертной, а изменяется. Допустим считает от 0 до 9 с интервалом в 1 секунду. Когда дойдет до 9, после обнулится и снова наново. Возьмем цифры большие размером 24*32. Ну чтож приступим. Можно взять предыдущий проект и удалить три строки “print_string”. Сразу после добавления библиотек объявим некую глобальную переменную m.

 char m = 0;

   Можно и просто написать:

 char m;

   В даном случае ей автоматически присвоится значение 0. В основном цикле пишем вот это:

  char_24_32(m,35,2); //функция вывода символа 24*32   delay_ms(1000); // ждем 1 секунду  m++; // добавляем 1 к переменной m

  if(m>9)m=0; // Условие. Если переменная m больше 9, то m равняется 0.

   В следующей статье попробую рассказать как рисовать картинки и выводить их на экран дисплея. Как создавать массивы и функции к их выводу и как инвертировать изображение. Библиотеки позаимствовал с сайта cxem.net. Материал подготовил Бухарь.

   Форум по микроконтроллерным схемам