PIC16f886のプログラミング。 ゲーム「石、はさみ、紙」

画像
この記事は、アセンブラー言語に基づいたアセンブラーpic-controllersファミリーのプログラミングの初心者を対象としています。 私はpic16f886マイクロコントローラーをベースとして使用しました。 プログラミングとモデリングには、それぞれMPlab IDE(Microchip)Proteus(Labcenter)プログラムが使用されました。


プロジェクトの本質について簡単に


このプロジェクトは、障害を持つ人々が岩、紙、はさみ、紙を再生することを可能にします(部分的な麻痺、1本以上の指や手の欠如)。

プロジェクト構造


各プレーヤーには、対応する碑文(石、はさみ、紙)が付いた3つのボタンがあります。 選択の結果とスコアは、7セグメントボードに表示されます。 スコアは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によって選択が行われたかどうかを確認し、同時に選択結果を比較します。 比較後、3つのサブプログラムのうちの1つに進みます。
1)最初のプレーヤーが勝った
2)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 ファイル、および
プロテウスのシェムカ

Source: https://habr.com/ru/post/J146040/


All Articles