АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Инициализация портов

Читайте также:
  1. Вопрос 33 Как фильтрации портов и списки доступа помочь обеспечить безопасность сети?
  2. Государственная регистрация аэродромов и аэропортов
  3. Инициализация bluetooth-соединения
  4. Инициализация и присваивание структур.
  5. Инициализация массивов.
  6. Инициализация указателей
  7. Объявления и инициализация переменных указателей
  8. Роли портов
  1. RS, RW, E - в режим выхода.
  2. DB7..DB0 в режим входа. Впрочем, можно их не трогать, дальше переопределим.

 


Ожидание готовности, чтение флага занятости.

  1. Порт данных на вход с подтяжкой (DDR=0, PORT=1)
  2. RS=0 (команда)
  3. RW=1 (чтение)
  4. E=1 (Готовьсь!!!)
  5. Пауза (14 тактов процессора на 8МГЦ хватало)
  6. Е=0 (Пли!)
  7. Читаем из порта. Если бит 7 (Busy flag) установлен, то повторяем все заново, пока не сбросится.

 


Запись команды

  1. Ожидание готовности
  2. RS=0 (команда)
  3. RW=0 (запись)
  4. Е=1 (Готовьсь!!!)
  5. Порт на выход
  6. Вывести в порт код команды
  7. Пауза
  8. Е=0 (Пли!)
  9. Орудие на плечо Порт на вход, на всякий случай.

 


Запись Данных

  1. Ожидание готовности
  2. RS=1 (Данные)
  3. RW=0 (запись)
  4. Е=1 (Готовьсь!!!)
  5. Порт на выход
  6. Вывести в порт код команды
  7. Пауза
  8. Е=0 (Пли!)
  9. Порт на вход, на всякий случай.

 


Чтение команды

  1. Ожидание готовности
  2. Порт данных на вход с подтяжкой (DDR=0, PORT=1)
  3. RS=0 (команда)
  4. RW=1 (чтение)
  5. Е = 1 (Готовьсь! В этот момент данные из LCD вылазят на шину)
  6. Пауза
  7. Считываем данные с порта
  8. E=0 (Ать!)

 


Чтение Данных

  1. Ожидание готовности
  2. Порт данных на вход с подтяжкой (DDR=0, PORT=1)
  3. RS=1 (Данные)
  4. RW=1 (чтение)
  5. Е = 1 (Готовьсь! В этот момент данные из LCD вылазят на шину)
  6. Пауза
  7. Считываем данные с порта
  8. E=0 (Ать!)

 

С четырех разрядной шиной все точно также, только там каждая операция чтения/записи делается за два дрыга строба.

Запись:

  1. E=1
  2. Пауза
  3. Выставили в порт старшую тетраду
  4. E=0
  5. Пауза
  6. Е=1
  7. Пауза
  8. Выставили в порт младшую тетраду
  9. Е=0

 


Чтение

  1. E=1
  2. Пауза
  3. Читаем из порта старшую тетраду
  4. Е=0
  5. Пауза
  6. Е=1
  7. Пауза
  8. Читаем из порта младшую тетраду
  9. Е=0

 

Ждите код:) Скоро будет:)
UPD:
А вот и код!

Сел я и дописал свою библиотеку для LCD на базе HD44780.

Как она работает я тут расписывать не буду - код весьма плотно фарширован комментариями. Тем более я уже рассказывал как работать с этим дисплеем Поэтому, думаю, разберетесь. Если будут вопросы, то обращайтесь. Тут же я расскажу как ей пользоваться.

Состав
Библиотека состоит из двух файлов LCD.asm и LCD_macro.inc для подключения по 8ми битной шине и LCD4.asm и LCD4_macro.inc для подключения по четырех битной шине данных. Используете тот вариант, по которому у вас подключен дисплей.

  • Файл LCD.asm содержит все основные настройки портов и, собственно, код.
  • LCD_macro.inc содержит макросы для работы с дисплеем. И используется для работы с библиотекой.

Подключение LCD к микроконтроллеру.
Порт данных использует биты 7…4 любого порта на 4 битном подключении, или весь порт целиком на 8ми разрядном
Порт управления использует 3 любых бита любого порта. Главное, чтобы они были на одном порту. Впрочем код можно и чуток подправить:)

Подключение библиотеки в код.
Где нибудь в начале программы, там где обычно определяют макросы, добавляете строчку

1 .include "LCD4_macro.inc"

А в конце кода, там где все процедуры, добавляете

1 .include "LCD4.asm"

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

Настройка
В файле LCD.asm есть раздел LCD_Define

123456789101112131415 ;=========== LCD Define ====================================. equ DATA_PORT = PORTB; LCD Порт данных. equ DATA_PIN = PINB.equ DATA_DDR = DDRB.equ CMD_PORT = PORTA; LCD Порт управления. equ CMD_PIN = PINA.equ CMD_DDR = DDRA.equ E = 0; Бит строба. equ RW = 1; Бит чтения/записи. equ RS = 2; Бит команда/Данные. equ SPEED = 14; 14 для XTAL=16MHz, 10 для XTAL=8MHz,; 6 для XTAL=4MHz, 5 для XTAL<4MHz

