Электронная книга

Выбор и описание прототипов разрабатываемого устройства. Разработка структурной и принципиальной схемы. Обоснование программного обеспечения, используемого в разработке продукта. Моделирование устройство. Формирование программы для микропроцессора.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 10.11.2014
Размер файла 2,0 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Пояснительная записка к курсовой работе

Электронная книга

Введение

В последние пару лет электронные книги заслужили высокую популярность и получили широкое распространение среди любителей чтения. Основным отличием данной группы компьютерных устройств от КПК, планшетных ПК или субноутбуков является ограниченная функциональность, а также существенно большее время автономной работы. Последнее достигается за счет использования технологии E-ink, так называемой «электронной бумаги». Дисплей, выполненный по этой технологии, отображает лишь несколько оттенков серого цвета, но при этом отражает свет (сам не светится) и потребляет энергию только для формирования изображения (перелистывания страницы).

Электронные книги относят к разновидности планшетных компьютеров. Их появление обусловлено развитием и специализацией планшетных компьютеров вообще. Некоторые современные устройства оборудованы сенсорным экраном и имеют расширенный набор функций, и позволяют не только читать, но и редактировать текст.

Целью данного курсового проекта является создание устройства «Электронная книга», позволяющего воспроизводить текст в формате TXT на ЖК экране из под мобильного телефона. Проектируемая электронная книга будет иметь компактные размеры, за счет небольшого экрана, что позволит применять его как встраиваемое устройство, которое может крепиться к примеру на руле велосипеда, и будет способно выводить как заранее подготовленный текст так и прочую полезную информацию.

1. Обзор литературных источников

Рассмотрим несколько схем реализации устройств «Электронная книга» на контроллере. Первый вариант SimpleBook - электронная книга [2].

1.1 Электронная книга SimpleBook

Данное устройство позволяет читать текстовые файлы в кодировке 1251 и юникод. Имеется возможность настройки цвета меню / текста / загрузки и тп. В качестве экрана используется дисплей от старого ноутбука, управляющим устройством является DSP микроконтроллер dsPIC33FJ128MC706A.

Рисунок 1: Электронная книга SimpleBook схема принципиальная

В конечном устройстве был сделан сокет, а DSP помещен на отдельную небольшую плату для простоты изготовления и возможности замены. На печатной плате «MCU» имеются места для установки керамических конденсаторов 0.1 мкф и также на обратной стороне можно поставить керамику 10 мкф для питания ядра. Но в в данном варианте он мешал и его пришлось вынести на основную ПП (C1 C2).

Все устройство состоит из разных кусочков, т.к. готовое решение собиралось постепенно.

По интерфейсу SPI подключаются SD карта и RAM память, разьем вынесен на схеме. RAM - 23K256. На ПП «RAM» 2 слота под микрохемы, т.к. были еще кое-какие идеи, но пока не реализованы. CS первой RAM идет на 64-ю ногу DSP. Будьте внимательны, на схеме это не указано.

SD карта памяти подключается по томуже интерфейсу. 1-я нога DSP идет на переключатель, который замыкается на +3.3V если карта в слоте. необходим подтягивающий резистор на землю. На ПП «MMC» есть несколько контактов для установки синхронизации. 4ю ногу сокета замкнуть на VDD и меж 5 и 8 - резистор на 10к в моем случае. Может быть другой разьем под карты памят. 2-я нога идет на CS карты памяти.

Также в схеме есть SPI FLASH память. У меня это была W25X40. Должна подойти любая, т.к. в основном алгоритм работы один и тот-же. В ней храняца настройки, которые считываются при запуске и записываются при каждом выходе из меню настроек.

Теперь самое главное - подключение дисплея lq9d011

1 NC

2 NC

3 +5V

4 +5V

5 GND

6 GND

7 ENA начало цветопередачи

8 NC

9 CLK тактирование

10 GND

11 Hsync горизонтальная синхронизация

12 Vsync вертикальная

13 NC

14 R0 красный

15 R1

16 R2

17 GND

18 G0 зеленый

19 G1

20 G2

21 GND

22 B0 синий

23 B1

24 B2

25 NC

26 NC

27 NC

Также возможно подключение других дисплеев.

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

Микросхемы U3-U5 питаются от 5 ти вольт. И еще один момент: после подключения RAM и FLASH карта памяти перестала отвечать, тогда на линию SCK советую повесить конденсатор 15-30pF. В меню настроек есть выбор какой тип SD карты используется.

По программам в комплекте:

CharGen - редактирование знаков представленных в коде ассемблера. Изначально разрабатывалась под 8-ми битные ПИКи, так что для новых Symbol надо заменить на».byte». Invert - используется при сохранении, инвертирует последовательность битов символа. А «сеточка» справа используется для ручного задавания точек. Собственно можете открыть «KOI8.asm» в файлах прокта и посмотреть как это выглядит.

ScreenDraw.ASM - тут немного сложнее, программа для рисования «экранов» (например заставка при запуске выполнена на ней)

Сначала открываем таблицу знаков (Open Char code) и вверху появятся все символы. Нажимаем - рисуем. также можно открыть проект, но только сохраненный на ассемблере. для сохранения в асм надо указать начальную позицию в памяти (по умолч. 0х1000) куда будет записываться весь экран. можно сохранить на Си, для этого нажмите «use C?» вместо 0х1000 укажите название переменной в которую будет все записываться.

При открытии файла первым делом он конвертируеца в другой формат, для удобства работы с файлом. Вверху появится графа загрузки. Ее можно прервать и потом продолжить при повторном открытии файла. После полной загрузки файл появится в Библиотеке (на карте памяти это будет папка library).

Максимальное количество файлов в директории - 256 с длиной имени не более 120 знаков. Все это кэшируется на внешней RAM. Но сортировки нет.

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

В схеме приведенного устройства в качестве устройства индикации используется дисплей от ноутбука, в нашем же случае должен применяться ЖК дисплей от сотового телефона, в следующем примере приводиться схема подключения к контроллеру дисплея от телефона Nokia 3310 [3].

1.2 Цифровой двух канальный термометр

Основой устройства является микроконтроллер фирмы Microchip PIC16F628A, осуществляющий получение информации от датчиков температуры, обработку полученных данных и вывод их на индикатор. Данное устройство позволяет измерять температуру по двум каналам.

В качестве датчиков температуры можно использовать цифровые датчики DS18B20 или DS18S20. Данные цифровые датчики позволяют измерять температуры от -55 до +125°С, причем в интервале -10…+85°С производитель гарантирует абсолютную погрешность измерения не хуже ±0,5°С. На границах диапазона измеряемых температур точность ухудшается до ±2°С. Индикация показаний термометра во всем диапазоне измеряемых температур выполняется с точностью ±0.1°C, при использовании DS18B20, и с точностью ±0.5°C, при использовании DS18S20.

В качестве индикатора используется дисплей от самого популярного в свое время мобильного телефона Nokia3310.

Номинальное напряжение питания 2-х канального термометра…………. +3,3В.

Максимальное напряжение питания не должно превышать………………. +3,6В.

Микроконтроллер D1 PIC16F628A осуществляет обмен информацией с датчиками D2, D3 типа DS18B20 или DS18S20 по однопроводному цифровому интерфейсу 1-wire. К термометру одновременно должны подключаться только датчики одного типа. Тип датчиков с которыми будет работать термометр определяется программным обеспечением.

