Программирование PIC16f886. Игра «Камень, ножницы, бумага»

в 16:01, , рубрики: pic16, Песочница, метки: ,

image
Эта статья направлена на новичков в изучении программирование семейства pic-контроллеров на базе языка assembler. Я взял за основу микроконтроллер pic16f886. Для программирование и моделирования использовались соответственно программы MPlab IDE (Microchip) и Proteus (Labcenter)

Коротко о сути проекта


Данный проект позволяет играть в Камень, ножницы, бумага людям с ограниченными возможностями (Частичный паралич, отсутствие одного или нескольких пальцев либо рук) Идея принадлежит meequz, реализация моя

Структура проекта


У каждого игрока в распоряжении находятся 3 кнопки, с соответствующими им надписям (камень, ножницы, бумага). Результат выбора и счет отображается на семисегментном табло. Счет идет до 9 очков. Начало новой игры осуществляется нажатием кнопки «Сброс»

Программирование pic-контроллера


Еще раз повторюсь, что для программирования будем использовать машинно-ориентированный язык низкого уровня — язык ассемблера

Для начала объявим каком именно микроконтроллер мы используем и зарезервируем регистры общего назначении, которые нам понадобятся в дальнейшем:


LIST P=16f886
#include <p16f886.inc>

CBLOCK 0x20
IGROK_1
IGROK_2
KAMEN
NOJNITSI
BUMAGA
SCHET_1
SCHET_2
Reg_1
Reg_2
Reg_3
NINE
ENDC


Далее собственно старт программы и настройка портов вводавывода:


start ;Подпрограмма

bsf STATUS, RP1 ;Включаем банк памяти 3
bsf STATUS, RP0
clrf ANSEL ;Устанавливаем порты вводавыводы как цифровые
clrf ANSELH

BCF STATUS, RP1 ;Включаем банк памяти 1
BSF STATUS, RP0

movlw b'11100111' ;Выводы RA0,RA1,RA2,RA7,RA6,RA5 настраиваем на вход, остальные на выход
movwf TRISA
movlw b'00000000' ;Все выводы настраиваем на выход
movwf TRISB
movlw b'00000001' ;Вывод RC0 настраиваем на вход, остальные на выход
movwf TRISC

bcf STATUS,RP0 ;Включаем банк памяти 0
bcf STATUS,RP1

CLRF PORTA ; Инициализируем порты
CLRF PORTB
CLRF PORTC

movlw b'00000001'
movwf KAMEN
movlw b'00000010'
movwf NOJNITSI
movlw b'00000100'
movwf BUMAGA

movlw .9
movwf NINE

clrf IGROK_1
clrf IGROK_2
clrf SCHET_1
clrf SCHET_2
clrf W
bcf INTCON,6 ;Запрещаем прерывания
bcf INTCON,7


Команды:


movlw — пересылает константу в аккумулятор.
movwf — пересылает содержимое аккумулятора в регистр
bcf — очищает бит в регистре
bsf — устанавливает бит в регистре
clrf — очищает регистр
btfss — проверяет бит в регистре, пропускает следующую команду, если результат 1
btfsс — проверяет бит в регистре, пропускает следующую команду, если результат 0

Основной цикл программы. В нем происходит проверка нажатия кнопки на обоих контроллерах:


GAME ;Подпрограмма

BTFSS PORTA,0
CALL PRE_KANMEN_1

BTFSS PORTA,5
CALL PRE_KANMEN_2

BTFSS PORTA,1
CALL PRE_NOJNITSI_1

BTFSS PORTA,6
CALL PRE_NOJNITSI_2

BTFSS PORTA,2
CALL PRE_BUMAGA_1

BTFSS PORTA,7
CALL PRE_BUMAGA_2

GOTO PROVERKA

VOZVRAT ;Подпрограмма
GOTO GAME


Подпрограмма PROVERKA проверяет был ли выбран элемент игроком 1:


PROVERKA ;Подпрограмма
BTFSC IGROK_1,0 ;камень
GOTO ONE
BTFSC IGROK_1,1 ;ножницы
GOTO TWO
BTFSC IGROK_1,2 ; бумага
GOTO THREE
GOTO VOZVRAT


