• 検索結果がありません。

実験 8 Keyboard Matrix 4x3

ドキュメント内 序文 (ページ 87-94)

実験目的

1.基本的な電子回路をつなげられること

2.Keyboard Matrix 4x3と使用するプログラムを作成すること 3.Matrix型のKeyboardの原理を学ぶこと

4.サンプルプログラムを拡張し適応できること 実験装置

1. マイクロコントローラー CP-PIC V3.0EXPAND 2. Keyboard Matrix 4x3 1個

3. 7-Segment 1個

4. 560Ωの抵抗器 1個

5. ケーブル

実験前の説明

 この実験ではMatrix 4x3型キースイッチを7-Segmentと共に稼動することを学びます。こ こではキーボードをPORTBとつけます。PORTBにはpull-up機能を持っていますから内部 に抵抗器をつけなくてもキーボードとつなぐことができます。そして、7-SegmentをPORTD とつなげてスイッチを押す結果を表示させます。7-Segmentを表示するプログラムは前の実 験と同様です。

実験手段

1.下図のように回路をつなげてPORTDを7-Segmentと、PORTBをKeyboardとつけることに 注意します。

図 8.2 実験回路(続き)

2.次のソースコードを書き込んでコンパイルします。

Assembly言語、16F877用 LIST p=16f877

Include <p16f877.inc>

ROW EQU 0x30

OFFSET EQU 0x31

COUNT1 EQU 0x32

COUNT2 EQU 0x33

ORG 0x0000

BSF STATUS,RP0 ;bank1を選択する

CLRF TRISD ;PORTDを出力にする

MOVLW 0xF0 ;”11110000”

MOVWF TRISB ;PORTB<7:1> is input PORTB<3:0> is output BCF OPTION_REG,7 ;enable pull-up PORTB

BCF STATUS,RP0 ;bank0を選択する

CLRF PORTD ;LEDをクリア

*****start to send*****

START MOVLW 0xFE ;スキャンデータを”11111110”にする

MOVWF ROW ;変数ROWに保存する

CLRF OFFSET ;OFFSET=00に初期化する

NEXT MOVF ROW,W

MOVWF PORTB ;スキャンしたデータをPORTBに送信

BTFSS PORTB,4;1列目が押されるかどうかチェックする

GOTO COL_1

BTFSS PORTB,5;2列目が押されるかどうかチェックする

GOTO COL_2

BTFSS PORTB,6;3列目が押されるかどうかチェックする

GOTO COL_3

MOVLW 3 ;3キーを押すときに足し算する定数

BCF STATUS,C ;clear carry flag ADDWF OFFSET,F ;count=count+3 BSF STATUS,C ;Set carry flag

RLF ROW,F ;理論値を変えて次の行を読み込む

BTFSS ROW,4 ;最後の行であるかどうかを確認する

GOTO START ;また繰り返してスキャンする

COL_3 INCF OFFSET,F ;OFFSET+1

COL_2 INCF OFFSET,F ;OFFSET+1

COL_1 MOVF OFFSET,W ;W=OFFSET

CALL TAB ;表を開く子プログラム

MOVWF PORTD ;7-Segmentにデータを送る

CALL DELAY ;タイミングする

GOTO START ;繰り返してスキャンする

;**************

DELAY CLRF COUNT1 ;タイミングするプログラム

DEL CLRF COUNT2 DEL1 DECFSZ COUNT2,F

GOTO DEL1 DECFSZ COUNT1,F GOTO DHL RETURN

****Table Of 7-Segment Code****

TAB ADDWF PCL,F

DT 0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x27,0x7F,0x6F,0x77,0x3F,0x7C END

Assembly言語、18F458用

list p = 18f458 ;list directive to define processor

#include <p18f458.inc> ;processor specific variable definitions

OFFSET EQU 0x20

ROW EQU 0x21

DT1 EQU 0x22

DT2 EQU 0x23

DA_TA EQU 0x24

ORG 0x0000

*****initial*****

CLRF TRISD ;PORTDを出力にする

MOVLW 0xF0 ;”11110000”

MOVWF TRISB ;PORTB<7:4> is input PORTB<3:0>is output BCF INTCON2,RUPU ;enable pull-up PORTB

*****start to send*****

START MOVLW 0x0E ;スキャンするデータを”11111110”にする

MOVWF ROW ;変数ROWに保存する

CLRF OFFSET ;OFFSET=00に初期化する

SCAN MOVF ROW,W

MOVWF PORTB ;スキャンしたデータをPORTBに送る

BTFSS PORTB,4;1列目押されたかどうかを確認する

GOTO COL_1

BTFSS PORTB,5; 2列目押されたかどうかを確認する

GOTO COL_2

BTFSS PORTB,6; 3列目押されたかどうかを確認する

GOTO COL_3

MOVLW 6 ; 3キーを押すときに足し算する定数

CLRC ;clear carry flag

ADDWF OFFSET,F ;count=count+6