Вывод полученной от датчиков D2, D3 и обработанной микроконтроллером D1 информации на индикатор E1 осуществляется по последовательному интерфейсному каналу типа SPI.

Разъем Х1 служит для осуществления внутрисхемного программирования. Тип разъема и его цоколевка контактов обеспечивают подключения устройства к программатору типа PICKit2. Если под микроконтроллер устанавливается панелька типа TRS18, то разъем Х1 можно не устанавливать, а программирование микроконтроллера осуществлять с помощью любого другого программатора отдельно от устройства.

Рисунок 2: 2-х канальный термометр схема принципиальная

Описание работы.

При включении питания и после инициализации микроконтроллера происходит тест наличия и исправности цифровых датчиков температуры. Если какой нибудь датчик не подключен или его неисправность характеризуется наличием на линии DQ постоянного высокого уровня, при обращении к нему микроконтроллера, то на индикаторе будет выводится значение «Обрыв» на месте отображения показаний от этого датчика. А вот если линия DQ какого либо датчика имеет замыкание на 0В, либо эту линию сам датчик, при наличии неисправности его внутренней схемы, подтягивает к 0В, то на индикаторе будет выводится значение «К.З.».

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

2. Выбор и описание прототипов разрабатываемого устройства

Новая элементная база позволяет создавать компактные и экономичные устройства, способные с помощью персонального компьютера записывать в память устройства текст, а затем в автономном режиме читать его. В статье [4] описывается своеобразная «записная книжка», в которой можно хранить до 64 Кбайт текстовой информации.

Принципиальная схема «электронной книги» показана на рис. 3. Основа устройства - PIC-контроллер PIC16F84 (DD1). Текст хранится в микросхеме DS1 энергонезависимой Flash-памяти с последовательным интерфейсом I2C (см. статью А. Долгого «Микросхемы памяти с интерфейсом I2C. Особенности и применение» в «Радио», 2001, №2, с. 24-26 и №3, с. 25, 26). Посредством этого интерфейса, реализованного программно, микроконтроллер DD1 читает информацию из DS1 и передает ее на жидкокристаллический (ЖК) индикатор HG1. Перед чтением или записью каждого байта в ячейку памяти микросхемы DS1 передается адрес этой ячейки. Это несколько замедляет работу, но предотвращает проблемы, связанные с разным размером страницы памяти, которые могут возникать при использовании микросхем разных фирм.

Рисунок 3: Электронная книга схема электрическая принципиальная

Кроме собственно ЖК индикатора, ITM-1602ATR/R (HG1) имеет в своем составе контроллер HD44780, который организует обмен данными с микроконтроллером DD1, имеет знакогенератор для вывода символов и отвечает за отображение информации на экране. Для сокращения числа используемых портов микроконтроллера DD1 обмен с HG1 ведется по четырехбитному интерфейсу, при котором восьмибитные данные передаются тетрадами в два этапа. При таком режиме работы выводы DB0-DB3 индикатора не используются.

Управляют «электронной книгой» с помощью кнопок SB1-SB3: первые две служат для прокрутки текста и перемещения курсора меню, а третья - для вызова меню и подтверждения выбора его пунктов. Поскольку все линии порта B, являющиеся входными, подключены к источнику питания через резисторы, необходимости во внешних резисторах, «подтягивающих» порты RB5-RB7 к линии питания, нет.

Так как от устройства не требуется высокой точности отсчета временных интервалов, в качестве частотозадающих элементов тактового генератора микроконтроллера DD1 используется RC-цепь (R3C1). Генератор работает только при обращении микроконтроллера к памяти или ЖК индикатору, во время ожидания нажатия кнопки он отключен и микроконтроллер находится в режиме пониженного энергопотребления.

При включении питания на экране индикатора на короткое время появляется заставка, после чего устройство переходит в режим меню. Теперь, перемещая курсор кнопками SB1 («<»), SB2 («>») и подтверждая команду кнопкой SB3 («*»), можно перейти в режим чтения (пункт «R»), в «спящий» режим (пункт «S»), установить курсор в начало текста (пункт «H») или в его конец (пункт «E»). В этом режиме на экране отображается также текущая позиция текста в шестнадцатиричной форме. При чтении текст «листают» кнопками SB1 и SB2, возврат в меню осуществляется кнопкой SB3. Подстроечный резистор R5 служит для регулировки контрастности изображения на индикаторе HG1. Из «спящего» режима устройство выводят нажатием любой кнопки.

Для обмена информацией между «электронной книгой» и компьютером служит специальная программа, с помощью которой можно передавать текст как из компьютера в устройство, так и наоборот. Программа представляет собой упрощенный текстовый редактор с возможностью загрузки текста в «электронную книгу» и выгрузки из нее. Для загрузки текста в «электронную книгу» необходимо с помощью меню «Файл -> Открыть» открыть текстовый файл в ASCII формате, а затем, возможно произведя некоторое изменения этого текста в окне редактора, с помощью меню «E-Book -> Закачать» запустить процесс загрузки. Текст для загрузки можно подготовить в любом другом текстовом редакторе, а затем через буфер обмена Windows скопировать его в окно редактора программы. Выгрузка текста из «электронной книги» производится через меню «E-Book -> Скачать». После этого, текст может быть сохранен в ASCII файл или через буфер обмена перенесен в другую программу. Параметры работы программы (номер LPT порта и объем памяти «электронной книги») можно изменить через меню «Настройки -> Параметры».

Обмен производится через кабель-адаптер, схема которого приведена на рис. 4. Вилку XP1 подключают к параллельному (LPT) порту компьютера. На транзисторах VT1, VT2 реализована функция элемента с открытым коллектором, которая требуется для работы с шиной I2C. Линии SCL и SDA подключены к входным линиям LPT порта (соответственно контакты 13 и 12) для обеспечения контроля состояния первой и приема данных по второй со стороны компьютера.

Рисунок 4: Кабель-адаптер

При работе с компьютером шина I2C функционирует в режиме «Multi Master». Для разрешения конфликтов на ней используется следующий алгоритм: перед тем, как любое из master-устройств собирается произвести обмен с памятью, оно в течение некоторого времени следит за уровнем сигнала на линии SCL. Если в течение этого времени на ней не было уровня логического нуля, master-устройство начинает обмен с памятью. В противном случае оно продолжает отслеживать состояние линии SCL. Поскольку такой алгоритм не всегда способен устранить конфликты, нажимать кнопки «электронной книги» во время обмена информацией с компьютером не рекомендуется.

Питание на микросхему DS1 и индикатор HG1 поступает через порт RB4 микроконтроллера DD1. Это позволяет переводить устройство в «спящий» режим программным способом. При этом питание подается только на микроконтроллер, который также переходит в «спящий» режим (тактовый генератор выключается), и потребляемый устройством ток уменьшается до значения, не превышающего десятка микроампер. Возврат в режим чтения, как отмечалось, производится нажатием любой кнопки устройства. При этом контроллер выходит из «спящего» режима, подает питание на микросхему памяти и индикатор и проводит процедуру инициализации последнего. После этого можно продолжать читать «книгу» с той позиции, которая была текущей в момент перевода устройства в «спящий» режим.

