Вы находитесь на странице: 1из 23

2-1/5.

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


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

Уважаемые коллеги.
В первых строках своего "циркулярного письма", сообщаю Вам приятную новость: наша
летающая корова не сдохла и чувствует себя прекрасно!
Мало того, она полна сил, здоровья и ждет не дождется своего желанного быка.
В дальнейшей, заманчивой перспективе, мысль рисует целое стадо, мирно щиплющее
травку на благодатном лужку.
Соответственно, и молочка, и мясца будет, по-русски говоря, завались.
В переводе на более понятный язык, это означает то, что Александр Милевский
предложил универсальный, "прыжковый" алгоритм.
Примечание: на мой взгляд, памятник за это ему ставить не нужно (как-никак, живой
человек. Некрасиво получится), но соответствующее звание ("виртуальное" или
реальное. Это с какого бока глянуть) присвоить обязательно нужно.
В переводе на еще более понятный язык, это означает то, что имеет место быть
универсальный способ "борьбы" с "прыжковыми бяками".
И он должен быть "прописан в скрижалях", а заодно и в мозгах конструкторов,
страждущих спокойной и толковой жизни.
Из этого следует жизненнопрофессиональное правило:

Если, на начальном этапе работы по составлению текста программы,


существует подозрение в "бяковости" того или иного "прыжка", то, перед
этим "прыжком", всем врагам на зло, в текст программы, нужно "врезать"
"волшебную" комбинацию из двух команд:

......................
movlw high ABCD ; Установка в PCH числового значения старшего
movwf PCLATH ; байта адреса (в PC) первой команды ПП ABCD.

call ABCD ; "Безбяковый прыжок".


......................

То же самое относится и к команде goto.


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

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