При нажатии игроком кнопки, происходит переход на определенную подпрограмму (для примера представим что игрок 1 выбрал камень):


PRE_KAMEN_1 ;Подпрограмма
MOVLW .1
CALL KOD
MOVWF PORTB
BSF PORTA,3
MOVFW KAMEN
MOVWF IGROK_1
CLRF W
call delay
BCF PORTA,3
RETURN


Выбранный элемент записывается в регистр IGROK_1
После выбора игрока 1, происходит проверка был ли выбор элемента игроком 2 и одновременно сравнивает результаты выбора. После сравнивания переходит на 1 из 3 подпрограмм:
1) Первый игрок выиграл
2) Второй игрок выиграл
3) Ничья


ONE ;Подпрограмма
BTFSC IGROK_2,0
GOTO NICHA
BTFSC IGROK_2,1
GOTO FIRST_WIN
BTFSC IGROK_2,2
GOTO SECOND_WIN

GOTO VOZVRAT
TWO ;Подпрограмма
BTFSC IGROK_2,0
GOTO SECOND_WIN
BTFSC IGROK_2,1
GOTO NICHA
BTFSC IGROK_2,2
GOTO FIRST_WIN

GOTO VOZVRAT
THREE ;Подпрограмма
BTFSC IGROK_2,0
GOTO FIRST_WIN
BTFSC IGROK_2,1
GOTO SECOND_WIN
BTFSC IGROK_2,2
GOTO NICHA

GOTO VOZVRAT


Чтобы не расписывать все 3 подпрограммы, представим что первый игрок выиграл:


FIRST_WIN ; Подпрограмма
incf SCHET_1 ;Происходит увеличении счета на 1
FIRST_W ;Подпрограмма
MOVFW SCHET_1
CALL KOD2
MOVWF PORTB
BSF PORTC,1
NOP ;Пустая команда
NOP
NOP
NOP
NOP
BCF PORTC,1

MOVFW SCHET_2
CALL KOD2
MOVWF PORTB
BSF PORTC,2
NOP
NOP
NOP
NOP
NOP
BCF PORTC,2

BTFSC PORTC,0
GOTO FIRST_W
PROV ;Подпрограмма
BTFSC PORTC,0 ;Проверка была ли нажата кнопка "сброс"
GOTO PRED_GAME
GOTO PROV


Отображение элементов происходит с помощью подпрограммы KOD:


KOD
addwf PCL,1;
retlw b'11111111';
retlw b'10100011'; 'КАМЕНЬ'
retlw b'11001001'; 'НОЖНИЦЫ'
retlw b'11000000'; 'БУМАГА'


Камень — image

Ножницы — image

Бумага — image

Отображение цифр происходит с помощью подпрограммы KOD2:


KOD2
addwf PCL,1;
retlw b'11000000'; '0'
retlw b'11111001'; '1'
retlw b'10100100'; '2'
retlw b'10110000'; '3'
retlw b'10011001'; '4'
retlw b'10010010'; '5'
retlw b'10000010'; '6'
retlw b'11111000'; '7'
retlw b'10000000'; '8'
retlw b'10010000'; '9'


Завершающим шагом программы является очистка регистров IGROK_1 и IGROK_2, и проверка переполнения счета:


PRED_GAME ;Подпрограмма
CLRF IGROK_1
CLRF IGROK_2
BCF STATUS,2
MOVFW SCHET_1
SUBWF NINE,0
BTFSC STATUS,2
GOTO CLEAR

BCF STATUS,2
MOVFW SCHET_2
SUBWF NINE,0
BTFSC STATUS,2
GOTO CLEAR

GOTO GAME

CLEAR ;Подпрограмма
CLRF SCHET_1
CLRF SCHET_2
GOTO GAME

Заключение

Схема данного проекта составленная в программе Proteus:
image

**************************************************************************
Для удобства к данной статье прикладывают .asm файл, .hex файл и
схемку в протеусе

Автор: Cat_Boris


  1. Назар:

    Есть свежие ссылки на .asm файл, .hex файл и схемку в протеусе ?

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js