Большинство деталей «книги» смонтировано на печатной плате. В устройстве допустимо применение микроконтроллера PIC16F84 или PIC16F84A в любом исполнении. DS1 - любая микросхема с интерфейсом I2C из ряда AT24С01-AT24C512 (объем памяти от 128 байт до 64 Кб) фирмы ATMEL или других производителей. При этом для каждой микросхемы используют свой вариант прошивки контроллера. В принципе можно применить от одной до восьми микросхем памяти, задавая для каждой в зависимости от их типа уникальный адрес с помощью адресных входов A0-A3, но при этом потребуется корректировка программы контроллера.

ЖК индикатор HG1 - двустрочный (по 16 символов в строке) фирмы Intech с русским знакогенератором. Можно применить и другие одно- и двустрочные индикаторы этой фирмы или им подобные других фирм, контроллер которых совместим с HD44780. При этом в программе микроконтроллера нужно скорректировать значения переменных width и height. В случае использования индикаторов с большим числом строк потребуется более серьезная модификация программы.

Индикаторы с контроллером HT44780 выпускаются с различными

знакогенераторами. Если не удастся приобрести индикатор с русским знакогенератором, при вводе текста можно заменять русские буквы похожими по написанию латинскими, либо использовать транслитерацию (писать русские слова латинскими буквами). Эта возможность предусмотрена в программе. При передаче текста в «электронную книгу» символы автоматически заменяются на указанные пользователем. Таблицу замены символов можно изменить через меню «Настройки -> Параметры» программы. При программировании микроконтроллера DD1 нужно установить следующие значения бит в конфигурационном слове: тип генератора (OSC) - RC, сторожевой таймер (WDT) выключен, задержка после включения питания (PWRTE) разрешена. Для питания «электронной книги» требуется напряжение 4…5 В (три гальванических элемента типоразмера AAA или четыре дисковых аккумулятора Д - 0,1). Работоспособность устройства сохраняется при снижении напряжения

батареи до 3 В, однако считывание информации с ЖК индикатора в этом случае затрудняется.

В качестве розетки XS1 (рис. 1) в устройстве применен разъем от

стереофонических головных телефонов, используемый в импортной аппаратуре. Вилка XP1 (рис. 2) - компьютерная DB-25M. Транзисторы VT1, VT2 (любые кремниевые маломощные структуры n-p-n) и резисторы R1, R2 смонтированы навесным способом внутри вилки XP1. Длина соединительного кабеля - не более 2 м.

Основное отличие приведенного прототипа от проектируемого устройства будет заключаться в используемом для вывода информации дисплее. В прототипе предусмотрен символьный двустрочный (по 16 символов на строку) ЖК индикатор, с максимальным числом символов 32. Предусмотренный же условием курсового проекта ЖК индикатор от сотового телефона имеет возможность отображать более чем в 2 раза больше символов, а так же позволят выводить графическое изображение.

3. Разработка структурной схемы устройства

Для реализации устройства электронная книга требуется прежде всего отображение информации для визуального восприятия, что будет производиться с помощью блока вывода информации (ВИ), в нем в качестве устройства вывода информации будет использован ЖК индикатор с сотового телефона, как предусмотрено заданием к курсовому проектированию. На ЖК индикаторе будет воспроизводится текст, который будет передаваться по интерфейсу связи от устройства управления (УУ) виде сигналов по протоколу, который поддерживает выбранный индикатор. Так как в сотовых телефонах используются графические ЖК индикаторы, то каждый символ (буква, цифра и др.) воспроизводимый на нем будет отрисовывоться, т.е. устройство управление будет передавать картинку каждого символа а не ее код, как это делается например в символьных дисплеях, поэтому скорость передачи данных должна быть достаточно высокой.

По условию курсового проекта на ЖК индикаторе должна отображаться информация объёмом до 20000 символов в формате TXT, одновременно такое количество символов воспроизвести не возможно, поэтому текст будет отображаться порциями и перелистываться постранично, а информация о текущей странице будет поступать на устройство управления от блока управления вводом (БУВ), представляющим из себя кнопки перелистывания вперед и назад.

Для хранения текста в формате TXT требуется один байт памяти на один символ, соответственно для хранения 20000 символов требуется около 20 кбайт памяти, так как текст информация не временная, то при отключении питания он должен сохраняться, а если нужно текстовая информация должна иметь возможность перезаписи, для этого следует применить энергонезависимую память EEPROM, либо флеш. Ресурсы контроллера позволяют хранить не более 2 кбайт информации в EEPROM, так же возможно хранение данных в памяти программ, однако в первом случае места явно не хватает, а во втором следует использовать более дорогие модели контроллеров, в то время когда можно обойтись более экономичным средством. Следовательно лучше пользоваться внешней памятью EEPROM, которая будет связана с устройством управления по протоколу I2C. В EEPROM будут храниться символы формате TXT в кодировке ASCII, по запросу управляющего устройства микросхема EEPROM передаст код символа хранящегося в указанной ячейке, в свою очередь устройство управления определит символ и подберет соответствующую ему картинку хранящуюся в его памяти программ и передаст эту картинку на блок вывода информации.

Устройство управления представляет из себя микропроцессор фирмы AVR, выполняющий функции чтения данных из EEPROM по интерфейсу I2C, передачу данных на ЖК индикатор по интерфейсу SPI, определения нажатия кнопок по изменению логического уровня на портах подключенных к кнопкам. Так же микропроцессор будет производит хранение таблицы символов в памяти программ и выбор данных из таблицы.

В состав проектируемого устройства войдут следующие блоки:

1. УУ - устройство управления

2. ВИ - блок вывода информации

3. УВ - блок управления вводом

4. EEPROM - блок хранения данных в памяти EEPROM

4. Разработка принципиальной схемы устройства

В соответствии со структурной схемой разработаем принципиальную схему, выберем компоненты для каждого из введенного блока. В качестве устройства управления выберем микропроцессор фирмы AVR удовлетворяющий следующим требованиям: количество портов ввода / вывода должно позволять подключить две кнопки (блок УВ), ЖК индикатор (три вывода шины SPI - SCLK, SDIN, SCE, так как индикатор работает только на прием, RESET, D/C, итого 5 выводов), память EEPROM (два вывода шины I2C), всего 9 портов. Так же в архитектуре микропроцессора должны присутствовать одновременно два интерфейса SPI и I2C (TWI), для связи с ЖК индикатором и EEPROM соответственно. Объём памяти программ должен позволять хранить картинки 256 символов в соответствии с кодировкой ASCII, для прорисовки каждого символа размерностью 8x6 отводиться 6 байт памяти, итого под хранение всей таблицы требуется 1 536 байт, с учетом программы общий объём памяти программ должен быть не менее 2072 байта. Так как напряжение питания основных микросхем (EEPROM и ЖК индикатор) равно 3,3 В, то и микропроцессор должен работать при таком напряжении. Выдвинутым требованием соответствует микропроцессор ATmega8L[5].

Рисунок 5: Микропроцессор ATmega8L

Технические параметры микропроцессора ATMega8 [6]:

Память для программ составляет 8 Кб с возможностью перезаписать 10000 раз

512 байт флеш-памяти для хранения переменных (100000 циклов перезаписи)

1 Кб ОЗУ и 32 регистра общего назначения

Два 8-разрядных Таймера / Счетчика с раздельным прескалером, режим сравнения

16-разрядный Таймер / Счетчик с раздельным прескалером, режим сравнения, режим захвата

