Входы
|
Назначение
|
Разрядность
|
Сигналы
маши по изменению координат
|
Управление
одной из ракеток на дисплее
|
5..8 бит
|
Принимаемые
данные с порта
|
Получение
координат положения ракетки
|
5..8
бит
|
Посылка
информации на порт
|
Передача
координат положения ракетки
|
5..8
бит
|
Основные требования к проектированию: описание
моделей с помощью языков программирования типа С или ассемблер. Способ
проверки: пошаговое тестирование основных этапов программы вплоть до физической
реализации.
2.
ТЕХНИЧЕСКОЕ ПРЕДЛОЖЕНИЕ
.1 Описание алгоритма
Алгоритм общего взаимодействия блоков проекта
(см. рисунок 2.1) основан на последовательной передаче управления каждому
блоку. Блок "установки сетевого соединения" отвечает за
автоматическую синхронизацию передачи данных. Блок проверки соединения
проверяет корректность синхронизации. Блок "игра" отвечает за
проведение игрового процесса. Алгоритм игры приведен на рисунке 2.3.
Определение победителя осуществляется путём сравнения количества промахов
каждого игрока. В конце осуществляется проверка победителя, вывод сообщения о
победителе и запускается счетчик перезапуска игры.
Блок
установки соединения содержит в себе два алгоритма: алгоритм сервера и алгоритм
клиента.
Рисунок 2.1 - Алгоритм общего взаимодействия
всех блоков проекта
Рисунок 2.2 - Алгоритм игры
2.2 Выбор элементной базы
Макет представляет собой универсальное
устройство на базе микроконтроллера AVR ATmega
128 (fт=11,059200 МГц), в состав которого входят: микроконтроллер
AVR ATmega 128,
графический ЖК-дисплей Toshiba T6963C, блок светодиодов, клавиатуры: 3´4
и 3´1
(количество столбцов ´ количество строк), АЦП,
последовательный интерфейс RS-232C. Сопряжение лабораторного макета и
программатора (ПЭВМ) обеспечивается с помощью последовательного интерфейса SPI,
конструктивно использующего стандартный разъем Centronics DB-25. Блок из восьми
светодиодов подключен к микроконтроллеру через порт D. Сопряжение клавиатуры 3´4
осуществляется с помощью порта Е. Через порт F, линии которого являются входами
АЦП. На рис. 2.4 показана структурная схема лабораторного макета на базе
микроконтроллера AVR ATmega
128.
Интерфейс порта В конструктивно выполнен в виде
унифицированного разъема DB-25, Для линий двух встроенных в микроконтроллер
последовательных интерфейсов RS-232C (USART0, USART1) [4] предназначены разъемы
DB-9, расположенные на задней панели макета. На задней панели находится также
разъем для подключения внешнего источника питания (12 В) и выключатель
электропитания.
Рисунок 2.3 - Структурная схема лабораторного
макета на базе микроконтроллера
AVR ATmega 128
Технические характеристики:
1. Высокопроизводительный, маломощный
8-разрядный AVR-микроконтроллер.
. Развитая RISC-архитектура.
. 133 мощных инструкций, большинство из которых
выполняются за один машинный цикл.
. 32 8-разрядных регистров общего назначения +
регистры управления встроенной периферией.
. Полностью статическая работа.
. Производительность до 16 млн. операций в
секунду при тактовой частоте 16 МГц.
. Встроенное умножающее устройство выполняет
умножение за 2 машинных цикла.
. Энергонезависимая память программ и данных.
. Износостойкость 128-ми кбайт внутрисистемно
перепрограммируемой флэш-памяти: 1000 циклов запись/стирание.
. Опциональный загрузочный сектор с отдельной
программируемой защитой.
. Внутрисистемное программирование встроенной
загрузочной программой.
. Гарантированная двухоперационность:
возможность чтения во время записи.
. Износостойкость 4 кбайт ЭСППЗУ: 100000 циклов
запись/стирание.
. Встроенное статическое ОЗУ емкостью 4 кбайт.
15. Опциональная возможность адресации внешней
памяти размером до 64 кбайт.
Рисунок 2.4
-
Функциональная
схема
Ядро AVR сочетает богатый набор инструкций с 32
универсальными рабочими регистрами. Все 32 регистра непосредственно подключены
к арифметико-логическому устройству (АЛУ), который позволяет указать два
различных регистра в одной инструкции и выполнить ее за один цикл. Данная
архитектура обладает большей эффективностью кода за счет достижения
производительности в 10 раз выше по сравнению с обычными
CISC-микроконтроллерами (рис 2.5).поддерживается полным набором программных и
аппаратных средств для проектирования, в т.ч.: С-компиляторы, макроассемблеры,
программные отладчики/симуляторы, внутрисистемные эмуляторы и оценочные наборы.
В целях достижения максимальной
производительности и параллелелизма у AVR-микроконтроллеров используется
Гарвардская архитектура с раздельными памятью и шинами программ и данных.
Команды в памяти программ выполняются с одноуровневой конвейеризацией. В
процессе выполнения одной инструкции следующая предварительно считывается из
памяти программ. Данная концепция позволяет выполнять одну инструкцию за один
машинный цикл. Память программ представляет собой внутрисистемно
программируемую флэш-память.
Регистровый файл с быстрым доступом содержит 32
x 8-разр. рабочих регистров общего назначения с однотактовым циклом доступа.
Благодаря этому достигнута однотактность работы арифметико-логического
устройства (АЛУ). При обычной работе АЛУ сначала из регистрового файла
загружается два операнда, затем выполняется операция, а после результат
отправляется обратно в регистровый файл и все это происходит за один машинный
цикл.
Шесть регистров из 32 могут использоваться как
три 16-разр. регистра косвенного адреса для эффективной адресации в пределах
памяти данных. Один из этих указателей адреса может также использоваться как
указатель адреса для доступа к таблице преобразования во флэш-памяти программ.
Данные 16-разр. регистры называются X-регистр, Y-регистр и Z-регистр и
описываются далее в этом разделе.
АЛУ поддерживает арифметические и логические
операции между регистрами, а также между константой и регистром. Кроме того,
АЛУ поддерживает действия с одним регистром. После выполнения арифметической
операции регистр статуса обновляется для отображения результата выполнения
операции.
Для ветвления программы поддерживаются
инструкции условных и безусловных переходов и вызовов процедур, позволяющих
непосредственно адресоваться в пределах адресного пространства. Большинство
инструкций представляют собой одно 16-разр. слово. Каждый адрес памяти программ
содержит 16- или 32-разр. инструкцию. Флэш-память программ разделена на две
секции: секция программы начальной загрузки и секция прикладной программы. Обе
секции имеют раздельные биты защиты от записи и чтения/записи. Инструкция SPM
(запись в секцию прикладной программы) должна использоваться только внутри
секции программы начальной загрузки.
Высокопроизводительное АЛУ AVR-микроконтроллеров
работает в непосредственной связи со всеми 32 универсальными рабочими
регистрами. АЛУ позволяет выполнить за один машинный цикл операцию между двумя
регистрами или между регистром и константой. Операции АЛУ могут быть
классифицированы на три группы: арифметические, логические и битовые. Кроме
того, архитектурой ATmega128 поддерживаются операции умножения со знаком и без
знака и дробным форматом.
Внутрисистемно программируемая флэш-память
программ ATmega128 содержит 128 кбайт внутренней внутрисистемно
перепрограммируемой флэш-памяти для хранения программы. Поскольку все
AVR-инструкции являются 16 или 32-разр., то флэш-память организована как 64
кбайт´16.
Для программной защиты флэш-память программ разделена на два сектора: сектор
программы начальной загрузки и сектор прикладной программы.
Рисунок 2.5
- Карта памяти программ
3.
ЭСКИЗНЫЙ ПРОЕКТ
Эскизный проект - этап составления спецификаций
отдельных блоков, разработка подробной структурно-блочной схемы устройства. На
рисунке 3.1 изображена функциональная модель.
Рисунок 3.1 - Функциональная модель
Блок обмена информации - в данном блоке
производится обмен информации через Com-port.
Работа этого блока осуществляется в полудуплексном режиме - поочередна
передавая данные о положении управляемой ракетки. Также этот блок отвечает за
установление и проверку сетевого соединения. Проверка проводится по схеме
"Рукопожатие" при этом один контроллер посылает запросный маркер
"123", второй, в свою очередь, получив данный маркер, отсылает
ответный "321" если маркер не получен или искажен, то на дисплее
выдастся ошибка. Первый контроллер, получив маркер "321" ,отправляет
сигнал на начало игры, если же ответный маркер не пришел или искажен на экране
также выведется сообщение об ошибке.
Блок перемещения ракеток отвечает за перемещение
ракеток по игровому полю начиная с начальных координат. Передвижение происходит
по координате у.
Блок перемещения шарика отвечает за перемещение
шарика по игровому полю начиная с начальных координат. Обеспечивает непрерывное
передвижение шарика по двум осям х и у.
Блок сравнения координат отвечает за сравнение
координат с константами которые определяют: края поля, рамки ракетки и ее
местоположения, местоположения шарика относительно ракеток, относительно краёв
игрового поля. В том случае если шарик пересёк координаты ракетки и не был
отбит, управление передается блоку определения результата, в противном случае
мы продолжаем работу в блоке сравнения координат.
Блок определения результата считает количество
промахов для каждого игрока.
Блок подсветки диодов выполняет индикацию диодов
в соответствии с общим количеством пропущенных очков.
Блок индикации победителя сообщает о победителе
и подаёт сигнал на блок задержки.
Блок задержки выполняет задержку на 10 секунд и
этим определяет завершение игры. После чего передаёт управление блоку движения
шарика и блоку перемещения ракеток, начиная тем самым новую игру.
4.
ТЕХНИЧЕСКИЙ ПРОЕКТ
На данном этапе происходит описание и
моделирование функций языка программирования, выбор организации проекта и
принципов построения моделей и т.д.
Основными моментами данного этапа являются:
- составление и описание блоков на языке
программирования;
определяются межблоковые связи;
описание констант и переменных;
отладка проекта (пошаговое тестирование основных
блоков программы в процессе написания и исправление некорректной работы).
.1 Разработка проекта
При описании моделей на языках программирования
большое внимание следует уделять конструкциям языка. Так нужно использовать
конструкции, которые воспринимаются программой программирования
микроконтроллера, а также оптимизировать конструкции для достижения наименьших
аппаратных затрат.
Рисунок 4.1 - Связи файлов
4.2 Описание интерфейса
Принципы построения модели включает методологию
написания языкового кода. Спецификация составляется на всю программу, состоящую
из основных блоков в соответствие со следующими этапами.
Необходимо выполнить анализ требуемых входных
параметров и констант, а также определить их тип и начальные значения.
Начальные значения выбираются в соответствие с
описанием устройства. Тип параметров - int
целочисленный тип. При этом по умолчанию используется модификатор типа
unsigned, который указывает, что переменная принимает неотрицательные значения.
При этом самый левый бит области памяти, выделяемой для хранения значения,
используется так же, как и все остальные биты области памяти - для
представления значения.
Таблица 4.1 - Описание интерфейса всей программы
Входы
|
Тип
|
Начальные
значения
|
Описание
|
х
|
int
|
65
|
Начальная
координата шарика по оси х
|
у
|
int
|
63
|
Начальная
координата шарика по оси у
|
f
|
int
|
0
|
Флаг
определяющий отражение шарика
|
d
|
int
|
0
|
Общие
очки игроков
|
g2
|
int
|
0
|
Очки
игрока 1
|
g1
|
int
|
0
|
Очки
игрока 2
|
lx1
|
int
|
239
|
Начальные
координаты ракетки игрока 2 по оси х
|
ly1
|
int
|
53
|
Начальные
координаты ракетки игрока 2 по оси у
|
lx2
|
int
|
5
|
ly2
|
int
|
53
|
Начальные
координаты ракетки игрока 1 по оси у
|
r
|
int
|
5
|
Размер
шарика
|
t
|
int
|
3
|
Размер
ракеток игроков
|
4.3 Основные конструкции и процедуры,
используемые для написания программы
При разработке проекта необходимо подключить
заголовочные файлы:
. #include "mega128.h"
- для регистрации вводов-выводов для ATMEGA128;
. #include
"delay.h"
- для использования задержек;
. #include "graphics.h"
- для вызова функций используемых в главном файле source.c.
Сами функции описаны в файле "graphics.c".
Ниже приведены примеры наиболее значащих для
проекта функций:
Листинг 4.1 - Функция определяющая порты
init_cpu(void)
{
DDRB = 0xff;//
Регистр направления данных порта B
PORTB = 0xff;//
Регистр данных порта В
DDRD = 0xff;//
Регистр направления данных порта D
PORTD =0xff;//
Регистр данных порта D= 0x00;// Регистр направления данных порта F= 0x00;//
Регистр данных порта F= 0xf0;// Регистр направления данных порта E
MCUCR = 0x8a;//
Регистр управления микроконтроллером
XMCRA = 0xff;//
Регистр А управления внешней памятью= 0x10;// Регистр специальных функций
ввода-вывода
}
Листинг 4.2 - Функция отображения
void
init_display(void);
{
write_command(0xB2);//
Автоматический перезапуск
set_graphic_window(GRAPHICS_HOME0);_data(GRAPHICS_WIDTH);//
Младший
бит_data(0x00);//
Старший бит
write_command(0x43);//
Установка длинны графической линии
set_text_window(TEXT_HOME0);_data(TEXT_WIDTH);//
Младший
бит_data(0x00);//
Старший
бит_command(0x41);//
Длинна
линии
текста_command(0b10000000);//
Способ
набора_command(0b10011100);//
Способ
показа_command(0xA3);//
Выбор
образца
курсора_command(0x01);_command(0x00);_command(0x21);//
Установка позиции курсора;
}
Листинг 4.3 - Функция перерисовки текста
clear_text(void)
{
unsigned
int i=0;//
Положительное целое число
set_address(TEXT_HOME0);
// Установить адресс(i;i<TEXT_WIDTH*TEXT_LINES;i++)//
Определить
ширину
и
длину
{_data(0);// Запись
данных_command(0xC0);//
Вывод
данных
};
}
При написании программы использовался оператор
условия if/else, который позволяет выполнять одно из двух действий в
зависимости от условия.
Листинг 4.4 - Использование оператора if/else
if (g2>g1)//
если пропущенных очков у игрока 2 больше чем //у игрока 1
{sprintf(string,"WINNER: Player
1");// то игрок
1 победил_string(10,
7, string);_ms(10000);}
С помощью этого оператора были описаны условия
отражения шарика от границ экрана и от ракеток игроков.
Для рисования шарика и ракеток использовался
оператор цикла с параметром for, когда заранее известно количество итераций
цикла, что позволяло задать размер и заливку шарика, а также ширину ракеток.
Листинг 4.5 - Использование цикла for для
отрисовки ракеток
for (t=0;t<3;t++)
{
Line(lx2-t,ly2,lx2-t,ly2+20,1);
// ракетка игрока 1
Line(lx1-t,ly1,lx1-t,ly1+20,1);
// ракетка игрока 2
}
В программе используется флаг необходимый для
определения начальных координат и направления движения шарика и для
предотвращения одновременного выполнения более чем одного условия изменения
направления движения по координатам х и у одновременно.
Листинг4.6 - Задание начальных координат и
движения
if(x<=0
&& y>=63)
{f=0;}(f==0)
{
x=x+4;
y=y+4;
…
}
Проект содержит файл source.map, который
генерируется компилятором и находится в одном каталоге с исходным модулем программы.
В нём указывается размещение переменных (в регистрах процессора или памяти
данных) поскольку часто в ассемблерных подпрограммах возникает необходимость
получить доступ к значениям переменных, объявленных в С-программе.
5.
РАБОЧИЙ ПРОЕКТ
.1 Компиляция
Данный проект реализован с помощью программы
CodeVisionAVR.
Интегрированная среда CodeVisionAVR представляет
собой кросс-компилятор языка С ориентированный на семейство микроконтроллеров
AVR и содержит: графическую оболочку для управления ресурсами проекта;
текстовый редактор исходного модуля программы; кросс-компилятор; отладчик,
программатор; автоматический генератор программного кода; терминал для работы с
последовательным интерфейсом RS232C (USART). Полученный в результате компиляции
исходного кода программы на языке С исполняемый модуль (файл прошивки) может
быть непосредственно записан в память программ микроконтроллера.
Рисунок 5.1 - Окно студии CodeVisionAVR
5.2 Прошивка
микроконтроллер прошивка интерфейс
программирование
Прошивка микроконтроллера реализуется с помощью
пользовательского интерфейса среды программирования CodeVisionAVR.
Далее необходимо выполнить компиляцию проекта -
создать исполняемый программный модуль, пригодный для исполнения
микроконтроллером. Для этого необходимо нажать клавишу Shift+F9. При
завершении этапа компиляции активизируется окно Information, содержащее информацию
о скомпилированном проекте. Если компиляция прошла успешно, то для записи
программы в память микроконтроллера необходимо нажать кнопку Program,
расположенную в нижней части окна Information. Выявленные
в результате компиляции сообщения об ошибках отображаются в левой части
главного рабочего окна, где располагаются данные о ресурсах проекта. При
активизации сообщения об ошибке компилятор выводит подробные сведения о
локализации и возможных причинах ошибки.
Рисунок 5.2 - Окно отображения информации о
результатах компиляции проекта
В некоторых случаях для проверки
работоспособности загруженной программы необходимо выполнить сброс
микроконтроллера (Reset Chip) или удалить программу из памяти (Erase
Chip).
Рисунок 5.3 - Окно отображения настроек
программатора
5.2
Физическое тестирование
Таблица 5.1 - План тестирования
Воздействие
|
Ожидаемое
|
Реальное
|
Количество очков у игрока 1 больше чем у игрока 2
|
Индикация: player 1 win
|
Индикация: player 1 win
|
Количество очков у игрока 2 больше чем у игрока 1
|
Индикация: player 2 win
|
Индикация: player 2 win
|
Координаты шарика по x
и y совпали с координатами ракетки
|
Шарик отбился
|
Шарик отбился
|
Координаты шарика по x
и y не совпали с координатами ракетки
|
Шарик не отбился
|
Шарик не отбился
|
Шарик пропущен игроком
|
Высвечивается победитель раунда и загорается светодиод
|
Высвечивается победитель раунда и загорается светодиод
|
Координаты шарика по x
или y совпали с координатами границы экрана
|
Шарик отбился
|
Шарик отбился
|
Координаты шарика по x
или y не совпали с координатами границы экрана
|
Шарик не отбился
|
Шарик не отбился
|
Количество общих пропущенных очков превышает 8
|
Определение победителя, завершение и начало новой игры через 10
сек
|
Определение победителя, завершение и начало новой игры через 10
сек
|
Рисунок 5.4 - Соединение двух микроконтроллеров
в сеть
Рисунок 5.5 - Результат выполнения программы
ВЫВОДЫ
Данный курсовой проект позволил более детально
ознакомится с микроконтроллерами типа AVR
компании ATMEL. В процессе
разработки проекта были получены навыки проектирования, реализации и внедрение
проекта в реальную модель.
В проекте не удалось реализовать функцию
позволяющую отражать шарик от ракеток игроков и от границ экрана под случайным
углом. Эта функция была описана не полностью и требует доработок.
Перемещение ракеток игроков возможно только по
строгой последовательности, поскольку для них используется единая система
координат.
Не был реализован полностью универсальный код
для двух микроконтроллеров, так как это приводило к увеличению кода и ухудшению
работы проекта, поэтому были реализованы два кода со специализированными
блоками, предназначенными для определённого контроллера.
ПЕРЕЧЕНЬ ССЫЛОК
1. Методические указания к
лабораторным работам по курсу "Микроконтроллеры во встроенных системах
управления для студентов всех специальностей / Составители Аврунин О.Г., Крук
О.Я., Семенец В.В. - ХНУРЭ, 2005. - 105 с.
2. Голубцов М.С., Кириченкова
А.В. Микроконтроллеры AVR: от простого к сложному.- М.: СОЛОН-Пресс, 2004. -
304 с.
. Баранов В.Н. Применение
микроконтроллеров AVR: схемы, алгоритмы, программы.- М.: Издательский дом
"Додэка-XXI", 2004. - 288 с.
4. Аврунин
О.Г.,.
Крук О.Я, Семенец В.В.
Микроконтроллеры
во встроенных системах управления: Учебное
пособие
-
ХНУРЭ, 2005. - 105 с.
.Техническая документация к
микрокрнтроллеру AVR
ATmega 128
.http://www.atmel.ru/ - описание
микроконтроллеров фирмы ATMEL на русском языке.
ПРИЛОЖЕНИЕ
Код программы
#include "graphics.h"
#include "source.h" char
string[30];x=65;//nachalnaja koordinata warika po xy=63;//nachalnaja koordinata
warika po yf=0;//flagd=0;//obwie ochkig2=0;//ochki player 2g1=0;//ochki player
1lx1=239,ly1=53;//nachalnue koordinatu player 2lx2=5,ly2=53;//nachalnue koordinatu
player 1game(void)
{r;t;
UCSR0A=0x00;
//установка стандартного режима задания скорости передачи данных
UCSR0B=0x90;
//установка 7-го и 4-го битов регистра UCSR0B для
инициализации
USART0 в режиме приемника и разрешения
прерывания по завершению приема кадра
UCSR0C=0x06;//
установка формата кадра: 8 бит данных с отключенным режимом четности
UBRR0H=0x00;
// установка значения делителя (47) соответствующего
UBRR0L=35;
// скорости приема данных 19200 бит/с
UCSR1A=0x00;B=0x08;
// установка 3-го бита регистра UCSR1B для инициализации
USART1 в режиме передатчикаC=0x06; H=0x00; L=35;
//инициализация отрисовки_cpu();
init_display();_text();_graphics();
while(1)
{= 0b11011111;(PINE.0==0 &&
ly1+20<120) //движение ракетки 2 по у
}= 0b10111111;
if (PINE.1==0 && ly1>5) //движение
ракетки 2 по у
{=ly1-3;= ly1;
}= 0b10111111;
if (ly2+20<120) //движение ракетки 1 по у
{
//ly2=ly2+3;
//UDR0 = ly2;
}= 0b11011111;
if (ly2>5) //движение ракетки 1 по у
{
//ly2=ly2-3;
//UDR0 = ly2;
}= UDR0;
/////////////////////_graphics();(r=0;r<=5;r++)
{_circle(x,y,r,1); //шарик
}
///////////////////////////////////////////
///////////отражение///////////////////////
///////////////////////////////////////////(x<=0
&& y>=63) //pojavlenie warika v na4alnoj to4ke i na4alnoe dvigenie
{=0;
}(f==0)
{=x+4;=y+4;(string," ");
//stiranie gameover2 player 2_string(0, 14, string);(string," ");
//stiranie gameover1 player 1_string(0, 14, string);(string,"
");//stiranie player 1 or 2 WIN_string(10, 7, string);
}
/////////////////////////(x<=230
&& y>=120) //yslovie otragenija
{=1;
}(f==1)//dvigenie
{=x+3;=y-3;
}
///////////////////(x>=lx1
&& x<=lx1+5 && y>=ly1 && y<=ly1+20)//коорд
отбивания
ракетки
player 2
{=2;
}(f==2)//dvigenie
{=x-2;=y-3;
}
/////////////////////(x>=119
&& y<=0) //yslovie otragenija
{=3;
}(f==3)//dvigenie
{=x-3;=y+3;
}
////////////////////////(y>=120
&& x<=119) //yslovie otragenija
{ f=4; }(f==4)//dvigenie
{ x=x-3;=y-3; }
////////////////////////(x>=lx2
&& x<=lx2+5 && y>=ly2 && y<=ly2+20)//коорд
отбивания
ракетки
player 1
{=5;
}(f==5) //dvigenie
{=x+3;
y=y-3;
}
//////////////////////////////(y<=0
&& x<=119)//делает нежелателный возврат
{=6;
}(f==6)//dvigenie
{=x+3;
y=y+3;
}
///////////////////////////(x>=239)
//проиграл player 2 и шарик появляется снова
{=7;
}(f==7)
{=65;=63;=0;=g2+1; //s4itaet o4ki
igroka player 2=d+1;//s4itaet o4ki obwie(string,"player2
loose");_string(0, 14, string);_ms(1000);
}
///////////////////////////(x<=0)
//проиграл player 1 и шарик появляется снова
{=8;
}(f==8)
{=65;=63;=0;=d+1;//s4itaet o4ki
obwie=g1+1;//s4itaet o4ki igroka player 1(string,"player1
loose");_string(0, 14, string);_ms(1000);
}
////////////////////////////////(x>118
&& y<=5 && f==5) //otragenie player 1 na svou storony vverh
{=0;
}
////////////////////////////////(x<118
&& y<=5 && f==2) //otragenie player 2 na svou storony vniz
{=3;
}
////////ракетки//////////////
/////////////////////////////(t=0;t<3;t++)
{(lx1-t,ly1,lx1-t,ly1+20,1); //игрок
1(lx2-t,ly2,lx2-t,ly2+20,1); //игрок 2
}
///////////////////////////////
/////индикация
на светодиоды///
///////////////////////////////(d==1)
{=0b11111110;
}(d==2)
{=0b11111100;
}(d==3)
{=0b11111000;
}(d==4)
{=0b11110000;
}(d==5)
{=0b11100000;
}(d==6)
{=0b11000000;
}(d==7)
{=0b10000000;
}(d==8)
{=0b00000000;
}(d==0 || d==9)
{=0b11111111;
}
//////////////////////////
///////вывод текста//////
////////////////////////(string,"player
1");//player 1
write_string(1,
1, string);
sprintf(string,"player
2");// player 2_string(20, 1, string);
//////////////////////////
/////результаты///////////
//////////////////////////(d>8)
{=0;(g1>g2)// esli player 1 bolwe
player 2
{(string,"WINNER: player
2");_string(10, 7, string);_ms(10000);
}(g2>g1)// esli player 2 bolwe
player 1
{(string,"WINNER: player
1");_string(10, 7, string);
delay_ms(10000);
}
}
}
}