достаточно заумных "словоблудий" (в части касающейся "прыжков").
Но "почивать на этих лаврах не гоже".
Нужно осуществить дальнейшее "продирание через тернии к звездам" (вспомните про
прогресс и о предмете разговора).
Осуществляю …
1
Задача: нужно разобраться с динамически изменяющимися элементами картинки.
Предположим, что 1-й "кадр", со всеми фиксированными элементами "картинки",
выведен на индикацию.
Далее, начиная от 2-го полного цикла программы, нужно обеспечить вывод на
индикацию динамически изменяющихся элементов картинки.
Это могут быть, например, цифры (показания результатов
измерений/преобразований/вычислений), буквы и знаки препинания (слова, фразы,
предложения и т.п.), а также графики, диаграммы, эпюры … , и вообще все то
(включая и всяческие "наборы" вышеупомянутого и не упомянутого), что может
"родиться" в "буйном" воображении конструктора (тайна сия велика есть. Высшие
сферы).
При этом, никак нельзя "загубить" ту фиксированную картинку, которая была выведена
на индикацию в ходе отработки 1-го, полного цикла программы, иначе, "за что кровь
пролита"?
В соответствующих ячейках оперативной памяти графического модуля, код этой
картинки должен быть "неприкасаем" ("по его верху", не должно ничего записываться).
Начиная от 2-го "витка" полного цикла программы и далее, "прикасаемым" должно
быть только то, что относится к динамически изменяющимся элементам картинки.
И это архипрекрасно ("архи" это из произведений В.И.Ленина. "Автоматом осело в
мозгах", по причине учебы в военном училище), так как, в полном цикле программы,
на индикацию нужно будет выводить не массив байтов, с количеством аж 1024 штуки,
а нечто более скромное.
Это внушает огромный оптимизм, в части касающейся требуемого (для работы с
такими "монстрами") объема памяти программ ПИКа среднего (или еще какого-то)
семейства.
Вот Вам и формулировка той технической задачи, которую сейчас нужно решить
(первичное задание на разработку).
По-первости, это прямо-таки "ужасает", но следует иметь ввиду, что в жизни бывают
такие случаи, когда человек становится гораздо ужаснее того "ужаса", о котором идет
речь.
Просто нужно как следует "завестись" ("раздракониться").
Специфики этого таинства могут быть различны, но суть одна - сильнейшее желание
"свернуть шею" тому, что мешает двигаться дальше.
Лично мне, на конечной стадии "доведения до кондиции", вспоминаются и Есенин с
Шукшиным, и березки, которые целуются, и "полундра", и математический анализ (и
т.д.), со всеми его "потрохами", и русская "мать-перемать", и всяческие нули с
единицами, в комплексе с летающими коровами и "шпиономанией", и еще много кое-
чего забавного (родственные души поймут).
Не правда ли, получается довольно-таки "живописная и колоритная картина", в стиле
типа "а-ля Шишкин & программирование". И это не кошмарный сон.
Самое интересное заключается в том, что эта эмоциональная "иррациональность" четко
срабатывает (против лома нет приема).
Сейчас докажу.
Сначала, нужно создать то, с чем работать (предмет приложения "дубины") и что, в
дальнейшем, можно пожалеть.
Почему бы и не пожалеть, если "предмет приложения дубины" находится в жалком
состоянии (проще говоря, "в соплях")?
А если не в жалком, то до такого состояния его нужно довести, а иначе, что жалеть?
Это и есть специфическая, исконно русская, "железная" логика: "гибрид огромной,
медвежьей силы с не менее огромной, но не медвежьей, а человеческой душой".
А если к этому еще и мозги приложить (желательно качественные), то …
Именно поэтому я и утверждаю, что победить такое "творение природы" нельзя.
Оно, в честной схватке, само кого угодно победит.
А заодно и пожалеет, если у несчастного "сопли потекут".
Голос из-за кулис: "Опять ты со своим русским духом. Когда птички крыльями махать
будут? Это обещано."
Что обещано, то обещано. Сейчас что-нибудь "состряпаю".

Создание динамических элементов картинки.


2
Предположим, что я заставлю "птичек" дого и упорно "махать своими крыльями".
Это и есть динамический элемент картинки, который нужно создать.
"Птички дислоцируются" во 2-й и 3-й страницах 2-го кристалла.
Мелочиться не буду в том смысле, что кроме сказанного, под "динамику", задействую
2-ю и 3-ю страницы 1-го кристалла.
В итоге, придется работать со 2-ми и 3-ми страницами обеих кристаллов.
Мое "буйное" воображение выдало такую "динамику" (навеяно армейской темой):

Для создания сценариев динамического элемента картинки, использовано,


незадействованное ранее, поле 2-го ("резервного") "кадра".
Сценариев - 2 штуки.
В случае их чередования, "птички" будут "махать своими крыльями" (примитивный
мультик).
Контекст надписи, сопровождающей это "махание" ("упасть/отжаться"), а также и
направление "вектора тяги" (жирные стрелки), будут соответствовать физической сути
производимых действий (напоминаю про закон всемирного тяготения и намекаю на то,
что вокруг нас не ваккум).
Примечание: в картинку 1-го сценария, "птички" скопированы с помощью контекстного
меню программы АВС.exe.
"Драматургия спектакля" такова: после отработки 1-го, полного цикла программы, на
индикацию выводится то, что Вы видите в верхней половине поля программы ABC.exe.
Через, примерно, 2,5 сек., содержимое 2-й и 3-й страниц обеих кристаллов обновится,
и на индикацию будет выведена картинка 1-го сценария.
Через, примерно 0,8 сек., картинка 1-го сценария сменится на картинку 2-го сценария.
Через, примерно 0,8 сек., картинка 2-го сценария сменится на картинку 1-го сценария.
Далее, это будет чередоваться до тех пор, пока сие "безобразие" не будет
прекращено щелчком тумблера питания этой "бестолковой железяки".
Это я любя.
"Железяка" вовсе не "бестолковая", а совсем наоборот.
С ее помощью, можно много кое-чего "заложить на длительное хранение" в свою
"извилину".
В течение всего времени смен 1-го и 2-го сценариев, содержимое дисплея, за
исключением страниц кристаллов, с номерами, отличающимися от №№ 2 и 3,
останется неизменным.
Вот Вам и фиксированные элементы картинки (сохраняются в оперативной памяти
графического модуля).
Они выводятся на индикацию на 1-м "витке" полного цикла программы.
3
Динамические элементы картинки выводятся на индикацию только во 2-е и 3-е
страницы кристаллов.

Далее возникает вопрос: "Как быть с нижней половиной солнца и с конусообразной


верхушкой ракеты (боеголовкой), ведь это есть часть фиксированных элементов
картинки, "попавших под раздачу слонов"?
При "сплошном" заполнении байтами данных 2-й и 3-й страниц 2-го кристалла, они
"погибнут" по той простой причине, что будет осуществлена запись нулей "по их верху"
(см. рис. 1).
Для демонстрации абсолютной правомерности этого вопроса, на рис. 2,
вышеупомянутые "куски" солнца и ракеты, выделены красным цветом:

Ответ: для того чтобы сохранить эти "куски" от уничтожения, их нужно обойти, но
обойти по-умному, с выгодой.
"Секторы" такого "обхода" выделены желтым цветом.
Выгода заключается в том, что "оптово прихватываются" ("за компанию") все байты
данных с нулевым содержимым, "примыкающие" к матрицам 8х8 (как слева, так и
справа. На сколько возможно).
Это уменьшает и количество команд, и увеличивает скорость отработки полного цикла
вывода данных на индикацию (начиная от 2-го "витка" полного цикла программы и
далее).
Выводы:

- Для того чтобы не допустить "убийства" нижней половины солнца, нужно закончить
цикл заполнения байтами данных 2-й страницы, 2-го кристалла, сразу же после
вывода на индикацию байтов данных самой правой "птички" 2-й страницы.
- Для того чтобы, с учетом необходимости дальнейшего формирования самой правой
"птички" 3-й страницы, 2-го кристалла, не допустить "убийства" боеголовки ракеты,
нужно обойти столбцы этой страницы, начиная от столбца, который расположен
правее правого крыла левой птички и заканчивая столбцом, расположенным левее
левого крыла правой птички.

Что касается стрелки, которой "укомплектовано" слово "птички", то я ее "убил"


(записью нулей "по верху") потому, что она мешает "махать крыльями" той "птичке", на
которую она указывает.

4
Перечитал написанное. М-да … Тяжелый случай.
Уважаемые коллеги, я нормальный, а не псих, находящийся на последней стадии их
беды! Клятвенно заверяю.
Против нижней половины реального солнца я не имею ничего против.
Пускай светит на здоровье.
Дай Бог, чтобы оно светило в течение ближайшей пары миллиардов лет.
И я не сторонник разукомплектования ракет.
Тем более, когда речь идет о такой серьезной "штуковине", как боеголовка.
К тому же, ракета без боеголовки это все-равно что телега без колес.
И т.д.
Просто предмет разговора таков, что если я начну изъясняться формально, то
"тяжелый случай" приключится не со мной, а с Вами.
В мои планы это не входит.
Так что, терпите. Это для Вашей же пользы.

Итак, "глобальная" стратегия динамического "сюжета" более - менее определилась.


Теперь нужно заняться кодами сценариев №1 и №2.
О том, как они создаются, было рассказано ранее. Повторяться не буду.
Выдаю результат.
Сначала составляется таблица, в которой кристаллы "свалены в кучу":

1-й сценарий (УПАСТЬ…)


; * * * * * Chars 144..159: * * * * *
Кристалл1, 2-я страница
0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00
0x00,0xFE,0x00,0x00,0x00,0x00,0xFE,0x02
0x02,0x02,0x02,0x02,0x02,0xFE,0x00,0x00
0x00,0x00,0xE0,0x10,0x08,0x04,0x02,0x02
0x02,0xFE,0x00,0x00,0x00,0x00,0xFC,0x02
0x02,0x02,0x02,0x02,0x02,0x0C,0x00,0x00
0x00,0x02,0x02,0x02,0x02,0xFE,0x02,0x02
0x02,0x02,0x00,0x00,0x00,0x00,0xFE,0x40
Кристалл2, 2-я страница
0x40,0x40,0x40,0x40,0x80,0x00,0x00,0x00
0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xF8
0xF8,0xF8,0x00,0x00,0x00,0x00,0x00,0x00
0x00,0x08,0x08,0x10,0x08,0x08,0x00,0x00
0x04,0x04,0x08,0x10,0x08,0x04,0x04,0x00
0x00,0x00,0x08,0x08,0x10,0x08,0x08,0x00
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00

; * * * * * Chars 160..175: * * * * *
Кристалл1, 3-я страница
0x00,0x00,0x21,0x42,0x42,0x42,0x42,0x42
0x41,0x3F,0x00,0x00,0x00,0x00,0x7F,0x00
0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00
0x00,0x00,0x7F,0x02,0x02,0x02,0x02,0x02
0x02,0x7F,0x00,0x00,0x00,0x00,0x3F,0x40
0x40,0x40,0x40,0x40,0x40,0x30,0x00,0x00
0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00
0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x40
Кристалл2, 3-я страница
0x40,0x40,0x40,0x40,0x3F,0x00,0x00,0x00
0x00,0x00,0x04,0x0C,0x1C,0x3C,0x7F,0xFF
0xFF,0x7F,0x3C,0x1C,0x0C,0x04,0x00,0x00

5
0x01,0x01,0x02,0x04,0x02,0x01,0x01,0x00
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
0x00,0x00,0x04,0x04,0x08,0x04,0x04,0x00

2-й сценарий (ОТЖАТЬСЯ…)


; * * * * * Chars 192..207: * * * * *
Кристалл1, 2-я страница
0x00,0xF8,0x04,0x04,0x04,0x04,0xF8,0x00
0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0x00
0x0C,0x10,0x20,0x40,0x80,0xFC,0x80,0x40
0x20,0x10,0x0C,0x00,0x00,0xE0,0x10,0x08
0x04,0x04,0xFC,0x00,0x04,0x04,0x04,0xFC
0x04,0x04,0x04,0x00,0xFC,0x40,0x40,0x40
0x40,0x80,0x00,0x00,0xF8,0x04,0x04,0x04
0x04,0x08,0x00,0x00,0xF8,0x04,0x04,0x04
Кристалл2, 2-я страница
0x04,0xFC,0x00,0x00,0x00,0x00,0x00,0x00
0x00,0x00,0x20,0x30,0x38,0x3C,0xFE,0xFF
0xFF,0xFE,0x3C,0x38,0x30,0x20,0x00,0x00
0x00,0x20,0x20,0x10,0x20,0x20,0x00,0x00
0x40,0x40,0x20,0x10,0x20,0x40,0x40,0x00
0x00,0x00,0x20,0x20,0x10,0x20,0x20,0x00
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00

; * * * * * Chars 208..223: * * * * *
Кристалл1, 3-я страница
0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00
0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00
0x30,0x08,0x04,0x02,0x01,0x3F,0x01,0x02
0x04,0x08,0x30,0x00,0x00,0x3F,0x01,0x01
0x01,0x01,0x3F,0x00,0x00,0x00,0x00,0x3F
0x00,0x00,0x00,0x00,0x3F,0x20,0x20,0x20
0x20,0x1F,0x00,0x00,0x1F,0x20,0x20,0x20
0x20,0x10,0x00,0x00,0x21,0x12,0x0A,0x06
Кристалл2, 3-я страница
0x02,0x3F,0x00,0x00,0x00,0x00,0x00,0x00
0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F
0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00
0x10,0x10,0x08,0x04,0x08,0x10,0x10,0x00
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
0x00,0x00,0x10,0x10,0x08,0x10,0x10,0x00

Далее, с целью обеспечения удобства дальнейшей работы, происходит упорядочение


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

1-й сценарий (УПАСТЬ…)


1-й кристалл

2-я страница
6
0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00
0x00,0xFE,0x00,0x00,0x00,0x00,0xFE,0x02
0x02,0x02,0x02,0x02,0x02,0xFE,0x00,0x00
0x00,0x00,0xE0,0x10,0x08,0x04,0x02,0x02
0x02,0xFE,0x00,0x00,0x00,0x00,0xFC,0x02
0x02,0x02,0x02,0x02,0x02,0x0C,0x00,0x00
0x00,0x02,0x02,0x02,0x02,0xFE,0x02,0x02
0x02,0x02,0x00,0x00,0x00,0x00,0xFE,0x40
3-я страница
0x00,0x00,0x21,0x42,0x42,0x42,0x42,0x42
0x41,0x3F,0x00,0x00,0x00,0x00,0x7F,0x00
0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00
0x00,0x00,0x7F,0x02,0x02,0x02,0x02,0x02
0x02,0x7F,0x00,0x00,0x00,0x00,0x3F,0x40
0x40,0x40,0x40,0x40,0x40,0x30,0x00,0x00
0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00
0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x40

2-й кристалл

2-я страница
0x40,0x40,0x40,0x40,0x80,0x00,0x00,0x00
0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xF8
0xF8,0xF8,0x00,0x00,0x00,0x00,0x00,0x00
0x00,0x08,0x08,0x10,0x08,0x08,0x00,0x00
0x04,0x04,0x08,0x10,0x08,0x04,0x04,0x00
0x00,0x00,0x08,0x08,0x10,0x08,0x08,0x00
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
3-я страница
0x40,0x40,0x40,0x40,0x3F,0x00,0x00,0x00
0x00,0x00,0x04,0x0C,0x1C,0x3C,0x7F,0xFF
0xFF,0x7F,0x3C,0x1C,0x0C,0x04,0x00,0x00
0x01,0x01,0x02,0x04,0x02,0x01,0x01,0x00
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
0x00,0x00,0x04,0x04,0x08,0x04,0x04,0x00

2-й сценарий (ОТЖАТЬСЯ…)


1-й кристалл

2-я страница
0x00,0xF8,0x04,0x04,0x04,0x04,0xF8,0x00
0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0x00
0x0C,0x10,0x20,0x40,0x80,0xFC,0x80,0x40
0x20,0x10,0x0C,0x00,0x00,0xE0,0x10,0x08
0x04,0x04,0xFC,0x00,0x04,0x04,0x04,0xFC
0x04,0x04,0x04,0x00,0xFC,0x40,0x40,0x40
0x40,0x80,0x00,0x00,0xF8,0x04,0x04,0x04
0x04,0x08,0x00,0x00,0xF8,0x04,0x04,0x04
3-я страница
0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00
0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00
0x30,0x08,0x04,0x02,0x01,0x3F,0x01,0x02
0x04,0x08,0x30,0x00,0x00,0x3F,0x01,0x01
0x01,0x01,0x3F,0x00,0x00,0x00,0x00,0x3F
0x00,0x00,0x00,0x00,0x3F,0x20,0x20,0x20
7
0x20,0x1F,0x00,0x00,0x1F,0x20,0x20,0x20
0x20,0x10,0x00,0x00,0x21,0x12,0x0A,0x06

2-й кристалл

2-я страница
0x04,0xFC,0x00,0x00,0x00,0x00,0x00,0x00
0x00,0x00,0x20,0x30,0x38,0x3C,0xFE,0xFF
0xFF,0xFE,0x3C,0x38,0x30,0x20,0x00,0x00
0x00,0x20,0x20,0x10,0x20,0x20,0x00,0x00
0x40,0x40,0x20,0x10,0x20,0x40,0x40,0x00
0x00,0x00,0x20,0x20,0x10,0x20,0x20,0x00
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
3-я страница
0x02,0x3F,0x00,0x00,0x00,0x00,0x00,0x00
0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F
0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00
0x10,0x10,0x08,0x04,0x08,0x10,0x10,0x00
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
0x00,0x00,0x10,0x10,0x08,0x10,0x10,0x00

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


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

;********************************************************************************
; 12864_1a.asm Учебное устройство вывода на индикацию, в графический
; модуль МT-12864.., динамически изменяющейся картинки.
; (ЗАГОТОВКА)
; "Дочь" базовой программы Милевского А.З. mazr@bk.ru
;********************************************************************************
; "Практикум по конструированию устройств на PIC контроллерах"
; (http://ikarab.narod.ru)
; Корабельников Евгений Александрович karabea@Lipetsk.ru
;********************************************************************************
; Используются операторы high и low.
;================================================================================
; Функции выводов порта С:
; RC0...RC7 - выводы данных.
; Функции выводов порта В:
; RB0 - Е2 ; управление правым (2-м) кристаллом,
; RB1 - Е1 ; управление левым (1-м) кристаллом,
; RB2 - E ; на этом выводе формируются стробирующие импульсы,
; RB3 - A0 ; управление режимами "данные/команды",
; остальные выводы порта В не задействованы.
; Выводы порта С не используются.
; Кварц 4000 Кгц (1 м.ц.= 1 мкс.).
; Используется PIC16F873A.
;================================================================================
LIST p=16F873A ; Задание типа микроконтроллера.
__CONFIG 3F71H ; Включено: XT-генератор, PWRT, сброс BOR,
; Выключено: защита, WDT, LVP, DEBUG.
;================================================================================
; Регистры специального назначения.
;================================================================================
PCLATH equ 0Ah ; Регистр PCLATH (используется при работе

8
; с PCH).
PCL equ 02h ; Регистр младшего байта счетчика команд.
Status equ 03h ; Регистр Status.
PortB equ 06h ; Регистр защелок порта B.
PortC equ 07h ; Регистр защелок порта C.
TrisB equ 06h ; Регистр выбора направлений работы
; выводов порта B (банк 1).
TrisC equ 07h ; Регистр выбора направлений работы
; выводов порта С (банк 1).
;================================================================================
; Регистры общего назачения.
;================================================================================
Temp equ 20h ; Регистр количества проходов.
Reg equ 21h ; Регистр выбора сценария
; вычисляемого перехода.
Reg_1 equ 22h ; Регистры
Reg_2 equ 23h ; задержки
Reg_3 equ 24h ; ----"----
;================================================================================
; Присвоение битам названий.
;================================================================================
C equ 0 ; Флаг переноса-заема.
RP0 equ 5 ; Бит выбора банка.
E2 equ 0 ; Бит выбора 2-го кристалла.
E1 equ 1 ; Бит выбора 1-го кристалла.
E equ 2 ; Бит стробирования.
A0 equ 3 ; Бит выбора режима "команды/данные".
;================================================================================
org 0 ; Начать выполнение программы с 0-го адреса PC
goto START ; Переход в ПП START.
;********************************************************************************

;================================================================================
; Подпрограммы выбора страниц (1...8) кристалла.
;================================================================================
; ПП установки адреса 1-й страницы.
;------------------------------------
STRANICA_1 movlw b'10111000' ; Выбор адреса 1-й страницы.
movwf PortC ; Вывод команды выбора адреса страницы
; на линии DB7...DB0.
call STROB ; Строб ("запуск в работу").
;---> Возврат по стеку из ПП STROB ;
return ; Возврат по стеку в то место, откуда
; произошел вызов подпрограммы.
;------------------------------------
; ПП установки адреса 2-й страницы.
;------------------------------------
STRANICA_2 movlw b'10111001' ; ----"----
movwf PortC ; Аналогично
call STROB ; (для 2-й страницы).
;---> Возврат по стеку из ПП STROB ; ----"----
return ; ----"----
;------------------------------------
; ПП установки адреса 3-й страницы.
;------------------------------------
STRANICA_3 movlw b'10111010' ; ----"----
movwf PortC ; Аналогично
call STROB ; (для 3-й страницы).
;---> Возврат по стеку из ПП STROB ; ----"----
return ; ----"----
;------------------------------------
; ПП установки адреса 4-й страницы.
;------------------------------------
STRANICA_4 movlw b'10111011' ; ----"----
movwf PortC ; Аналогично
9
call STROB ; (для 4-й страницы).
;---> Возврат по стеку из ПП STROB ; ----"----
return ; ----"----
;------------------------------------
; ПП установки адреса 5-й страницы.
;------------------------------------
STRANICA_5 movlw b'10111100' ; ----"----
movwf PortC ; Аналогично
call STROB ; (для 5-й страницы).
;---> Возврат по стеку из ПП STROB ; ----"----
return ; ----"----
;------------------------------------
; ПП установки адреса 6-й страницы.
;------------------------------------
STRANICA_6 movlw b'10111101' ; ----"----
movwf PortC ; Аналогично
call STROB ; (для 6-й страницы).
;---> Возврат по стеку из ПП STROB ; ----"----
return ; ----"----
;------------------------------------
; ПП установки адреса 7-й страницы.
;------------------------------------
STRANICA_7 movlw b'10111110' ; ----"----
movwf PortC ; Аналогично
call STROB ; (для 7-й страницы).
;---> Возврат по стеку из ПП STROB ; ----"----
return ; ----"----
;------------------------------------
; ПП установки адреса 8-й страницы.
;------------------------------------
STRANICA_8 movlw b'10111111' ; ----"----
movwf PortC ; Аналогично
call STROB ; (для 8-й страницы).
;---> Возврат по стеку из ПП STROB ; ----"----
return ; ----"----
;================================================================================
; Подпрограмма записи данных.
;================================================================================
WRITE_D bsf PortB,A0 ; Установка признака записи данных {1}.
call STROB ; Строб ("запуск в работу").
;---> Возврат по стеку из ПП STROB
bcf PortB,A0 ; Снятие признака записи данных {0}.
return ; Возврат по стеку в то место, откуда
; произошел вызов подпрограммы.
;================================================================================
; ЗАДЕРЖКА (0,8 сек.)
;================================================================================
PAUSE movlw .241 ;
movwf Reg_1 ;
movlw .15 ;
movwf Reg_2 ;
movlw .5 ;
movwf Reg_3 ;

decfsz Reg_1,F ; Стандартный


goto $-1 ; 3-байтный
decfsz Reg_2,F ; вычитающий
goto $-3 ; счетчик.
decfsz Reg_3,F ;
goto $-5 ;

return ; Возврат по стеку в то место, откуда


; произошел вызов подпрограммы.
;================================================================================
; Подпрограмма стробирования.
;================================================================================
10
STROB bsf PortB,E ; Формирование
bcf PortB,E ; стробирующего импульса.
return ; Возврат по стеку в то место, откуда
; произошел вызов подпрограммы.
;================================================================================
; Подпрограмма установки первого (самого левого) столбца страницы (адрес 00h).
; С него начинается заполнение страницы.
;================================================================================
STOLB_1 movlw b'01000000' ; Выбор адреса 1-го столбца (00h).
movwf PortC ; Вывод команды выбора адреса столбца
; на линии DB7...DB0.
call STROB ; Строб ("запуск в работу").
;---> Возврат по стеку из ПП STROB
return ; Возврат по стеку в то место, откуда
; произошел вызов подпрограммы.
;================================================================================

;********************************************************************************
; НАЧАЛО ПРОГРАММЫ.
;********************************************************************************
; Подготовительные операции.
;================================================================================
START bsf Status,RP0 ; Переход в 1-й банк.
clrf TrisB ; Все выводы портов В и С
clrf TrisC ; работают на выход.
bcf Status,RP0 ; Переход в 0-й банк.
;================================================================================
; Инициализация графического модуля.
;================================================================================
bsf PortB,E1 ; Включение обеих
bsf PortB,E2 ; кристаллов.

movlw b'00111110' ; Инструкция "Display OFF"


movwf PortC ; (выключение дисплея).
call STROB ; Строб ("запуск в работу").
;---> Возврат по стеку из ПП STROB
movlw b'00111111' ; Инструкция "Display ON"
movwf PortC ; (включение дисплея).
call STROB ; Строб ("запуск в работу").
;---> Возврат по стеку из ПП STROB
;------------------------------------
; Задержка 16 мкс (с запасом в 6мкс.)
;------------------------------------
movlw .5 ;
movwf Temp ; Стандартный,
decfsz Temp,F ; 1-байтный
goto $-1 ; счетчик.
;-------------------------------------
; Установка 1-й (самой верхней) строки
; обеих кристаллов (адрес 00h).
;-------------------------------------
movlw b'11000000' ; Выбор адреса 1-й строки (00h)
; (инструкция "Display StartLine").
movwf PortC ; Вывод команды выбора адреса строки
; на линии DB7...DB0.
call STROB ; Строб ("запуск в работу").
;---> Возврат по стеку из ПП STROB

;################################################################################
; РАБОТА С ЛЕВЫМ (1-м) КРИСТАЛЛОМ.
;################################################################################
; Включение 1-го кристалла.
;-------------------------------------
bcf PortB,E2 ; Выключение 2-го кристалла.
;================================================================================
11
; Заполнение страниц 1-го кристалла.
;================================================================================
; Запись в 1-ю страницу 1-го кристалла
;--------------------------------------------------------------------------------
; Подготовительные операции.
;--------------------------------------
call STRANICA_1 ; Выбор 1-й страницы.
call STOLB_1 ; Выбор 1-го столбца страницы.
movlw .64 ; Назначение
movwf Temp ; числа проходов.
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Циклическая ПП заполнения байтами данных столбцов страницы.
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
WR_1 movf Temp,W ; Число проходов --> в W.
sublw .64 ; .64 - Temp = ... (результат --> в W).
movwf Reg ; В регистр Reg записывается номер текущего
; сценария вычисляемого перехода.
;-------------------------------------
; Отработка ПП, в состав которой
; входит вычисляемый переход.
;-------------------------------------
call TEXT_1 ; Переход в ПП TEXT_1.
;---> Возврат по стеку из ПП TEXT_1
;-------------------------------------
; Вывод на индикацию текущего байта
; данных ("лежит" в W).
;-------------------------------------
movwf PortC ; Установка на линиях DB7...DB0 числового
; значения текущего байта данных.
movlw high WRITE_D; Установка в PCH числового значения старшего
movwf PCLATH ; байта адреса (в PC) первой команды
; ПП WRITE_D (через W).
call WRITE_D ; Переход в ПП WRITE_D (с предустановленным
; значением PCH).
;---> Возврат по стеку из ПП WRITE_D
decfsz Temp,F ; Число проходов уменьшается на 1.
goto WR_1 ; Если результат не=0, то переход на
; обработку следующего байта данных.
; Если =0, то запись в 1-ю страницу
; заканчивается и программа исполняется
; далее.
;--------------------------------------------------------------------------------
; Запись во 2-ю страницу 1-го кристалла
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; Запись в 3-ю страницу 1-го кристалла
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; Запись в 4-ю страницу 1-го кристалла
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; Запись в 5-ю страницу 1-го кристалла
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; Запись в 6-ю страницу 1-го кристалла
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; Запись в 7-ю страницу 1-го кристалла
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; Запись в 8-ю страницу 1-го кристалла
;--------------------------------------------------------------------------------

;################################################################################
; РАБОТА С ПРАВЫМ (2-м) КРИСТАЛЛОМ.
;################################################################################
12
; Включение 2-го кристалла.
;-------------------------------------
bcf PortB,E1 ; Выключение 1-го кристалла.
bsf PortB,E2 ; Включение 2-го кристалла.
;================================================================================
; Заполнение страниц 2-го кристалла.
;================================================================================
; Запись в 1-ю страницу 2-го кристалла
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; Запись во 2-ю страницу 2-го кристалла
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; Запись в 3-ю страницу 2-го кристалла
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; Запись в 4-ю страницу 2-го кристалла
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; Запись в 5-ю страницу 2-го кристалла
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; Запись в 6-ю страницу 2-го кристалла
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; Запись в 7-ю страницу 2-го кристалла
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; Запись в 8-ю страницу 2-го кристалла
;--------------------------------------------------------------------------------
;================================================================================
; Задержка, обеспечивающая комфортное, визуальное восприятие того,
; что выведено на индикацию.
;================================================================================
movlw high PAUSE ; "Плавающая" коррекция
movwf PCLATH ; содержимого PCH.

call PAUSE ; Три


;---> Возврат по стеку из ПП PAUSE ; последовательно
call PAUSE ; отрабатываемых
;---> Возврат по стеку из ПП PAUSE ; задержки.
call PAUSE ;
;---> Возврат по стеку из ПП PAUSE ;

;################################################################################
; СЦЕНАРИЙ "УПАСТЬ..." (№1).
;################################################################################
; Запись 1-го сценария во 2-ю страницу 2-го кристалла
;--------------------------------------------------------------------------------
DINAM call STRANICA_2 ;
call STOLB_1 ;
movlw .47 ;
movwf Temp ;

WR122 movf Temp,W ;


sublw .47 ;
movwf Reg ; То же самое, только
call TEXT122 ; переход происходит
movwf PortC ; в ПП TEXT122,
movlw high WRITE_D; с числом проходов .47.
movwf PCLATH ;
call WRITE_D ;
decfsz Temp,F ;
goto WR122 ;
;--------------------------------------------------------------------------------
; Запись 1-го сценария в 3-ю страницу 2-го кристалла
13
;--------------------------------------------------------------------------------
call STRANICA_3 ;
call STOLB_1 ;
movlw .31 ;
movwf Temp ;

WR132 movf Temp,W ;


sublw .31 ;
movwf Reg ; То же самое, только
call TEXT132 ; переход происходит
movwf PortC ; в ПП TEXT132,
movlw high WRITE_D; с числом проходов .31.
movwf PCLATH ;
call WRITE_D ;
decfsz Temp,F ;
goto WR132 ;
;------------------------------------
; Продолжение работы на 3-й странице.
;------------------------------------
movlw b'01111010' ; Выбор адреса 59-го столбца
; (инструкция "Set Address").
movwf PortC ; Вывод команды выбора адреса столбца
; на линии DB7...DB0.
call STROB ; Строб ("запуск в работу").
;---> Возврат по стеку из ПП STROB
movlw .6 ;
movwf Temp ;

WR132_1 movf Temp,W ;


sublw .6 ;
movwf Reg ; То же самое, только
call TEXT132_1 ; переход происходит
movwf PortC ; в ПП TEXT132_1,
movlw high WRITE_D; с числом проходов .6.
movwf PCLATH ;
call WRITE_D ;
decfsz Temp,F ;
goto WR132_1 ;
;-------------------------------------
; Включение 1-го кристалла.
;-------------------------------------
bsf PortB,E1 ; Включение 1-го кристалла.
bcf PortB,E2 ; Выключение 2-го кристалла.
;--------------------------------------------------------------------------------
; Запись 1-го сценария во 2-ю страницу, 1-го кристалла
;--------------------------------------------------------------------------------
call STRANICA_2 ;
call STOLB_1 ;
movlw .64 ;
movwf Temp ;

WR121 movf Temp,W ;


sublw .64 ;
movwf Reg ; То же самое, только
call TEXT121 ; переход происходит
movwf PortC ; в ПП TEXT121.
movlw high WRITE_D;
movwf PCLATH ;
call WRITE_D ;
decfsz Temp,F ;
goto WR121 ;
;--------------------------------------------------------------------------------
; Запись 1-го сценария в 3-ю страницу 1-го кристалла
;--------------------------------------------------------------------------------
call STRANICA_3 ;
call STOLB_1 ;
14
movlw .64 ;
movwf Temp ;

WR131 movf Temp,W ;


sublw .64 ;
movwf Reg ; То же самое, только
call TEXT131 ; переход происходит
movwf PortC ; в ПП TEXT131.
movlw high WRITE_D;
movwf PCLATH ;
call WRITE_D ;
decfsz Temp,F ;
goto WR131 ;
;================================================================================
; Задержка, обеспечивающая комфортное, визуальное восприятие того,
; что выведено на индикацию.
;================================================================================
movlw high PAUSE ; "Плавающая" коррекция
movwf PCLATH ; содержимого PCH.

call PAUSE ; Задержка.


;---> Возврат по стеку из ПП PAUSE

;################################################################################
; СЦЕНАРИЙ "ОТЖАТЬСЯ..." (№2).
;################################################################################
; Запись 2-го сценария во 2-ю страницу 1-го кристалла
;--------------------------------------------------------------------------------
call STRANICA_2 ;
call STOLB_1 ;
movlw .64 ;
movwf Temp ;

WR221 movf Temp,W ;


sublw .64 ;
movwf Reg ; То же самое, только
call TEXT221 ; переход происходит
movwf PortC ; в ПП TEXT221.
movlw high WRITE_D;
movwf PCLATH ;
call WRITE_D ;
decfsz Temp,F ;
goto WR221 ;
;--------------------------------------------------------------------------------
; Запись 2-го сценария в 3-ю страницу 1-го кристалла
;--------------------------------------------------------------------------------
call STRANICA_3 ;
call STOLB_1 ;
movlw .64 ;
movwf Temp ;

WR231 movf Temp,W ;


sublw .64 ;
movwf Reg ;

movlw high TEXT231; Так как далее следует переход на 2-ю


movwf PCLATH ; страницу памяти программ ПИКа, то
; производится "плавающая" коррекция
; содержимого PCH.
call TEXT231 ; То же самое, только
movwf PortC ; переход происходит
movlw high WRITE_D; в ПП TEXT231.
movwf PCLATH ;
call WRITE_D ;
decfsz Temp,F ;
goto WR231 ;
15
;-------------------------------------
; Включение 2-го кристалла.
;-------------------------------------
bcf PortB,E1 ; Выключение 1-го кристалла.
bsf PortB,E2 ; Включение 2-го кристалла.
;--------------------------------------------------------------------------------
; Запись 2-го сценария во 2-ю страницу 2-го кристалла
;--------------------------------------------------------------------------------
call STRANICA_2 ;
call STOLB_1 ;
movlw .47 ;
movwf Temp ;

WR222 movf Temp,W ;


sublw .47 ;
movwf Reg ; То же самое, только
call TEXT222 ; переход происходит
movwf PortC ; в ПП TEXT222,
movlw high WRITE_D; с числом проходов .47.
movwf PCLATH ;
call WRITE_D ;
decfsz Temp,F ;
goto WR222 ;
;--------------------------------------------------------------------------------
; Запись 2-го сценария в 3-ю страницу 2-го кристалла
;--------------------------------------------------------------------------------
call STRANICA_3 ;
call STOLB_1 ;
movlw .31 ;
movwf Temp ;

WR232 movf Temp,W ;


sublw .31 ;
movwf Reg ; То же самое, только
call TEXT232 ; переход происходит
movwf PortC ; в ПП TEXT232,
movlw high WRITE_D; с числом проходов .31.
movwf PCLATH ;
call WRITE_D ;
decfsz Temp,F ;
goto WR232 ;
;------------------------------------
; Продолжение работы на 3-й странице.
;------------------------------------
movlw b'01111010' ; Выбор адреса 59-го столбца
; (инструкция "Set Address").
movwf PortC ; Вывод команды выбора адреса столбца
; на линии DB7...DB0.
call STROB ; Строб ("запуск в работу").
;---> Возврат по стеку из ПП STROB
movlw .6 ;
movwf Temp ;

WR232_1 movf Temp,W ;


sublw .6 ;
movwf Reg ; То же самое, только
call TEXT232_1 ; переход происходит
movwf PortC ; в ПП TEXT232_1,
movlw high WRITE_D; с числом проходов .6
movwf PCLATH ;
call WRITE_D ;
decfsz Temp,F ;
goto WR232_1 ;
;================================================================================
; Задержка, обеспечивающая комфортное, визуальное восприятие того,
; что выведено на индикацию.
16
;================================================================================
movlw high PAUSE ; "Плавающая" коррекция
movwf PCLATH ; содержимого PCH.

call PAUSE ; Задержка.


;---> Возврат по стеку из ПП PAUSE

;================================================================================
; Переход на начало нового цикла программы.
;================================================================================
movlw high DINAM ; "Плавающая" коррекция
movwf PCLATH ; содержимого PCH.

goto DINAM ; Переход на новый цикл программы


; (от 2-го "витка" и далее).
;********************************************************************************

;################################################################################
; Таблицы данных, предназначенных для записи.
;################################################################################
; Фиксированные элементы картинки (1-й "кадр").
;################################################################################
; Данные 1-й страницы 1-го кристалла
;;-------------------------------------------------------------------------------
TEXT_1 movlw high STR_1 ; Установка в PCH числового значения старшего
movwf PCLATH ; байта адреса (в PC) первой команды
; (retlw ...) табличного перехода
; (помечена меткой STR_1).
;--------------------------------------
; Анализ выхода или нет за пределы
; текущего блока памяти программ.
;--------------------------------------
movf Reg,W ; Номер сценария вычисляемого перехода --> W.
addlw low STR_1 ; Суммирование номера сценария и числового
; значения младшего байта адреса (в PC)
; ПП STR_1 (через W).
;---------------------------------------------
; Проверка на наличие или отсутствие переноса
; (PCH+1 или этого делать не нужно?).
;---------------------------------------------
btfsc Status,C ; Перенос был или нет?
incf PCLATH,F ; Если был, то PCLATH+1 (PCH+1=...).
movf Reg,W ; Если не был, то инкремента содержимого PCH
; не происходит и номер сценария вычисляемого
; перехода (в любом случае) копируется в W.
;--------------------------------------
; Табличный, вычисляемый переход.
;--------------------------------------
addwf PCL,F ; Приращение PCL на величину содержимого W.
STR_1 dt 0x00,0x00,0xFE,0x02,0x02,0xFE,0x00,0x00
dt 0x00,0x00,0xFC,0x24,0x24,0x18,0x00,0x00
dt 0x00,0x00,0x78,0x84,0x84,0x78,0x00,0x00
dt 0x00,0x00,0xFC,0x94,0x94,0x64,0x00,0x00
dt 0x00,0x00,0xF8,0x24,0x24,0xF8,0x00,0x00
dt 0x10,0x38,0x54,0x92,0x10,0x10,0x10,0x10
dt 0x81,0x42,0x24,0x18,0x18,0x24,0x42,0x81
dt 0x00,0x00,0x00,0x66,0x66,0x00,0x00,0x00
;--------------------------------------------------------------------------------
; Данные 2-й страницы 1-го кристалла
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; Данные 3-й страницы 1-го кристалла
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; Данные 4-й страницы 1-го кристалла
;--------------------------------------------------------------------------------
17
;--------------------------------------------------------------------------------
; Данные 5-й страницы 1-го кристалла
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; Данные 6-й страницы 1-го кристалла
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; Данные 7-й страницы 1-го кристалла
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; Данные 8-й страницы 1-го кристалла
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; Данные 1-й страницы 2-го кристалла
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; Данные 2-й страницы 2-го кристалла
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; Данные 3-й страницы 2-го кристалла
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; Данные 4-й страницы 2-го кристалла
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; Данные 5-й страницы 2-го кристалла
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; Данные 6-й страницы 2-го кристалла
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; Данные 7-й страницы 2-го кристалла
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; Данные 8-й страницы 2-го кристалла
;--------------------------------------------------------------------------------

;********************************************************************************
; Динамические элементы картинки.
;********************************************************************************
; Сценарий "УПАСТЬ..." (№1).
;================================================================================
; Данные 2-й страницы, 1-го кристалла.
;--------------------------------------------------------------------------------
TEXT121 movlw high STR121 ;
movwf PCLATH ;
movf Reg,W ;
addlw low STR121 ;
btfsc Status,C ;
incf PCLATH,F ;
movf Reg,W ;

addwf PCL,F ;
STR121 dt 0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00
dt 0x00,0xFE,0x00,0x00,0x00,0x00,0xFE,0x02
dt 0x02,0x02,0x02,0x02,0x02,0xFE,0x00,0x00
dt 0x00,0x00,0xE0,0x10,0x08,0x04,0x02,0x02
dt 0x02,0xFE,0x00,0x00,0x00,0x00,0xFC,0x02
dt 0x02,0x02,0x02,0x02,0x02,0x0C,0x00,0x00
dt 0x00,0x02,0x02,0x02,0x02,0xFE,0x02,0x02
dt 0x02,0x02,0x00,0x00,0x00,0x00,0xFE,0x40
;--------------------------------------------------------------------------------
; Данные 3-й страницы, 1-го кристалла.
;--------------------------------------------------------------------------------
TEXT131 movlw high STR131 ;
movwf PCLATH ;
18
movf Reg,W ;
addlw low STR131 ;
btfsc Status,C ;
incf PCLATH,F ;
movf Reg,W ;

addwf PCL,F ;
STR131 dt 0x00,0x00,0x21,0x42,0x42,0x42,0x42,0x42
dt 0x41,0x3F,0x00,0x00,0x00,0x00,0x7F,0x00
dt 0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00
dt 0x00,0x00,0x7F,0x02,0x02,0x02,0x02,0x02
dt 0x02,0x7F,0x00,0x00,0x00,0x00,0x3F,0x40
dt 0x40,0x40,0x40,0x40,0x40,0x30,0x00,0x00
dt 0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00
dt 0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x40
;--------------------------------------------------------------------------------
; Данные 2-й страницы 2-го кристалла.
;--------------------------------------------------------------------------------
TEXT122 movlw high STR122 ;
movwf PCLATH ;
movf Reg,W ;
addlw low STR122 ;
btfsc Status,C ;
incf PCLATH,F ;
movf Reg,W ;

addwf PCL,F ;
STR122 dt 0x40,0x40,0x40,0x40,0x80,0x00,0x00,0x00
dt 0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xF8
dt 0xF8,0xF8,0x00,0x00,0x00,0x00,0x00,0x00
dt 0x00,0x08,0x08,0x10,0x08,0x08,0x00,0x00
dt 0x04,0x04,0x08,0x10,0x08,0x04,0x04,0x00
dt 0x00,0x00,0x08,0x08,0x10,0x08,0x08
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;;; ,0x00
;;; dt 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; НЕ ВЫВОДИТСЯ.
;;; dt 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
;--------------------------------------------------------------------------------
; Данные 3-й страницы 2-го кристалла
;--------------------------------------------------------------------------------
TEXT132 movlw high STR132 ;
movwf PCLATH ;
movf Reg,W ;
addlw low STR132 ;
btfsc Status,C ;
incf PCLATH,F ;
movf Reg,W ;

addwf PCL,F ;
STR132 dt 0x40,0x40,0x40,0x40,0x3F,0x00,0x00,0x00
dt 0x00,0x00,0x04,0x0C,0x1C,0x3C,0x7F,0xFF
dt 0xFF,0x7F,0x3C,0x1C,0x0C,0x04,0x00,0x00
dt 0x01,0x01,0x02,0x04,0x02,0x01,0x01
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;;; ,0x00
;;; dt 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
;;; dt 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; НЕ ВЫВОДИТСЯ.
;;; dt 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
;;; dt 0x00,
;---------------------------------------------------
; Продолжение (формирование самой правой "птички").
;---------------------------------------------------
TEXT132_1 movlw high STR132_1;
movwf PCLATH ;
movf Reg,W ;
addlw low STR132_1;
19
btfsc Status,C ;
incf PCLATH,F ;
movf Reg,W ;

addwf PCL,F ;
STR132_1 dt 0x00,0x04,0x04,0x08,0x04,0x04
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;;; ,0x00 ; НЕ ВЫВОДИТСЯ.
;================================================================================
; Сценарий "ОТЖАТЬСЯ..." (№2).
;================================================================================
; Данные 2-й страницы, 2-го кристалла
;--------------------------------------------------------------------------------
TEXT222 movlw high STR222 ;
movwf PCLATH ;
movf Reg,W ;
addlw low STR222 ;
btfsc Status,C ;
incf PCLATH,F ;
movf Reg,W ;

addwf PCL,F ;
STR222 dt 0x04,0xFC,0x00,0x00,0x00,0x00,0x00,0x00
dt 0x00,0x00,0x20,0x30,0x38,0x3C,0xFE,0xFF
dt 0xFF,0xFE,0x3C,0x38,0x30,0x20,0x00,0x00
dt 0x00,0x20,0x20,0x10,0x20,0x20,0x00,0x00
dt 0x40,0x40,0x20,0x10,0x20,0x40,0x40,0x00
dt 0x00,0x00,0x20,0x20,0x10,0x20,0x20
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;;; ,0x00
;;; dt 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; НЕ ВЫВОДИТСЯ.
;;; dt 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
;--------------------------------------------------------------------------------
; Данные 3-й страницы, 2-го кристалла
;--------------------------------------------------------------------------------
TEXT232 movlw high STR232 ;
movwf PCLATH ;
movf Reg,W ;
addlw low STR232 ;
btfsc Status,C ;
incf PCLATH,F ;
movf Reg,W ;

addwf PCL,F ;
STR232 dt 0x02,0x3F,0x00,0x00,0x00,0x00,0x00,0x00
dt 0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F
dt 0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00
dt 0x10,0x10,0x08,0x04,0x08,0x10,0x10
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;;; ,0x00
;;; dt 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
;;; dt 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; НЕ ВЫВОДИТСЯ.
;;; dt 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
;;; dt 0x00,
;---------------------------------------------------
; Продолжение (формирование самой правой "птички").
;---------------------------------------------------
TEXT232_1 movlw high STR232_1;
movwf PCLATH ;
movf Reg,W ;
addlw low STR232_1;
btfsc Status,C ;
incf PCLATH,F ;
movf Reg,W ;

addwf PCL,F ;
20
STR232_1 dt 0x00,0x10,0x10,0x08,0x10,0x10
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;;; ,0x00 ; НЕ ВЫВОДИТСЯ.
;--------------------------------------------------------------------------------
; Данные 2-й страницы, 1-го кристалла.
;--------------------------------------------------------------------------------
TEXT221 movlw high STR221 ;
movwf PCLATH ;
movf Reg,W ;
addlw low STR221 ;
btfsc Status,C ;
incf PCLATH,F ;
movf Reg,W ;

addwf PCL,F ;
STR221 dt 0x00,0xF8,0x04,0x04,0x04,0x04,0xF8,0x00
dt 0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0x00
dt 0x0C,0x10,0x20,0x40,0x80,0xFC,0x80,0x40
dt 0x20,0x10,0x0C,0x00,0x00,0xE0,0x10,0x08
dt 0x04,0x04,0xFC,0x00,0x04,0x04,0x04,0xFC
dt 0x04,0x04,0x04,0x00,0xFC,0x40,0x40,0x40
dt 0x40,0x80,0x00,0x00,0xF8,0x04,0x04,0x04
dt 0x04,0x08,0x00,0x00,0xF8,0x04,0x04,0x04
;--------------------------------------------------------------------------------
; Данные 3-й страницы, 1-го кристалла.
;--------------------------------------------------------------------------------
TEXT231 movlw high STR231 ;
movwf PCLATH ;
movf Reg,W ;
addlw low STR231 ;
btfsc Status,C ;
incf PCLATH,F ;
movf Reg,W ;

addwf PCL,F ;
STR231 dt 0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00
dt 0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00
dt 0x30,0x08,0x04,0x02,0x01,0x3F,0x01,0x02
dt 0x04,0x08,0x30,0x00,0x00,0x3F,0x01,0x01
dt 0x01,0x01,0x3F,0x00,0x00,0x00,0x00,0x3F
dt 0x00,0x00,0x00,0x00,0x3F,0x20,0x20,0x20
dt 0x20,0x1F,0x00,0x00,0x1F,0x20,0x20,0x20
dt 0x20,0x10,0x00,0x00,0x21,0x12,0x0A,0x06
;********************************************************************************
end ; Конец программы.

Темно – синим цветом выделено то, о чем было рассказано ранее (вывод на
индикацию фиксированных элементов картинки).
Темно – красным цветом выделены "нововведения" (вывод на индикацию динамических
элементов картинки).
Серым цветом выделены части кодов, вывод на индикацию которых игнорируется.
Темно – зеленым цветом выделено то, что относится к задержкам, определяющим
интервалы времени смены сценариев.
Красным цветом выделен переход на новый цикл программы.
Черным цветом выделена "обслуга", обеспечивающая "жизнедеятельность"
графического модуля во всех его мыслимых и немыслимых режимах работы.
Цветом хаки выделены комментарии.

Вместо "мертвяка" (goto $-1), "врезана" достаточно "массивная" группа команд работы с
1-м и 2-м сценариями.
Все это "великолепие" заканчивается переходом на начало исполнения все той же
группы команд.

21
Это означает то, что фиксированные элементы картинки выводятся на индикацию
только на первом "витке" полного цикла программы, а далее, начиная от 2-го "витка"
полного цикла программы, происходит банальная, последовательная смена сценариев.
Сначала исполняется сценарий типа "Упасть…" (№1), а затем - "Отжаться…" (№2),
что глубинно отражает воспитательный аспект военной службы.
Кстати, этот "аспект" совсем не идиотский, так как, в процессе упомянутых действий, в
рекордно короткие сроки, очень эффективно понимается то, чего понимать не
хочется/лень/хлопотно/мамка не велит (и т.д.).
Это очень напоминает "борьбу со строптивым, вычисляемым переходом", которая была
начата ранее, и "кульминацию" которой Вы сейчас наблюдаете.
Кто после этого скажет, что наука типа "упасть/отжаться" есть однозначный "негатив"?
Итоги классификации "негатив/позитив" сильно зависят от справедливости
предъявляемых требований.
"Механизм" реализации сценариев №1 и №2, по своей сути, ничем не отличается от
рассмотренного ранее, вывода на индикацию фиксированных элементов картинки.
Разница только в тактике.
Во-первых, на индикацию выводится не весь массив байтов (1024 штуки), а только та
их часть, которая "дислоцируется" во 2-й и 3-й страницах обеих кристаллов.
Во-вторых, массивы байтов, которые выводятся на индикацию во 2-ю и 3-ю страницу
2-го кристалла, выводятся на индикацию не в полном объеме (не 64 байта, а
меньше).
А при работе с 3-й страницей 2-го кристалла, вдобавок к этому, массив байтов
выводится на индикацию не за один прием, а за два приема (дробится на две части).
Вывод байтов на индикацию не в полном объеме есть не что иное, как обход, ранее
выведенных на индикацию, фиксированных элементов картинки (с целью их
сохранения).
Вывод байтов на индикацию в 2 приема есть и обход, ранее выведенных на
индикацию, фиксированных элементов картинки, и обеспечение, после этого,
формирования оставшегося, динамического элемента картинки (самой правой "птички").
"Технология" обхода достаточно проста:
1. При работе во 2-й странице 2-го кристалла, сразу же после формирования самой
правой "птички", нужно закончить цикл вывода байтов данных во 2-ю страницу.
2. При работе в 3-й странице 2-го кристалла, после вывода на индикацию заданного
количества байтов данных (после окончания формирования левой "птички"), нужно
"перепрыгнуть", через "мертвую зону" (в ней - боеголовка. "Убивать" ее нельзя) в
другой столбец, после чего продолжить формирование картинки самой правой
"птички".
Это делается с помощью инструкции "Set Address" (выбор адреса столбца).
Ничего мудреного в ней нет (см. подраздел 1/1).
На "стыках" сценариев, отрабатываются фиксированные задержки, которые задают
скорость их смены.
Обращаю Ваше внимание на то, что объем программы "зашкаливает" за цифру 2048
(2121 слово в памяти программ).
То есть, нижняя часть программы "лежит" на 2-й странице памяти программ.
Значит, перед переходом в ПП TEXT231, которая "дислоцируется" на второй странице
памяти программ ПИКа, нужно применить ту "волшебную" комбинацию команд, которая
была упомянута выше.
Это и имеет место быть.
В противном случае à "Гитлер капут".
"Полноценная" программа под все это "безобразие" называется 12864_2.asm.
Она прилагается.
Принципиальная схема устройства - см. рис. 1 подраздела 1/4.
Нужно отметить то, что в динамике, результат работы смотрится достаточно забавно.
На первый взгляд, практического смысла в такой "забаве" маловато.
А если вместо птичек вывести на индикацию, например, цифирки или эпюру (или все
вместе) и "заложить" в них этот самый "практический смысл"?
То-то и оно …
Но следует отдавать себе отчет в том, что найти практический смысл гораздо проще,
чем его реализовать.
22
На мой взгляд, любой уважающий себя КОНСТРУКТОР должен классно уметь делать и
то, и другое.
А это предполагает весьма не слабую учебу, причем, учебу в ее "глубинном", и если
хотите, в ее душевном понимании (не ради "корочки" и прочих фетишей).
У кого такое понимание есть, тот и будет КОНСТРУКТОРОМ не по должности, а по
призванию.
И это, при любом "раскладе", очень дорогого стоит.
Вернусь к своим "птичкам".
Медленно, но верно, выясняются основные приемы практической работы с
графическими модулями.
Предполагаю, что их детали знают совсем не многие.
Но со временем, мы будем об этом знать больше остальных.
На данный момент, сделано совсем не мало.
На индикацию выведены фиксированные элементы
картинки.
По факту, в части касающейся 2-й и 3-й страниц
обеих кристаллов, организована трехсценарная
работа.
Фото всех трех сценариев Вы видите (извините за
качество. Фотограф из меня плохой).
Продолжение следует.

"Практикум по конструированию устройств на PIC контроллерах"      http://ikarab.narod.ru       E-mail: karabea@lipetsk.ru

23