Таймер реального времени с независимым генератором

3 канала ШИМ

6 каналов 10-разрядного АЦП

Двухпроводный последовательный интерфейс TWI

Программируемый последовательный USART

Интерфейс SPI с режимами Master/Slave

Программируемый сторожевой таймер с отдельным независимым генератором

Встроенный аналоговый компаратор

Сброс при включении питания, программируемая защита от провалов питания

Встроенный калиброванный RC-генератор

Обработка внутренних и внешних прерываний

5 режимов с пониженным энергопотреблением: Idle, ADC Noise Reduction, Power-save, Power-down, и Standby

Напряжение питания 4.5 - 5.5В

Тактовая частота 0-16 МГц

Для изначального функционирования микроконтроллера к его выводам VCC, AVCC, GND нужно подключить питание, кварцевый резонатор ZQ1 нужно подключить к выводам XTAL1, XTAL2 и через конденсаторы С6, С7 (15 пФ) на землю, так же вывод RESET должен быть подтянут к питанию. К выводам PC4/SDA, PC5/SCL микропроцессора подключается микросхема памяти EEPROM DD1, а так же подтягивающие резисторы R1, R2 номиналом 10 кОм к питанию 3,3 В. Через управляющие порты PB1 - PB5, к микропроцессору подключается ЖК индикатор HG1. Для выполнения функции перелистывания страницы вперед и назад к портам PC0, PC1 подключаются кнопки SW1, SW2 и подтягивающие резисторы R3, R4 на питание 3,3 В. Определение нажатия происходит следующим образом - порты PC0, PC1 настроены как цифровые входы, следовательно, ток через них протекает не значительный, и на подключенных к ним резисторах R3, R4 практически не происходит падения напряжения, на входы поступает напряжение практически равное напряжению питания, что соответствует логической единице, при нажатии кнопки происходит замыкание цепи на землю и на порты поступает логический ноль.

Для хранения текста в формате TXT используется память EEPROM, к ней выдвигаются следующие требования: объём памяти достаточный для хранения 20000 символов, т.е. не менее 20 кбайт, напряжение питания 3,3 В, интерфейс связи I2C. Данным требованиям удовлетворяет микросхема 24LC256 [7].

Рисунок 6: Корпус микросхемы 24LC256

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

Напряжение чтения / записи 2,7 - 5,5 В;

Использует последовательный интерфейс 2-wire;

Типовое время записи 5 мс;

Объем памяти 256 кбит;

Количество циклов перезаписи 100 000;

Время хранения данных более 100 лет;

Ток при чтении данных 10мА (типовое значение);

Ток при ожидании 5мкА (типовое значение);

Назначение выводов:

Vss - земля.

SDA - линия данных

SCL - линия тактовых импульсов

WP - Защита от записи. Когда на данном выводе логический 0, то запись в память разрешена. Если подать логическую единицу, то возможно только чтение из памяти.

Vcc - питание микросхемы. Согласно даташиту питается она напряжением от 2.5 вольта до 3.7 вольта.

A0 - A1 - адресные входы

Рисунок 7: Микросхема 24LC256 схема структурная

В качестве ЖК индикатора выберем дисплей от сотового телефона Nokia 3310.

Его краткая характеристика:

область отображения 84*48 точек (что позволяет разместить 6 строк текста по 14 символов 8x6 в каждой),

питание 2,7.. 3,3 В,

интерфейс SPI с пропускной способностью до 4 Mbit/s,

внешний сброс по сигналу RESET,

вывод температурной компенсации Vlcd

рабочий диапазон температур от -25°С до 70°С

Управляющим контроллером ЖК индикатора от сотового телефона Nokia 3310 является PCD8544 [8], система его команд представлена на рисунке 8.

Рисунок 8: Система команд контроллера PCD8544

5. Разработка программного обеспечения

include «m8def.inc» // подключить библиотеку

def Temp=R16

def Temp1=R17

def Adres_L = R21

def Adres_H = R22

equ RES = 4

equ SCE = 2

equ D_C = 0

org 0

rjmp reset // перейти к началу программы

// ++++++++++ таблица вектаров прерывания ++++++++++++++++++++++++++++++++++++++++++

org 1 nop //rjmp EXT_INT0;

org 2 nop //rjmp EXT_INT1;

org 3 nop //rjmp TIM2_COMP;

org 4 nop //rjmp TIM2_OVF;

org 5 nop //rjmp TIM1_CAPT;

org 6 nop //rjmp TIM1_COMPA;

org 7 nop //rjmp TIM1_COMPB

org 8 nop //rjmp TIM1_OVF

org 9 nop //rjmp TIM0_OVF;

org 10 nop //rjmp SPI_STC;

org 11 nop //rjmp USART_RXC;

org 12 nop //rjmp USART_UDRE;

org 13 nop //rjmp USART_TXC;

org 14 nop //rjmp ADC;

org 15 nop //rjmp EE_RDY;

org 16 nop //rjmp ANA_COMP;

org 17 nop //rjmp TWI;

org 18 nop //rjmp SPM_RDY;

// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

reset:

ldi r19, high(RAMEND) // определить верхний адрес стека

out sph, r19 // установить верхний адрес стека

ldi r19, low(RAMEND) // определить нижний адрес стека

out spl, r19 // установить нижний адрес стека

ldi r16,0b11111111

out ddrb, r16 // установить выводы порта В как цифровые выходы

ldi r16,0b00001100

out ddrc, r16 // установить все выводы порта C PC0, PC1, PC4-PC7 - входы, PC2, PC3 - выходы

ldi r16,0b11111111

out ddrd, r16 // установить все выводы порта D как цифровые выходы

///////////////////////////////////////////////////////////////////////////////////

rcall i2c_init // Инициализируем интерфейс i2c

rcall delay // задержка

rcall i2c_start // Отправляем стартовую посылку

ldi temp, 0b10100000 // Адрес микросхемы

rcall i2c_send // переслать адрес микросхемы

ldi temp, 0x00 // Мдадший адрес ячейки памяти

rcall i2c_send // переслать младший адрес

ldi temp, 0x00 // Сташий адрес ячейки памяти

rcall i2c_send // переслать старший адрес

rcall i2c_start // Повторный старт!

ldi temp, 0b10100001 // Адрес микросхемы + БИТ ЧТЕНИЯ!

rcall i2c_send

rcall SPI_MasterInit // иниациализация модуля SPI

sbi portb, RES // включить LCD 3310

cbi portb, SCE // активизировать LCD 3310

ldi r16,0x21 // LCD Extended Commands.

rcall Send_comand // переслать команду на LCD 3310

ldi r16,0xE0 // Set LCD Vop (Contrast).

rcall Send_comand // переслать команду на LCD 3310

ldi r16,0x04 // Set Temp coefficent.

rcall Send_comand // переслать команду на LCD 3310

ldi r16,0x13 // LCD bias mode 1:48.

rcall Send_comand // переслать команду на LCD 3310

ldi r16,0x20 // LCD Standard Commands, Horizontal addressing mode.

rcall Send_comand // переслать команду на LCD 3310

ldi r16,0x0c // LCD in normal mode.

rcall Send_comand // переслать команду на LCD 3310

ldi r16,0x40 // выбрать координату по Y 0

rcall Send_comand // переслать команду на LCD 3310

