IRリモコンで7セグ表示

 7セグ表示器は7つのセグメントを使って0から9までの数字を表示するものです。アルファベットも表示できますが。この7セグ表示器を制御するにはCMOSの4511や4543が使用されます。この場合、A,B,C,Dの4ビットの入力信号を0から9の数字にデコードして表示します。これをマイコンで制御しようとすると桁数が少ないときはいいのですが、多いと配線が非常に複雑になってしまいます。3桁でも大変です。

ソースリスト

#include<16f84a.h>
#fuses HS,NOWDT,PROTECT
#use delay(CLOCK=20000000)
#byte RA=5
#byte RB=6
#bit RS=RA.4
//CPU wait
#define CL_WAIT 49
#define ON 1
#define OFF 0
#define HI 1
#define LOW 0
int j,x;

void display_clear(int f)     //3桁の7セグ、及びドットを消灯させる
  { for (j=0;j<24;j++)
    {
     x=f;   
     x&=0x01;            //xと01の論理積をxに入れる
     output_low(PIN_A1);                  // CK
     output_bit(PIN_A0,x);         //DT A0に0又は1のxを
                       //出力する(serial out)
     output_high(PIN_A1);
     output_low(PIN_A0);
     f>>=1;           //fを1ビット右シフト(serial outの準備)
    }                  
   output_high(PIN_A3);                   // EN
   delay_ms(5);
   output_high(PIN_A2);                   // LT
   output_low(PIN_A2);
   output_low(PIN_A3);
   delay_ms(10);}

