Лирическое отступление
Мой знакомый, увидев старую добрую игру «Ну, погоди!» (электроника им-02) в интернете начал ностальгировать по тем временам и решил ее купить. Но шло время, а маленькая мечта оставалась мечтой...
Тут мне в руки попал «наглухо» умерший телефон Samsung GT-S5230. Данный телефон имеет TFT дисплей 3.0' размером 400х240 пикселей, 8-ми битной шиной и шлейфом “шириной” 31 пин.
Дисплей оказался жив и мне пришла идея накидать программку для микроконтроллера (далее МК) а-ля «эхо 80-х – волк ловит яйца».
Как вы уже догадались речь пойдет о разработке собрата игры «Ну, погоди!» и никакой пользы человечеству не несет кроме «фо фан».
Об оригинале ...
Электроника им-02 «Ну, погоди!» начала выпускаться в 1984 г. (по началу не имела порядкового номера 02) и являлась точной копией Nintendo “ Game&watch EG-26 EGG” 1981 года (Только там волк со шляпой). «Начинкой» игры являлись: пьезокерамический звонок ЗП, часовой кварц, однокристальная 4-х разрядная ЭВМ КБ1013ВК1-2, дисплей ИЖМ2-71 и немного «рассыпухи». Однокристальная ЭВМ КБ1013ВК1-2 представляет собой законченное устройство с контроллером жидкокристаллических дисплеев, центральным процессором и т.д.. Программа для него была написана на ассемблере длинной около 2000 строк. Контроллер не особо был трудягой, т к дисплей ИЖМ2-71 представлял из себя жидкокристаллический мнемонический индикатор (с уже нанесенным рисунком) работающим при освещении. Т. е. прорисовки каждого пикселя от него не требовалось. Да и частота в 32кГц не способствовала этому (часы важнее:)).
Поехали...
В нашей схеме используется PIC18F2455 производительностью 12 MIPS.
Чтобы «прорисовать» картинку 400х240 пикселей с глубиной цвета 16 бит (к слову сказать дисплей от S5230 на пару сантиметров по более дисплея ИЖМ2-71), требуется объем памяти 192000 байт, что для нашего МК непозволительная роскошь, а усложнять устройство добавлением внешней памяти нам не нужно. PIC18F2455 имеет 24 кБ памяти программ и 2 кБ данных. Для того, чтоб вся картинка поместилась в память МК – она была разбита на блоки. Блок представляет собой массив, где каждый пиксель описан не двумя байтами цвета, а одним битом. Массив ссылается на свою палитру цветности (2 цвета.) Чтоб прорисовка динамических объектов была менее заметна глазу, в особенности больших объектов типа волка, создана функция вывода с «зацикливанием» байта (не бита).
void Draw_highS(unsigned char Bt) { RS = 1; // data masw=0x80; // mask if (Bt&masw) { PORTB = Font_RG; WR = 0; //clock WR = 1; PORTB = Font_GB; WR = 0; //clock WR = 1; } else { ....... else { PORTB = Color_rg; WR = 0; //clock WR = 1; PORTB = Color_gb; WR = 0; //clock WR = 1; } }
Код этой части программы получился более объемный, чем с побитным «зацикливанием», но и «выигрыш» в скорости прорисовки получается около десяток тактов МК на каждый цикл, коих несколько тысяч. Данный код можно было организовать ассемблерной вставкой, но дизасм показывает нам четкое выполнение команд без лишней шелухи за исключением NOP:
MOVFF Font_RG, PORTB NOP BCF LATA, 1, ACCESS BSF LATA, 1, ACCESS
Как отмечалось ранее – картинка разбита на блоки, в том числе и динамические объекты на ней. Так волк, оставаясь на месте, меняя только положение корзины, прорисовывается только частично. Так же из-за специфики алгоритма корзина тоже разделена на части.
Так же для вывода изображения используются функции:
LCD_Draw_Line()
для рисования линий, основанной на алгоритме Брезенхема и:
Draw_16b()
для вывода массивов с двухбайтными значениями.
Общий алгоритм игры «завязан» на прерывании от таймера. Максимальное время между двумя ближайшими событиями на экране (движением яиц) около 0,7 сек. В нашем МК данную длительность обеспечивает 16-ти битный таймер TMR0 с делителем 128. Дальнейшее снижение тайминга (увеличение скорости движения яиц) достигается предварительной записью в старший TMR0H и младший TMR0L байты таймера определенных констант. Время присутствия/отсутствия зайца на экране (порядка 5 с.) тоже складывается из суммы временных отрезков TMR0. Константы привязаны к общеизвестным контрольным точкам - набранным очкам (5..100…200…500…999 и тд.), при достижении которых происходит смена скорости/сброс разбитых яиц/увеличение кол-ва катящихся яиц и т.д.. Вообще все временные и очковые значения по возможности, приближенные к оригиналу.
Выбор лотка, на котором появится очередное яйцо осуществляется генератором псевдослучайных чисел:
rand()%3;
запись «%3» ограничивает случайное число максимальным значением 2. Т. е. результат операции – это остаток от деления на 3, а как известно из математики остаток не может быть больше делителя или равен ему. Таким образом, можно получить значения 0,1,2, что соответствует порядковому номеру лотка. Если лоток №0 (левый нижний, далее по «часовой стрелке») в данный момент не может быть задействован (что видно при старте оригинальной игры), то он автоматически заменяется на лоток №3 (правый нижний).
В оригинальной игре кол-во яиц одновременно находящихся на экране не превышает 5 шт. Для хранения информации о яйцах на экране создан массив размером 5х2. (Data_b[5][2]). Каждая строчка массива содержит номер лотка (0,1,2 или 3), по которому катится яйцо и позиция самого яйца до попадания в корзину (от курицы до корзины 5 позиций). Каждое вновь появившееся яйцо записывается в предыдущую свободную ячейку массива (т. к. в очереди оно будет последним). Указатель на массив позволяет отслеживать очередность движения каждого яйца. Исключение составляет случай, когда на одном лотке несколько яиц: они, если обратить внимание на оригинал игры, двигаются синхронно.
В итоге весь код занял практически всю память программ, хотя при желании можно еще «ужать»
Биты конфигурации МК так же прописаны программно.
Звук с RC2/CCP1 выводится на старый добрый звонок пьезокерамический (ЗП-3) примененный все в той же серии игр «электроника». ШИМ – режим формирования звука позволяет освободить дополнительное время МК для выполнения других задач, но не так гибок в подборе «звукового оформления».
Информация на дисплей, как уже отмечалось, выводится по 8-ми битной шине. При инициализации применен альбомный режим.
Ниже приведена электрическая схема девайса:
Даташит на PIC18F2455 говорит нам, что «…Standard devices with Enhanced Flash memory, designated with an “F” in the part number (such as PIC18F2550), accommodate an operating VDD range of 4.2V to 5.5V. Low-voltage parts, designated by “LF” (such as PIC18LF2550), function over an extended VDD range of 2.0V to 5.5V.», а вот питание дисплея S5230 2.8 - 3.3В. Но практика показывает что F-ки и при снижении питания до 3В отлично «трудятся» даже в режиме PLL. Устройство тестировалось на батарейках и аккумуляторах (в том числе от мобил) в диапазоне 2.9-3.8В. Проблем не возникло (разве что яркость экрана чуть меняется).
При 3В устройство потребляет около 70мА. Львиную долю конечно «съедает» дисплей, т. к. дисплеи от сотовых очень прожорливы.
Список радиоэлементов
Обозначение | Тип | Номинал | Количество | Примечание | Магазин | Мой блокнот |
---|---|---|---|---|---|---|
DD1 | МК PIC 8-бит | PIC18F2455 | 1 | Поиск в магазине Отрон | ||
С1, С2 | Конденсатор | 1206-15пФ±5% | 2 | Поиск в магазине Отрон | ||
С3 | Конденсатор | 1206-2.2 мкФ ±10% | 1 | Поиск в магазине Отрон | ||
С4 | Конденсатор | 1206-0.1 мкФ ±20% | 1 | Поиск в магазине Отрон | ||
R1-R5 | Резистор | 1206-5.1 кОм±5% | 5 | Поиск в магазине Отрон | ||
R6 | Резистор | 1206-5.1 Ом±5% | 1 | Поиск в магазине Отрон | ||
R7 | Резистор | 0805-1 кОм±10% | 1 | Поиск в магазине Отрон | ||
HG1 | LCD-дисплей | Дисплей жидкокристаллический S5230 | 1 | Поиск в магазине Отрон | ||
SB1-SB4 | Кнопка | ПКн150-1 | 4 | Поиск в магазине Отрон | ||
BQ1 | Динамик | Пьезоизлучатель ЗП-3 | 1 | Поиск в магазине Отрон | ||
ZQ1 | Кварцевый резонатор | 8.0000 MHz - HC49/U | 1 | Поиск в магазине Отрон | ||
Скачать список элементов (PDF)
Прикрепленные файлы:
- Wo.rar (134 Кб)
Комментарии (52)
|
Я собрал (0) |
Подписаться
Для добавления Вашей сборки необходима регистрация
[Автор]
В перечне элементов опечатка, исправлю. Спасибо.
[Автор]
В полной версии, что дарил другу: небольшой комикс написал, чтоб память забить до конца.
[Автор]
Скачал - открывается без проблем
Прошивку прикрепил.
Может пробуйте делать и другие прошивки с играми, если умеете.
[Автор]
[Автор]
Максимальное количество одновременно 5 яиц на экране не совсем правда. Взгляните на это видео:
https://www.youtube.com/watch?v=0uzfr0nisQs
Особенно около отметки 1000 пунктов одновременно присутствует 6 и даже 7 яиц.
[Автор]
Ваше же видео демонстрирует режим Игра Б - здесь не спорю.
[Автор]
[Автор]