MOVLW .24 ;最後の行を確認するための数字

OFFSEQ OFFSET ;offset値を比較する

GOTO NEXT_SCAN ;最後の行ではない

GOTO START ;すべての4行をスキャンして最初に戻る

NEXT_SCAN BSF STATUS,C ;set carry flag

RICF ROW,F ;次の行を置き換え

GOTO SCAN ;次の行をスキャンする COL_3 MOVLW .4 ;3列目用のoffset値

ADDWF OFFSET,W ;w=offset+4

GOTO DISPLAY

COL_2 MOVLW .2 ;2列目用のoffset値

ADDWF OFFSET,W ;w=offset+2

GOTO DISPLAY

COL_1 MOVF OFFSET,W ;1列目用のoffset値

DISPLAY CALL TAB ;表からデータを取得

MOVWF PORTD ;7-Segmentにデータを送る

CALL DELAY ;タイミングする

GOTO START ;またスキャンを繰り返す

DELAY CLRF DT1 ;タイミングするプログラム

SD2 CLRF DT2

SD1 DECFSZ DT2

GOTO SD1

DECFSZ DT1

GOTO SD2 RETURN

*****Table of 7-Segment Code*****

TAB ADDWF PCL,f ;Move offset to PC lower DT 0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x27,0x7F,0x6F,0x77,0x3F,0x7C

;1,2,3,4,5,6,7,8,9,A,0,b END

プログラムの解説

 このプログラムは4x3のマトリックス型スイッチの信号を毎行スキャンします。は じめに理論値”0”をROW(行)ごとに送り、列(COL1,COL2,COL3)とつながるビット をチェックし、どの列のビット値が”0”であればその行と列には押されたボタンが あるのです。下図と表はスイッチとそのビット値の変動を表します

ROW 1,2,3,4 COL1,COL2,COL3

R1 R2 R3 R4 C1 C2 C3 C1 C2 C3 C1 C2 C3 C1 C2 C3

0 1 1 1 0 1 1 1 0 1 1 1

0 1 1 1 キー1を押す キー2を押す キー3を押す 押さない

1 0 1 1 キー4を押す キー5を押す キー6を押す 押さない

1 1 0 1 キー7を押す キー8を押す キー9を押す 押さない

1 1 1 0 キー*を押す キー0を押す キー#を押す 押さない

 例えば理論値“0”をRB0(ROW1)に送ってRB4,RB5,RB6の状態をチェックし、も しRB4が“0”であればキー1が押され、またはRB5が“0”のときキー2、RB6が

“0”のときキー3などなど。このようなやり方で毎行毎列をスキャンします。

 ここでRB0-RB3が出力にし、RB4-RB6を入力にします。出力ビットが普段Pull-upの 抵抗器をすべての足につけなければならないがこの実験では内部 pull-up抵抗器を持 っているPORT Bを用いますから、RBPUのビットをクリアすることによってpull-up を選択することができます。16F877の場合、レジスターOPTION_REGの7ビット目に、

18F458の場合、レジスターINTCON2の7ビット目にあります。

 このプログラム、4x3キーの押された数字をもらって、7-Segmentで表示します。前の 実験と同様に表を開いてデータを取得しますがここではキーをスキャンするプログラム を追加します。あわせて、キーを押すとOFFSET値がそのキーの数字を指定する番号に変

更し、OFFSET値で表を開いてデータを取得し7-Segmentで表示します。ここでは表に入

っているデータが12個、1,2,3,4,5,6,7,8,9,A,0とbになります。

BASIC言語

INCLUDE “modedefs.bas” ‘Include serial modes

DEFINE OSC 10

i var byte index var byte keyin var byte keyout var byte

LOW INTCON2.7 ‘pull-up enable PORTB

TRISB =$0F ‘PORTB<7:4>を出力、PORTB<3:0>を入力にする

TRISD =$00 ‘PORTDを出力にする

PORTD=$00 ‘PORTDをクリア

scan: for i=0 to 2 ‘3回スキャンする

lookup I,[$E0,$D0,$B0],keyout ‘表を開いてキーをスキャンする

PORTB=keyout ‘PORTBに送る

Keyin=PORTB&SOF ‘下の4ビット

if keyin=$0F then next_scan ‘スキャンした値が$0Fときつまり押さないとき、ま たスキャンする

pause 50 ‘Debounceスイッチのためにタイミングする

keyin=keyin|keyout‘keyin=[keyin or keyout]

lookdown keyin,[$EF,$DE,$BE,$FD,$DD,$BD,$EB,$DB,$BB,$E7,$D7, $B7],index lookup index,[$06,$5B,$4F,$66,$6D,$7D,$27,$7F,$6F,$77,$3F,$7C],PORTD

next_scan; next goto scan

PIC16F877の場合 OPTION_REG.7 PIC18F458の場合 INTCON2.7に入れ替 えます

ドキュメント内 序文 (ページ 87-94)

関連したドキュメント