/************ LED 28個を配列に従って点灯させる。
コンパイラ HTC、シフトレジスタ M66310 ディスコン品、システムクロック5M************/
#include <htc.h>
#define _XTAL_FREQ 5000000
char *p;
char i,y;
const data0[28]={1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    data1[28]={1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    data2[28]={1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

void speed()
  {
   int dipsw2;
   dipsw2=(PORTB & 0x0f);
   switch(dipsw2){
     case 0x0d:__delay_ms(100);__delay_ms(100);break;
     case 0x07:__delay_ms(100);break;
     case 0x0e:__delay_ms(30);break;
     default: break;
     }
  }

void segshift()
  {
   RB6=0;                //EN
   for(i=0;i<28;i++)
     { y=*p;             //ポインタのアドレスのデータをyに
      RB7=0;            //clk==low
      RB4=0;             //LT==low ラッチクロック
      RB5=y;             //data_out
      RB7=1;             //clk==high シフトクロック
      RB4=1;             //LT==high
      speed();
      RB5=0;
      p++; }
      RB6=1;             //DISEN
     }

void segall()
  {
    RB6=0;               //EN
    for(i=0;i<28;i++)
      { y=1;
       RB7=0;            //clk==low
       RB4=0;            //LT==low ラッチクロック
       RB5=y;            //data_out
       RB7=1;            //clk==high シフトクロック
       RB4=1;            //LT==high
       delay_ms(1);
       RB5=0;
       p++;
       RB6=1;            //DISEN
      }
  }

main()
  {
    int dipsw1;            // mode
    int dipsw2;            // speed
    TRISA=0xff;
    TRISB=0x0f;
    dipsw1=(PORTA & 0x07);
    switch(dipsw1){
      case 0x06:
       while(1)
        {
         p=data0;
         segshift(p);
         RB6=1;
         __delay_ms(100);__delay_ms(100);__delay_ms(100);
         __delay_ms(100);    //0.4sec off
         segall();
         __delay_ms(100);__delay_ms(100);__delay_ms(100);
         __delay_ms(100);    //0.4sec on
         RB6=1;
         __delay_ms(100); __delay_ms(100);__delay_ms(100);
         __delay_ms(100);
        } ;
       break;           //0.4sec off
      case 0x05:
       p=data1;
       segshift(p);
       break;
      case 0x03:
       p=data2;
       segshift(p);
       break;
      default:
      break;
       }
   }


トップページへ戻る
シフトレジスタでLEDフロー表示

 ディスコンのシフトレジスタM66310を使用したLEDフローです。32個のLEDフロー表示ではCCSを使いましたが、今回はハイテックCにしました。CCSとは少し勝手が違いました。

回路図
ソースリスト

 これを製作・検証したときは、LEDは28個でした。ただ、このシフトレジスターを使用したデバッグ機は手元に残っていませんので、ソースリストはLEDが28個の時のままです。ディップスイッチは点灯モードを変えます。LEDの点灯パターンは3種類でconstで定義しています。1個のフロー点灯、2個の後追いフロー点灯、3個の後追いフロー点灯の3種類です。speed()はディップスイッチで3種類の中から選びます。case 0x0dで100mSが並んでいるのは100mSを基準に検討していた時のなごりです。segshift()は、シフトレジスタに与える各信号の時系列の並びです。segall()は、全部点灯させるためですが、1個づつを1mS間隔で回しているだけです。モードはmain()の中で変えています。

ソフトの説明

 ルネサス(三菱)のLED用のラッチつき16ビットシフトレジスタを、PIC16F84Aで制御します。このシフトレジスタは、シフト用とラッチ用の2つのクロック入力があり、6Pinがラッチクロック入力で、8Pinがシフトクロック入力です。これを2段カスケード接続して32個のLEDを動かします。