/*********************** DISPLAY ROUTINE********************/
void display(int f)            //リモコンからの数値fを表示する
  { RA=0x10;                  // RA4のみ入力ポート
   for (j=0;j<8;j++)          //7セグ、ドットの8ビットのデータ
   {  x=f;                 //fは8ビットバイナリーデータ
     x&=0x01;          //fの最下位ビットと1のANDをとる
     output_low(PIN_A1);                  //CK
     output_bit(PIN_A0,x);                 //DT
     output_high(PIN_A1);
     output_low(PIN_A0);
     f>>=1;
   }
   output_high(PIN_A3);                    //EN
   delay_ms(5);
   output_high(PIN_A2);                   //LT
   output_low(PIN_A2);
   output_low(PIN_A3);
   delay_ms(400);

void main()
   {
    int ird[32],i,gcount,p_count,f,j,x;
    set_tris_a(0x10);               //A4のみ入力
    set_tris_b(0x00);

  while(1)
   {
    gcount=0;
    while(gcount <100)
    {                 //9.9ms経過するまでの間に
     if(RS==HI)        //RA4の入力が1でIr信号のないとき
     { delay_us(100);
      gcount++;}                 //カウントアップし
     else { gcount=0;}        //RA4=0となればカウントクリアする
    }                     
    while(RS==HI){ }
    while(RS==LOW){ }
    while(RS==HI){ }
    for(i=0;i<=31;i++)   //受信ビット数32だがif文のチェックは24ビット
     {p_count=0;
      while(RS==LOW){ }
      while(RS==HI)    //入力1で30カウントしその時のデータを取込む
       { delay_us(CL_WAIT);
        p_count=p_count+1;
        if( p_count > 23 )      // 24*49=1176≒1200uSec
         {ird[i] = 1;}           //1200u以上なら1
        else
         {ird[i] = 0;}           //1200u以下なら0
       }
   }
/*****************受信信号と7セグエレメントの関係***************/

if(ird[0]==1 && ird[1]==1 && ird[2]==1 && ird[3]==0 && ird[4]==0 && ird[5]==0 && ird[6]==0 && ird[7]==1 && ird[8]==1 && ird[9]==0 && ird[10]==0 && ird[11]==0 && ird[12]==1 && ird[13]==1 && ird[14]==0 && ird[15]==0 && ird[16]==1 && ird[17]==0 && ird[18]==0&&ird[19]==0 && ird[20]==1 && ird[21]==0 && ird[22]==0 && ird[23]==0)
    {display(0b11111100);}                  //0

if(ird[0]==1 && ird[1]==1 && ird[2]==1 && ird[3]==0 && ird[4]==0 && ird[5]==0 && ird[6]==0 && ird[7]==1 && ird[8]==1 && ird[9]==0 && ird[10]==0 && ird[11]==0 && ird[12]==1 && ird[13]==1 &&ird[14]==0 && ird[15]==0 && ird[16]==0 && ird[17]==0 && ird[18]==1&&ird[19]==0 && ird[20]==0 && ird[21]==0 && ird[22]==0 && ird[23]==0)
    {display(0b01100000);}                 //1

if(ird[0]==1 && ird[1]==1 && ird[2]==1 && ird[3]==0 && ird[4]==0 && ird[5]==0 && ird[6]==0 && ird[7]==1 && ird[8]==1 && ird[9]==0 && ird[10]==0 && ird[11]==0 && ird[12]==1 && ird[13]==1 && ird[14]==0 && ird[15]==0 && ird[16]==1 && ird[17]==0 && ird[18]==1&&ird[19]==0 && ird[20]==0 && ird[21]==0 && ird[22]==0 && ird[23]==0)
    {display(0b11011010);}                 //2

if(ird[0]==1 && ird[1]==1 && ird[2]==1 && ird[3]==0 && ird[4]==0 && ird[5]==0 && ird[6]==0 && ird[7]==1 && ird[8]==1 && ird[9]==0 && ird[10]==0 && ird[11]==0 && ird[12]==1 && ird[13]==1 && ird[15]==0 && ird[16]==0 && ird[17]==1 && ird[18]==1 && ird[19]==0&&ird[20]==0 && ird[21]==0 && ird[22]==0 && ird[23]==0 )
    {display(0b11110010);}                 //3

if(ird[0]==1 && ird[1]==1 && ird[2]==1 && ird[3]==0 && ird[4]==0 && ird[5]==0 && ird[6]==0 && ird[7]==1&& ird[8]==1 && ird[9]==0 && ird[10]==0 && ird[11]==0 && ird[12]==1 && ird[13]==1 && ird[14]==0 && ird[15]==0 && ird[16]==0 && ird[17]==0 && ird[18]==0&&ird[19]==1 && ird[20]==0 && ird[21]==0 && ird[22]==0 && ird[23]==0)
    {display(0b01100110);}                 //4

if(ird[0]==1 && ird[1]==1 && ird[2]==1 && ird[3]==0 && ird[4]==0 && ird[5]==0 && ird[6]==0 && ird[7]==1 && ird[8]==1 && ird[9]==0 && ird[10]==0 && ird[11]==0 && ird[12]==1 && ird[13]==1 && ird[14]==0 &&ird[15]==0 && ird[16]==1 && ird[17]==0 && ird[18]==0 &&ird[19]==1 && ird[20]==0 && ird[21]==0 && ird[22]==0 && ird[23]==0)
    {B2=ON;B0=ON; display(0b10110110);}           //5

if(ird[0]==1 && ird[1]==1 && ird[2]==1 && ird[3]==0 && ird[4]==0 && ird[5]==0 && ird[6]==0 && ird[7]==1 && ird[8]==1 && ird[9]==0 && ird[10]==0 && ird[11]==0 && ird[12]==1 && ird[13]==1 && ird[14]==0 && ird[15]==0 && ird[16]==0 && ird[17]==1 && ird[18]==0&&ird[19]==1 && ird[20]==0 && ird[21]==0 && ird[22]==0 && ird[23]==0)
    {display(0b00111110);}                 //6

if(ird[0]==1 && ird[1]==1 && ird[2]==1 && ird[3]==0 && ird[4]==0 && ird[5]==0 && ird[6]==0 && ird[7]==1 && ird[8]==1 && ird[9]==0 && ird[10]==0 && ird[11]==0 && ird[12]==1 && ird[13]==1 && ird[14]==0 && ird[15]==0 && ird[16]==0 && ird[17]==0 && ird[18]==1&&ird[19]==1 && ird[20]==0 && ird[21]==0 && ird[22]==0 && ird[23]==0)
    {display(0b11100000);}                 //7

if(ird[0]==1 && ird[1]==1 && ird[2]==1 && ird[3]==0 && ird[4]==0 && ird[5]==0 && ird[6]==0 && ird[7]==1 && ird[8]==1 && ird[9]==0 && ird[10]==0 && ird[11]==0 && ird[12]==1 && ird[13]==1 && ird[14]==0 && ird[15]==0 && ird[16]==1 && ird[17]==0 && ird[18]==1&&ird[19]==1 && ird[20]==0 && ird[21]==0 && ird[22]==0 && ird[23]==0)
    {display(0b11111110);}                 //8

if(ird[0]==1 && ird[1]==1 && ird[2]==1 && ird[3]==0 && ird[4]==0 && ird[5]==0 && ird[6]==0 && ird[7]==1 && ird[8]==1 && ird[9]==0 && ird[10]==0 && ird[11]==0 && ird[12]==1 && ird[13]==1 && ird[14]==0 && ird[15]==0 && ird[16]==0 && ird[17]==1 && ird[18]==1&&ird[19]==1 && ird[20]==0 && ird[21]==0 && ird[22]==0 && ird[23]==0)
    {display(0b11100110);}                 //9

if(ird[0]==1 && ird[1]==1 && ird[2]==1 && ird[3]==0 && ird[4]==0 && ird[5]==0 && ird[6]==0 && ird[7]==1 && ird[8]==1 && ird[9]==0 && ird[10]==0 && ird[11]==0 && ird[12]==1 && ird[13]==1 && ird[14]==0 && ird[15]==0 && ird[16]==1 && ird[17]==0 && ird[18]==1&&ird[19]==0 && ird[20]==1 && ird[21]==0 && ird[22]==0 && ird[23]==0)
    {display_clear(0b00000000);}             //削除
  }
} 
 トップページへ戻る                                                   

 リモコンから入力した数字はIrDaで受信しRA4に入力されたものをデコードします。デコードされた信号はRA0からシリアルに出力されシフトレジスターに送られていきます。シフトレジスターに必要なクロック、イネーブル、ラッチはRA1,RA3,RA2から出力します。MBI5001はMacroblockというメーカーのもので8ビットシリアルアウトがあるのが特徴で定電流LEDドライバです。74HC164のシリアルアウトつきといったところです。多段接続には便利です。

ソフトの説明

74HC4511

 ここで使用した赤外線リモコンは電気街で入手したジャンク品でしたが、残念ながら手元に残っていません。そのためこのリモコンでのデバッグができない状態になっています。パナソニックのリモコン使用例がPICを使った自作集テレビの赤外線リモコンでモーター制御に記載していますので、そちらも参考にしてください。これらの細かいタイミングについてはソースリストをご覧ください。AポートはRA4が入力で、他は出力です。Bポートは使用しませんので出力モードにしています。メインルーチンのwhile(1)の最初の部分はリモコンのIR信号を検出するものです。RSはIRの受光ユニットの出力、即ちRA4の入力で普段はHです。IRリモコンの信号を受信すると4つのwhile文でリモコンの信号であることを検出した後、数字のコードを配列に取り込んでいきます。Lのパルス幅は約400uSec、Hのパルス幅は約1600uSecですので、余裕をみて約1200uSecを判定条件にしています。

 7つのセグメントとドットを含めた8つの要素に見立ててマイコンでシリアルに制御してやると構造も簡単で多桁にも対応しやすくなります。その一つとしてシフトレジスターを使用するものがあります。ここで製作したのは3桁表示するものでPIC16F84A,シフトレジスターはMBI5001を使用し数字の入力はIrDaリモコンで行い、その信号を受信するものです。

回路図