ldi r16,0x80 // выбрать координату по X 0

rcall Send_comand // переслать команду на LCD 3310

ldi r19,0 // сбросить счетчик вывединых символов

cyklle:

rcall i2c_recive // вызвать подпрограмму чтения символа из памяти EEPROM

rcall write_symbol_LCD // вызвать подпрограмму записи символа на LCD 3310

mov r18, r19 // записать количество выведеных символов в буферный регистр

subi r18, 83 // проверка: выведено на экран 84 символа

BREQ cyklle_2 // переход если нет переноса (не выведено 84 символа)

inc r19 // инкрементировать счетчик выведеных символов

rjmp cyklle // перейти к началу цикла

cyklle_2:

sbis PINC, 1 // проверка нажатия кнопки 1

rcall new_page // вызов подпрограммы вывода новой страници

sbis PINC, 0 // проверка нажатия кнопки 2

rcall last_page // вызов подпрограммы вывода предыдущей страници

rjmp cyklle_2

///////////////////////////////////////////////////////////////////

new_page:

sbis PINC, 1 // ожидание отжатия кнопки 1

rjmp new_page // зациклить пока не будет отжата кнопка 1

ldi r16,0x40 // выбрать координату по Y 0

rcall Send_comand // переслать команду на LCD 3310

ldi r16,0x80 // выбрать координату по X 0

rcall Send_comand // переслать команду на LCD 3310

adc adres_L, r19 // увелечение младшего адреса в поле памяти EEPROM на значение счетчика

BRCC adc_adres_L // переход если нет переноса

inc adres_H // увелечение старшего адреса в поле памяти EEPROM на 1 при переполнения младшего адреса

adc_adres_L:

ldi r19,0 // сбросить счетчик символов

rjmp cyklle // перейти на cyklle

ret // выход из подпрограммы

last_page:

sbis PINC, 0 // ожидание отжатия кнопки 2

rjmp last_page // зациклить пока не будет отжата кнопка 2

sbc adres_L, r19 // уменьшение младшего адреса в поле памяти EEPROM на значение счетчика

BRCC sbc_adres_L // переход если нет переноса

dec adres_H // уменьшение старшего адреса в поле памяти EEPROM на 1 при заеме младшего адреса

sbc_adres_L:

rcall i2c_start // Отправляем стартовую посылку

ldi temp, 0b10100000 // Адрес микросхемы

rcall i2c_send

mov temp, adres_H // Адрес ячейки памяти старший

rcall i2c_send

mov temp, adres_L // Адрес ячейки памяти младший

rcall i2c_send

rcall i2c_start // Повторный старт!

ldi temp, 0b10100001 // Адрес микросхемы + БИТ ЧТЕНИЯ!

rcall i2c_send

ldi r19,0 // сбросить счетчик символов

rjmp cyklle // перейти на cyklle

ret

//////////////////////////////////////////////////////////////////

write_symbol_LCD:

// ldi r17,0x00

ldi zl, 0x00 // установить младший разряд для чтения таблицы

ldi zh, 0x04 // установить старший разряд для чтения таблицы

clc // сброс флага переноса заема C = 0

adc zl, Temp // прибавить адрес текущего символа в кодировке ASCII к начальному адресу таблицы

BRCC adc_1 // переход если нет переноса

inc zh // инкриментировать старший адрес таблицы при переполнении младшего адреса

adc_1:

adc zl, Temp // прибавить адрес текущего символа в кодировке ASCII к начальному адресу таблицы

BRCC adc_2 // переход если нет переноса

inc zh // инкриментировать старший адрес таблицы при переполнении младшего адреса

adc_2:

adc zl, Temp // прибавить адрес текущего символа в кодировке ASCII к начальному адресу таблицы

BRCC adc_3 // переход если нет переноса

inc zh // инкриментировать старший адрес таблицы при переполнении младшего адреса

adc_3:

adc zl, Temp // прибавить адрес текущего символа в кодировке ASCII к начальному адресу таблицы

BRCC adc_4 // переход если нет переноса

inc zh // инкриментировать старший адрес таблицы при переполнении младшего адреса

adc_4:

adc zl, Temp // прибавить адрес текущего символа в кодировке ASCII к начальному адресу таблицы

BRCC adc_5 // переход если нет переноса

inc zh // инкриментировать старший адрес таблицы при переполнении младшего адреса

adc_5:

adc zl, Temp // прибавить адрес текущего символа в кодировке ASCII к начальному адресу таблицы

BRCC adc_6 // переход если нет переноса

inc zh // инкриментировать старший адрес таблицы при переполнении младшего адреса

adc_6:

mov r17, temp

subi r17,0x33

BRCS dec_zl_1 // переход если нет переноса

dec zl

dec_zl_1:

mov r17, temp

subi r17,0x66

BRCS dec_zl_2 // переход если нет переноса

dec zl

dec_zl_2:

mov r17, temp

subi r17,0xb7

BRCS dec_zl_3 // переход если нет переноса

dec zl

dec_zl_3:

mov r17, temp

subi r17,0xcc

BRCS dec_zl_4 // переход если нет переноса

dec zl

dec_zl_4:

rcall Send_data // вызвать подпрограмму пересылки картинки символа на LCD 3310

rcall Send_data // вызвать подпрограмму пересылки картинки символа на LCD 3310

rcall Send_data // вызвать подпрограмму пересылки картинки символа на LCD 3310

rcall Send_data // вызвать подпрограмму пересылки картинки символа на LCD 3310

rcall Send_data // вызвать подпрограмму пересылки картинки символа на LCD 3310

rcall Send_data // вызвать подпрограмму пересылки картинки символа на LCD 3310

ret

///////////////////SPI ///////////////////////////////////////////

Send_comand:

cbi portb, D_C

rcall SPI_MasterTransmit

rcall Wait_Transmit

ret

Send_data:

lpm r16, z+

sbi portb, D_C

rcall SPI_MasterTransmit

rcall Wait_Transmit

ret

SPI_MasterInit:

; Enable SPI, Master, set clock rate fck/16

ldi r17, (1<<SPE)|(1<<MSTR)|(1<<SPR0)

out SPCR, r17

ret

SPI_MasterTransmit:

; Start transmission of data (r16)

out SPDR, r16

Wait_Transmit:

; Wait for transmission complete

sbis SPSR, SPIF

rjmp Wait_Transmit

ret

////////////////// ПРОЦЕДУРЫ РАБОТЫ С I2C //////////////////////

////////////////// РАБОЧИЙ РЕГИСТР TEMP ///////////////////////

i2c_init: // Инициализация и2с

ldi temp, 5

out TWBR, temp

ldi temp, (0<<TWPS1)|(0<<TWPS0)

out TWSR, temp

ret

i2c_stop: // Отправляет стоповую посылку

ldi temp, (1<<TWINT)|(1<<TWEN)|(1<<TWSTO)

out TWCR, temp

ret

i2c_start: // Передача стартовой посылки

ldi temp, (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)

out TWCR, temp

wait1:

in temp, TWCR

sbrs temp, TWINT

rjmp wait1

ret

i2c_recive_last: // Считать последний байт и записать в TEMP

ldi temp, (1<<TWINT|1<<TWEN)

out TWCR, temp

wait3:

in temp, TWCR

sbrs temp, TWINT

rjmp wait3

in temp, TWDR

