実験目的
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に入れ替 えます