Эта статья направлена на новичков в изучении программирование семейства 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'; 'БУМАГА'
Камень —
Ножницы —
Бумага —
Отображение цифр происходит с помощью подпрограммы 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:
**************************************************************************
Для удобства к данной статье прикладывают .asm файл, .hex файл и
схемку в протеусе
Автор: Cat_Boris
Есть свежие ссылки на .asm файл, .hex файл и схемку в протеусе ?