ret

i2c_recive: // Считывает байт и записывает его в TEMP

ldi temp, (1<<TWINT|1<<TWEN|1<<TWEA)

out TWCR, temp

wait4:

in temp, TWCR

sbrs temp, TWINT

rjmp wait4

in temp, TWDR

ret

i2c_send: // Будет передан байт из регистра TEMP

out TWDR, temp

ldi temp, (1<<TWINT)|(1<<TWEN)

out TWCR, temp

wait2:

in temp, TWCR

sbrs temp, TWINT

rjmp wait2

ret

///////////////////////////////////////////////////////////////////////

////// Процедура задержки ////////

delay:

; =============================

; delay loop generator

; 1600000 cycles:

; -

; delaying 1599999 cycles:

ldi R18, $51

WGLOOP0: ldi R19, $0E

WGLOOP1: ldi R20, $9D

WGLOOP2: dec R20

brne WGLOOP2

dec R19

brne WGLOOP1

dec R18

brne WGLOOP0

; -

; delaying 1 cycle:

nop

; =============================

ret

org 512

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x00

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x01

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x02

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x03

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x04

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x05

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x06

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x07

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x08

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x09

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x0a

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x0b

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x0c

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x0d

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x0e

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x0f

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x10

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x11

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x12

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x13

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x14

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x15

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x16

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x17

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x18

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x19

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x1a

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x1b

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x1c

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x1d

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x1e

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x1f

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x20

db 0x00, 0x00, 0x2f, 0x00, 0x00 // ! 0x21

db 0x00, 0x07, 0x00, 0x07, 0x00 // « 0x22

db 0x14, 0x7f, 0x14, 0x7f, 0x14 // # 0x23

db 0x24, 0x2a, 0x7f, 0x2a, 0x12 // $ 0x24

db 0xc4, 0xc8, 0x10, 0x26, 0x46 // % 0x25

db 0x36, 0x49, 0x55, 0x22, 0x50 // & 0x26

db 0x00, 0x05, 0x03, 0x00, 0x00 // ' 0x27

db 0x00, 0x1c, 0x22, 0x41, 0x00 // (0x28

db 0x00, 0x41, 0x22, 0x1c, 0x00 // ) 0x29

db 0x14, 0x08, 0x3E, 0x08, 0x14 // * 0x2a

db 0x08, 0x08, 0x3E, 0x08, 0x08 // + 0x2b

db 0x00, 0x00, 0x50, 0x30, 0x00 // , 0x2c

db 0x10, 0x10, 0x10, 0x10, 0x10 // - 0x2d

db 0x00, 0x60, 0x60, 0x00, 0x00 // . 0x2e

db 0x20, 0x10, 0x08, 0x04, 0x02 // / 0x2f

db 0x3E, 0x51, 0x49, 0x45, 0x3E // 0 0x30

db 0x00, 0x42, 0x7F, 0x40, 0x00 // 1

db 0x42, 0x61, 0x51, 0x49, 0x46 // 2

db 0x21, 0x41, 0x45, 0x4B, 0x31 // 3

db 0x18, 0x14, 0x12, 0x7F, 0x10 // 4

db 0x27, 0x45, 0x45, 0x45, 0x39 // 5

db 0x3C, 0x4A, 0x49, 0x49, 0x30 // 6

db 0x01, 0x71, 0x09, 0x05, 0x03 // 7

db 0x36, 0x49, 0x49, 0x49, 0x36 // 8

db 0x06, 0x49, 0x49, 0x29, 0x1E // 9

db 0x00, 0x36, 0x36, 0x00, 0x00 // :

db 0x00, 0x56, 0x36, 0x00, 0x00 // ;

db 0x08, 0x14, 0x22, 0x41, 0x00 // <

db 0x14, 0x14, 0x14, 0x14, 0x14 // =

db 0x00, 0x41, 0x22, 0x14, 0x08 // >

db 0x02, 0x01, 0x51, 0x09, 0x06 // ?

db 0x32, 0x49, 0x59, 0x51, 0x3E // @ 0x40

db 0x7E, 0x11, 0x11, 0x11, 0x7E // A

db 0x7F, 0x49, 0x49, 0x49, 0x36 // B

db 0x3E, 0x41, 0x41, 0x41, 0x22 // C

db 0x7F, 0x41, 0x41, 0x22, 0x1C // D

db 0x7F, 0x49, 0x49, 0x49, 0x41 // E

db 0x7F, 0x09, 0x09, 0x09, 0x01 // F

db 0x3E, 0x41, 0x49, 0x49, 0x7A // G

db 0x7F, 0x08, 0x08, 0x08, 0x7F // H

db 0x00, 0x41, 0x7F, 0x41, 0x00 // I

db 0x20, 0x40, 0x41, 0x3F, 0x01 // J

db 0x7F, 0x08, 0x14, 0x22, 0x41 // K

db 0x7F, 0x40, 0x40, 0x40, 0x40 // L

db 0x7F, 0x02, 0x0C, 0x02, 0x7F // M

db 0x7F, 0x04, 0x08, 0x10, 0x7F // N

db 0x3E, 0x41, 0x41, 0x41, 0x3E // O

db 0x7F, 0x09, 0x09, 0x09, 0x06 // P 0x50

db 0x3E, 0x41, 0x51, 0x21, 0x5E // Q

db 0x7F, 0x09, 0x19, 0x29, 0x46 // R

db 0x46, 0x49, 0x49, 0x49, 0x31 // S

db 0x01, 0x01, 0x7F, 0x01, 0x01 // T

db 0x3F, 0x40, 0x40, 0x40, 0x3F // U

db 0x1F, 0x20, 0x40, 0x20, 0x1F // V

db 0x3F, 0x40, 0x38, 0x40, 0x3F // W

db 0x63, 0x14, 0x08, 0x14, 0x63 // X

db 0x07, 0x08, 0x70, 0x08, 0x07 // Y

db 0x61, 0x51, 0x49, 0x45, 0x43 // Z

db 0x00, 0x7F, 0x41, 0x41, 0x00 // [

db 0x55, 0x2A, 0x55, 0x2A, 0x55 // 55

db 0x00, 0x41, 0x41, 0x7F, 0x00 // ]

db 0x04, 0x02, 0x01, 0x02, 0x04 // ^

db 0x40, 0x40, 0x40, 0x40, 0x40 // _

db 0x00, 0x01, 0x02, 0x04, 0x00 // ' 0x60

db 0x20, 0x54, 0x54, 0x54, 0x78 // a 0x61

db 0x7F, 0x48, 0x44, 0x44, 0x38 // b

db 0x38, 0x44, 0x44, 0x44, 0x20 // c

db 0x38, 0x44, 0x44, 0x48, 0x7F // d

db 0x38, 0x54, 0x54, 0x54, 0x18 // e

db 0x08, 0x7E, 0x09, 0x01, 0x02 // f

db 0x0C, 0x52, 0x52, 0x52, 0x3E // g

db 0x7F, 0x08, 0x04, 0x04, 0x78 // h

db 0x00, 0x44, 0x7D, 0x40, 0x00 // i

db 0x20, 0x40, 0x44, 0x3D, 0x00 // j

db 0x7F, 0x10, 0x28, 0x44, 0x00 // k

db 0x00, 0x41, 0x7F, 0x40, 0x00 // l

