この記事は、アセンブラー言語に基づいたアセンブラー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 ファイル、および
プロテウスのシェムカ