Порт данных и порт управления указывай те, которые у тебя используются. У меня вот это В и А. Также не забудь указать к каким битам подключены линии управления.
Параметр SPEED задается в зависимости от скорости кристалла. Больше можно, меньше нет. Можно поставить 14 и не парится. Но некрасиво:)

В файле LCD_macro.inc нужно найти блок настроек дисплея и выставить там нужные биты. Выглядит это так:

12345678910111213 .MACRO INIT_LCD; Инициализация LCD RCALL InitHW; Настроить контрольный порт RCALL LCD_DELAY; Подождать WR_CMD (1<<LCD_F)|(0<<LCD_F_8B); Выдать функцию смены разрядности. WR_CMD (1<<LCD_F)|(0<<LCD_F_8B)|(1<<LCD_F_2L); Дважды.; Так как по дефолту шина 8 бит и нельзя передать сразу вторую половину байта. WR_CMD (1<<LCD_CLR) ;0x01 WR_CMD (1<<LCD_ENTRY_MODE)|(1<<LCD_ENTRY_INC) ;0x06 WR_CMD (1<<LCD_ON)|(1<<LCD_ON_DISPLAY)|(0<<LCD_ON_CURSOR)|(0<<LCD_ON_BLINK) ;0x0C WR_CMD (1<<LCD_HOME).ENDM

Перечень опций, сгруппированных по типу приведен там чуть выше. Обращу внимание на то, что инициализация 4х разрядной шины идет ДВА РАЗА. Первый раз мы говорим контроллеру, что у нас шина 4 разрядная. Но при этом мы не можем сказать второй полубайт слова управления. Поэтому, когда контроллер перейдет на 4х разрядный режим, выдаем нашу посылку снова, на этот раз вторая тетрада нормально пройдет.

Использование
Перед первым использованием надо сделать инициализацию индикатора. Делается это макросом

1 INIT_LCD

При этом задаются параметры дисплея, указанные в разделе инициализации.

Запись байта в дисплей осуществляется макросами

12 WR_CMD xx WR_DATA xx

Где вместо хх вписываем наш байт.

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

12 RCALL CMD_WR RCALL DATA_WR

Чтение осуществляется аналогичным образом:

12 RD_CMD RD_DATA

или

12 RCALL CMD_RD RCALL DATA_RD

В данном случае макрос и процедура ничем не отличаются. Сделано просто для унификации. Считанный байт будет в регистре R17

Установка координаты курсора осуществляется макросом
LCD_COORD X,Y
Где X и Y координаты по горизонтали, и вертикали в знакоместах.

Сдвиг курсора или экрана осуществляется макросом SHIFT xx, где вместо xx подставляются нужные аргументы

1234 SHIFT SCR_L; сдвиг экрана влево SHIFT SCR_К; сдвиг экрана вправо SHIFT CUR_L; сдвиг курсора влево SHIFT CUR_R; сдвиг курсора вправо

Макрос LCDCLR делает полную очистку видеопамяти.

Макрос WR_CGADR xx позволяет установить указатель в область памяти знакогенератора, чтобы можно было записать свой символ. Если затем начать слать данные, то они будут записаны в ячейки знакогенератора.
Макрос RD_CGADR xx позволяет установить указатель в область памяти знакогенератора,чтобы можно было считать байт из знакогенератора.
Макрос WR_DDADR xx устанавливает указатель на видео память. С этого момента все данные попадают на экран.

Для примера попробуем создать зиг руну, ранее упомянутую в записи про описании контроллера

123456789101112131415 INIT_LCD; Инициализируем WR_CGADR 0; Указатель на начало знакогенератора. WR_DATA 0b00000001; Запись данных нового знака WR_DATA 0b00000010 WR_DATA 0b00000100 WR_DATA 0b00011111 WR_DATA 0b00000010 WR_DATA 0b00000100 WR_DATA 0b00001000 WR_DDADR 0; Указатель на начало видео памяти (ячейка с координатми 0,0) WR_DATA 0; У новоиспеченного символа код 0 напечатем его

Системные требования и ограничения
Используется система команда ATMega на некоторых ATTiny может начать ругаться. Придется править. Занимает 474 байта кода в максимальном исполнении (4 битная шина). На 8ми битной шине будет байт на 100 короче. Если выкинуть процедуру чтения, то будет еще короче.

Процедура активно использует регистр R16 и R17, поэтому их содержимое меняется непредсказуемым образом!!! Так что либо учитывайте это, либо сохраняйте заранее эти регистры.

  • Архив с библиотекой для LCD дисплея

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

 


Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.006 сек.)