db 0x7C, 0x04, 0x18, 0x04, 0x78 // m

db 0x7C, 0x08, 0x04, 0x04, 0x78 // n

db 0x38, 0x44, 0x44, 0x44, 0x38 // o

db 0x7C, 0x14, 0x14, 0x14, 0x08 // p 0x70

db 0x08, 0x14, 0x14, 0x18, 0x7C // q 0x71

db 0x7C, 0x08, 0x04, 0x04, 0x08 // r

db 0x48, 0x54, 0x54, 0x54, 0x20 // s

db 0x04, 0x3F, 0x44, 0x40, 0x20 // t

db 0x3C, 0x40, 0x40, 0x20, 0x7C // u

db 0x1C, 0x20, 0x40, 0x20, 0x1C // v

db 0x3C, 0x40, 0x30, 0x40, 0x3C // w

db 0x44, 0x28, 0x10, 0x28, 0x44 // x

db 0x0C, 0x50, 0x50, 0x50, 0x3C // y

db 0x44, 0x64, 0x54, 0x4C, 0x44 // z

db 0x00, 0x06, 0x09, 0x09, 0x06 // є 0x7b

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x7c

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x7d

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x7e

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x7f

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x80

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x81

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x82

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x83

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x84

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x85

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x86

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x87

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x88

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x89

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x8a

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x8b

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x8c

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x8d

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x8e

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x8f

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x90

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x91

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x92

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x93

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x94

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x95

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x96

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x97

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x98

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x99

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x9a

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x9b

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x9c

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x9d

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x9e

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0x9f

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0xa0

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0xa1

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0xa2

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0xa3

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0xa4

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0xa5

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0xa6

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0xa7

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0xa8

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0xa9

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0xaa

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0xab

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0xac

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0xad

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0xae

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0xaf

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0xb0

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0xb1

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0xb2

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0xb3

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0xb4

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0xb5

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0xb6

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0xb7

db 0b00111000, 0b01010101, 0b01010100, 0b01010101, 0b01001000, 0b00000000 // ё 0xb8

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0xb9

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0xba

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0xbb

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0xbc

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0xbd

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0xbe

db 0x00, 0x00, 0x00, 0x00, 0x00 // sp 0xbf

db 0x7E, 0x11, 0x11, 0x11, 0x7E // А 0xc0

db 0b01111111, 0b01001001, 0b01001001, 0b01001001, 0b00110001, 0b00000000 // Б 0xc1

db 0x7F, 0x49, 0x49, 0x49, 0x36 // В 0xc2

db 0b01111111, 0b00000001, 0b00000001, 0b00000001, 0b00000001, 0b00000000 // Г 0xc3

db 0b01100000, 0b00111100, 0b00100010, 0b00111111, 0b01100000, 0b00000000 // Д 0xc4

db 0x7F, 0x49, 0x49, 0x49, 0x41 // E 0xc5

db 0b01110111, 0b00001000, 0b01111111, 0b00001000, 0b01110111, 0b00000000 // Ж 0xc6

db 0x21, 0x41, 0x45, 0x4B, 0x31 // З 0xc7

db 0b01111111, 0b00010000, 0b00001000, 0b00000100, 0b01111111, 0b00000000 // И 0xc8

db 0b01111111, 0b00010000, 0b00001001, 0b00000100, 0b01111111, 0b00000000 // Й 0xc9

db 0x7F, 0x08, 0x14, 0x22, 0x41 // K 0xca

db 0b01100000, 0b00011000, 0b00000110, 0b00000001, 0b01111111, 0b00000000 // Л 0xcb

db 0x7F, 0x02, 0x0C, 0x02, 0x7F // M 0xcc

db 0x7F, 0x08, 0x08, 0x08, 0x7F // H 0xcd

db 0x3E, 0x41, 0x41, 0x41, 0x3E // O 0xce

db 0b01111111, 0b00000001, 0b00000001, 0b00000001, 0b01111111, 0b00000000 // П 0xcf

db 0x7F, 0x09, 0x09, 0x09, 0x06 // P 0xd0

db 0x3E, 0x41, 0x41, 0x41, 0x22 // C 0xd1

db 0x01, 0x01, 0x7F, 0x01, 0x01 // T 0xd2

db 0b01000111, 0b01001000, 0b01001000, 0b00101000, 0b00011111, 0b00000000 // У 0xd3

db 0b00011100, 0b00100010, 0b01111111, 0b00100010, 0b00011100, 0b00000000 // Ф 0xd4

db 0x63, 0x14, 0x08, 0x14, 0x63 // X 0xd5

db 0b00111111, 0b00100000, 0b00100000, 0b00111111, 0b01100000, 0b00000000 // Ц 0xd6

db 0b00001111, 0b00001000, 0b00001000, 0b00001000, 0b01111111, 0b00000000 // Ч 0xd7

db 0b01111111, 0b01000000, 0b01111110, 0b01000000, 0b01111111, 0b00000000 // Ш 0xd8

db 0b01111111, 0b01000000, 0b01111110, 0b01000000, 0b01111111, 0b11000000 // Щ 0xd9

db 0b00000001, 0b01111111, 0b01000100, 0b01000100, 0b00111000, 0b00000000 // Ъ 0xda

db 0b01111111, 0b01000100, 0b01111100, 0b00000000, 0b01111111, 0b00000000 // Ы 0xdb

db 0b00000000, 0b01111111, 0b01000100, 0b01000100, 0b00111000, 0b00000000 // Ь 0xdc

db 0b01000001, 0b01000001, 0b01001001, 0b01001001, 0b00111110, 0b00000000 // Э 0xdd

db 0b01111111, 0b00001000, 0b00111110, 0b01000001, 0b00111110, 0b00000000 // Ю 0xde

db 0b01000110, 0b00101001, 0b00011001, 0b00001001, 0b01111111, 0b00000000 // Я 0xdf

db 0x20, 0x54, 0x54, 0x54, 0x78 // а 0xE0

db 0b01111000, 0b01010100, 0b01010100, 0b01010100, 0b00100100, 0b00000000 // б 0xE1

db 0b01111100, 0b01010100, 0b01010100, 0b01010100, 0b00101000, 0b00000000 // в 0xE2

db 0b01111100, 0b00000100, 0b00000100, 0b00000100, 0b00000100, 0b00000000 // г 0xE3

db 0b01100000, 0b00111000, 0b00100100, 0b00111100, 0b01100000, 0b00000000 // д 0xE4

db 0x38, 0x54, 0x54, 0x54, 0x18 // e 0xE5

db 0b01101100, 0b00010000, 0b01111100, 0b00010000, 0b01101100, 0b00000000 // ж 0xE6

db 0b01010100, 0b01010100, 0b01010100, 0b01010100, 0b00101000, 0b00000000 // з 0xE7

db 0b01111100, 0b00100000, 0b00010000, 0b00001000, 0b01111100, 0b00000000 // и 0xE8

db 0b01111100, 0b00100000, 0b00010010, 0b00001000, 0b01111100, 0b00000000 // й 0xE9

db 0x7F, 0x10, 0x28, 0x44, 0x00 // k 0xEa

db 0b01100000, 0b00011000, 0b00000100, 0b01111100, 0b00000000, 0b00000000 // л 0xEb

db 0b01111100, 0b00001000, 0b00010000, 0b00001000, 0b01111100, 0b00000000 // м 0xEc

