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;}
}

トップページへ戻る
16進表示4×4キーボード

 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進数読み取りのトレーニングボードになります。

基板構成