AポートはLEDを点灯させますが、VFが2.2Vのガリウム砒素系のLEDを使用していますので、10mA程度流すために220Ωにしています。PICの1ピン最大電流は25mAですから十分余裕があります。Bポートは下位ビットが出力モードですが、上位ビットが入力モードですので、電流はほとんど流れません。各々、直列に入っている抵抗はノイズ対策です。
ソフトの説明
発振器は10MHzのセラミックレゾネータを使用しましたので、発振モードはHSにしています。16進数表示用のLEDは、出力モードに設定したAポートに接続します。初期状態はLowレベル(消灯状態)に設定します。キーボードの4×4マトリクスのロウ(行)はRB4〜RB7、カラム(列)はRB0〜RB3に接続します。TRISB=0xF0としていますので、ロウは入力モード、カラムは出力モードになります。事前にPORTB=0xFFにしていますので、カラムは全てビットが立っています。次に、RB0からRB3を順次Lowにしていきます。キーボードから1つのキーが押されると、プログラムは上位4ビットのLowの位置を見ていきますから、ポートBとF0(11110000)のANDをとることにより、どのロウが検出されたかをswitch-case文で検出することになります。キーが押されるとBポートの上位4ビットをその値をcaseに適用し、対応するポートのLEDを点灯させます。キーを押している間だけ表示するようにしていますので、キーのチャタリング防止機能は入れていません。ラッチさせるためにはcase以降でサブルーチンへ飛ばし、そこで処理することになります。ここでの例は、一番シンプルなものですが7セグや液晶表示もできます。その場合は、チャタリング防止機能が必要になるかもわかりません。
ソースリスト
#include <xc.h>
#pragma config FOSC = HS
#pragma config WDTE = OFF
#pragma config PWRTE = OFF
#pragma config CP = OFF
#define _XTAL_FREQ 10000000
main()
{
TRISA=0x00;
TRISB=0xF0;
PORTA=0x00;
PORTB=0xFF;
RB0=0; // PORTBの状態 1111 1110
switch(PORTB & 0b11110000)
{
case 0b11100000: //3を押下と判断
PORTA=0x03;
break;
case 0b11010000: //7を押下と判断
PORTA=0x07;
break;
case 0b10110000: //Bを押下と判断
PORTA=0x0B;
break;
case 0b01110000: //Fを押下と判断
PORTA=0x0F;
}
PORTA=0x00;
PORTB=0xFF;
RB1=0; // PORTBの状態 1111 1101
switch(PORTB & 0b11110000){
case 0b11100000: //2を押下と判断
PORTA=0x02;
break;
case 0b11010000: //6を押下と判断
PORTA=0x06;
break;
case 0b10110000: //Aを押下と判断
PORTA=0x0A;
break;
case 0b01110000: //Eを押下と判断
PORTA=0x0E;}
PORTA=0x00;
PORTB=0xFF;
RB2=0; //PORTBの状態 1111 1011
switch(PORTB & 0b11110000){
case 0b11100000: //1を押下と判断
PORTA=0x01;
break;
case 0b11010000: //5を押下と判断
PORTA=0x05;
break;
case 0b10110000: //9を押下と判断
PORTA=0x09;
break;
case 0b01110000: //Dを押下と判断
PORTA=0x0D;}
PORTA=0x00;
PORTB=0xFF;
RB3=0; //PORTBの状態 1111 0111
switch(PORTB & 0b11110000){
case 0b11100000: //0を押下と判断
PORTA=0x00;
break;
case 0b11010000: //4を押下と判断
PORTA=0x04;
break;
case 0b10110000: //8を押下と判断
PORTA=0x08;
break;
case 0b01110000: //Cを押下と判断
PORTA=0x0C;}
}
4×4キーボードで、4個のLEDの点灯による1桁の16進表示をします。PIC16F84Aを使用します。ハードもソフトも必要最小限のシンプルな構造です。ソフトでのキーのチャタリング防止機能は使っていません。switch-case文で、キーボードのロウ・カラムを検出しています。BCDはBinary-coded Decimal(2進化10進)で、10進数の1桁を0から9までの2進数の4桁で表しますが、ここで製作したものは16進数の1桁を2進数の4桁で表します。4桁の16進表示の読み方は、ビット0からビット3に向かって、イチ(1)、ニー(2)、ヨン(4)、パー(8)と読んでいって、ビットの立っているところにその数字を入れ足し算すればOKです。例えば、1101なら8+4+0+1=13になります。16進表示では0x0Dと表します。コンパイラはXCを使いました。
回路図
基板は2枚構成です。左の基板がキーボード、右の基板がPICとLEDです。接続はキーボード側のヘッダーピンのオス とPIC側のメスで嵌合します。
LEDは一番左がLSB,右がMSBです。写真は”D”が点灯している状態です。16進数読み取りのトレーニングボードになります。
基板構成