db 0b01111100, 0b00010000, 0b00010000, 0b00010000, 0b01111100, 0b00000000 // н 0xEd

db 0x38, 0x44, 0x44, 0x44, 0x38 // o 0xEe

db 0b01111100, 0b00000100, 0b00000100, 0b00000100, 0b01111100, 0b00000000 // п 0xEf

db 0x7C, 0x14, 0x14, 0x14, 0x08 // p 0xf0

db 0x38, 0x44, 0x44, 0x44, 0x20 // c 0xf1

db 0b00000100, 0b00000100, 0b01111100, 0b00000100, 0b00000100, 0b00000000 // т 0xf2

db 0x0C, 0x50, 0x50, 0x50, 0x3C // y 0xf3

db 0b00010000, 0b00101000, 0b01111100, 0b00101000, 0b00010000, 0b00000000 // ф 0xf4

db 0x44, 0x28, 0x10, 0x28, 0x44 // x 0xf5

db 0b01111100, 0b01000000, 0b01000000, 0b01111100, 0b11000000, 0b00000000 // ц 0xf6

db 0b00011100, 0b00010000, 0b00010000, 0b00010000, 0b01111100, 0b00000000 // ч 0xf7

db 0b01111100, 0b01000000, 0b01110000, 0b01000000, 0b01111100, 0b00000000 // ш 0xf8

db 0b01111100, 0b01000000, 0b01110000, 0b01000000, 0b01111100, 0b11000000 // щ 0xf9

db 0b00000100, 0b01111100, 0b01010000, 0b01010000, 0b00100000, 0b00000000 // ъ 0xfa

db 0b01111100, 0b01010000, 0b01110000, 0b00000000, 0b01111100, 0b00000000 // ы 0xfb

db 0b00000000, 0b01111111, 0b01000100, 0b01000100, 0b00111000, 0b00000000 // Ь 0xfc

db 0b01000100, 0b01000100, 0b01010100, 0b01010100, 0b00111000, 0b00000000 // э 0xfd

db 0b01111100, 0b00010000, 0b00111000, 0b01000100, 0b00111000, 0b00000000 // ю 0xfe

db 0b00001000, 0b01010100, 0b00110100, 0b00010100, 0b01111100, 0b00000000 // я 0xff

6. Моделирование устройства

Моделирование устройства произведено в программе Proteus 7.7 (рисунок 9). В микросхему памяти EEPROM загружен текст, который воспроизводиться на LCD 3310.

Рисунок 9: Моделирование работы электронной книги в Proteus 7.7

Заключение

микропроцессор программа схема

В результате выполнения курсового проекта была спроектирована электронная книга: разработаны структурная и принципиальная схемы, написана программа для микропроцессора, произведено моделирование работы устройства. Разработанное устройство способно воспроизводить текст в формате TXT, сохраненный в памяти EEPROM, отображение текста производиться на ЖК индикаторе от сотового телефона Nokia 3310. Устройство способно хранить до 32 кбайт текста, что соответствует 32 768 символом в кодировке ASCII.

В процессе выполнения курсового проекта был получен практический опыт в написании программы на языке ассемблер для микропроцессора AVR, получен навык работы с интерфейсами SPI и I2C.

Список использованных источников

[1] Wikipedia [Электронный ресурс]. - Электронные данные. - Режим доступа: http://ru.wikipedia.org/wiki/Электронная_книга_(устройство)

[2] Radiokot [Электронный ресурс]. - Электронные данные. - Режим доступа: http://radiokot.ru/circuit/digital/game/11/01.gif

[3] Vnnik71 [Электронный ресурс]. - Электронные данные. - Режим доступа: http://vnnik71.narod.ru/termo_ds18b20_lcd_nokia3310_pic16f628a.html

[4] Exos [Электронный ресурс]. - Электронные данные. - Режим доступа: http://exos.fromru.com

[5] Евстафеев А.В. Микроконтроллеры AVR семейств Tiny и Mega фирмы ATMEL; Додэка - XXI, М. 2008;

[6] Gaw [Электронный ресурс]. - Электронные данные. - Режим доступа: http://www.gaw.ru/html.cgi/txt/ic/Atmel/micros/avr/atmega8.htm

[7] Microchip®-M [Электронный ресурс]: Datasheet / Microchip Technology inc. - Электронные данные. - Режим доступа: 24lc256-i_st.pdf.

[8] PHILIPS®-M [Электронный ресурс]: Datasheet /Philips semiconductor. - Электронные данные. - Режим доступа: PCD8544_1.pdf.

Размещено на Allbest.ru


Подобные документы

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

    курсовая работа [2,7 M], добавлен 10.11.2014

  • Наименование разрабатываемого устройства. Назначение разрабатываемого устройства в городском транспорте. Обзорный анализ найденных аналогов. Обоснование актуальности разработки устройства. Разработка функциональной схемы разрабатываемого устройства.

    курсовая работа [175,6 K], добавлен 04.07.2008

  • Основания для выбора контроллера, который подключается по IDE-шине к устройству CD-ROM. Принцип действия устройства, описание структурной и принципиальной схемы. Выбор элементной базы. Алгоритм работы устройства, разработка программного обеспечения.

    курсовая работа [136,0 K], добавлен 23.12.2012

  • Требования к пользовательскому интерфейсу программного продукта. Выбор инструментальных средств разработки программы. Описание функциональной схемы, модульной структуры, структурной схемы. Технология разработки справочной системы программного продукта.

    дипломная работа [2,7 M], добавлен 12.05.2016

  • Разработка устройства для дефектоскопирования наружного кольца роликового подшипника, построение его структурной и принципиальной схем. Описание алгоритма работы, создание программного обеспечения и сопряжение устройства с персональным компьютером.

    дипломная работа [3,4 M], добавлен 10.03.2013

  • Разработка структурной схемы устройства управления учебным роботом. Выбор двигателя, микроконтроллера, микросхемы, интерфейса связи и стабилизатора. Расчет схемы электрической принципиальной. Разработка сборочного чертежа устройства и алгоритма программы.

    курсовая работа [577,8 K], добавлен 24.06.2013

  • Назначение и применение микроконтроллеров - интегральных микросхем, предназначенных для управления электронными схемами. Описание способа адресации. Разработка программы, описание электрической и структурной схемы разрабатываемого микроконтроллера.

    курсовая работа [177,6 K], добавлен 30.06.2014

  • Обзор системного и прикладного программного обеспечения используемого в ООО "Игровые системы". Описание компьютерной сети предприятия. Разработка игрового продукта для планшетов Apple iPad. Реализация визуального интерфейса и алгоритма работы модуля.

    отчет по практике [1,4 M], добавлен 18.01.2015

  • Анализ предметной области разрабатываемого программного продукта. Разработка интерфейса пользователя и структурной схемы игровой программы "Крестики-нолики". Отладка и тестирование. Проведение исследования компонентов программной среды Borland Delphi 6.0.

    курсовая работа [660,4 K], добавлен 08.03.2015

  • Разработка алгоритма работы. Выбор и обоснование структурной схемы. Разработка функциональной схемы блока ввода и блока вывода. Проектирование принципиальной схемы блока ввода и блока вывода, расчет элементов. Разработка программного обеспечения.

    курсовая работа [1,7 M], добавлен 25.12.2011

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.