MAX7219の使い方8×8LCD無ライブラリー(9)ESP32編

この4日~5日の間,頭をさんざん悩ませていました。何のことはない,数字のを上から落ちてくるようにし
たくて,あれこれなやんでしました。特に,この二日間は,散歩しながらも,うまくいかない原因を考えては
,手直しを考える。散歩が終わってからは実際に修正してみる,の繰り返しをしてました。今日,やっと思っ
た動作ができるよいうになりました。スケッチのアルゴリズム(手順)は,ほぼ間違いなかったのですが,
順番を間違っていました。本来ならば,

  保持しているメモリの移動→→新しい書き込み

の順でしなければならないのに,

  書き込み→メモリーの移動

の順にしてました。完成したときは,思わず,やった,と叫びそうになりました。

動画のような動作になりますが,一秒の表示のところが,時々,数字が飛びます。これは,処理の関係で仕方
ないのかなと思います。スケッチは,ほとんどが,bit の操作で,今回は,備え付けの関数を使わないで,
or と and で処理しました。冗長なスケッチですが,次のものが,数字をセットする部分のスケッ
チです。

/**************************************************************
*number_set_V_T(int y,int x,string num)
*
***************************************************************/
void number_set_V_T(int y,int x,char ch){
 
  int num;
  unsigned char buff;
  unsigned char buff_suji;


  if(ch=='0'){num=0;}
  if(ch=='1'){num=1;}
  if(ch=='2'){num=2;}
  if(ch=='3'){num=3;}
  if(ch=='4'){num=4;}
  if(ch=='5'){num=5;}
  if(ch=='6'){num=6;}
  if(ch=='7'){num=7;}
  if(ch=='8'){num=8;}
  if(ch=='9'){num=9;}
  if(ch=='A'){num=10;}


  int u_num=(x-1)/8+1;
  if((x % 8)==0){
     x=8;
  }
  else{
     x=x % 8;
  }


  switch (x){    
      case 8:
        for(int n=7;n>=0;n--){
          v_shift_T(u_num,x);


          buff_suji=suuji[num][n];
          buff_suji=buff_suji<<2;//数字を2ビットシフト
          dot_hoji[u_num][1]=dot_hoji[u_num][1] & 0b00011111;
          dot_hoji[u_num][1]=dot_hoji[u_num][1] | buff_suji;
          dummy[8-n]=dot_hoji[u_num][1];


          dot_hyouji(u_num);
          delay(TM);
         
        }
        break;
      case 7:
        for(int n=7;n>=0;n--){
           v_shift_T(u_num,x);


          buff_suji=suuji[num][n];
          buff_suji=buff_suji<<1;//数字を2ビットシフト
          dot_hoji[u_num][1]=dot_hoji[u_num][1] & 0b10001111;
          dot_hoji[u_num][1]=dot_hoji[u_num][1] | buff_suji;
         
          dot_hyouji(u_num);
          delay(TM);
         
        }
        break;      
      case 6:
        for(int n=7;n>=0;n--){
           v_shift_T(u_num,x);


          buff_suji=suuji[num][n];
          dot_hoji[u_num][1]=dot_hoji[u_num][1] & 0b11000111;
          dot_hoji[u_num][1]=dot_hoji[u_num][1] | buff_suji;
         
          dot_hyouji(u_num);
          delay(TM);
        }
        break;
      case 5:
       for(int n=7;n>=0;n--){
          v_shift_T(u_num,x);


          buff_suji=suuji[num][n];
          buff_suji=buff_suji>>1;//数字を右に1ビットシフト
          dot_hoji[u_num][1]=dot_hoji[u_num][1] & 0b11100011;
          dot_hoji[u_num][1]=dot_hoji[u_num][1] | buff_suji;
         
          dot_hyouji(u_num);
          delay(TM);
        }
        break;      
      case 4:
        for(int n=7;n>=0;n--){
          v_shift_T(u_num,x);


          buff_suji=suuji[num][n];
          buff_suji=buff_suji>>2;//数字を右に2ビットシフト
          dot_hoji[u_num][1]=dot_hoji[u_num][1] & 0b11110000;
          dot_hoji[u_num][1]=dot_hoji[u_num][1] | buff_suji;


          dot_hyouji(u_num);
          delay(TM);
        }
        break;  
      case 3:
        for(int n=7;n>=0;n--){
          v_shift_T(u_num,x);


          buff_suji=suuji[num][n];
          buff_suji=buff_suji>>3;//数字を右に3ビットシフト
          dot_hoji[u_num][1]=dot_hoji[u_num][1] & 0b11111000;
          dot_hoji[u_num][1]=dot_hoji[u_num][1] | buff_suji;
         
          dot_hyouji(u_num);
          delay(TM);
        }
        break;
      case 2:
        if(u_num>1){
          for(int n=7;n>=0;n--){
            v_shift_T(u_num,x);


            buff_suji=suuji[num][n];
            buff_suji=buff_suji>>4;
            dot_hoji[u_num][1]=dot_hoji[u_num][1] & 0b11111100;
            dot_hoji[u_num][1]=dot_hoji[u_num][1] | buff_suji;
           
            buff_suji=suuji[num][n];
            buff_suji=buff_suji<<4;
            dot_hoji[u_num-1][1]=dot_hoji[u_num-1][1] & 0b01111111;
            dot_hoji[u_num-1][1]=dot_hoji[u_num-1][1] | buff_suji;


            dot_hyouji(u_num);
            delay(TM);
          }
        }
        else{
          for(int n=7;n>=0;n--){
            v_shift_T(u_num,x);


            buff_suji=suuji[num][n];


            buff_suji=buff_suji>>4;
            dot_hoji[u_num][1]=dot_hoji[u_num][1] & 0b11111100;
            dot_hoji[u_num][1]=dot_hoji[u_num][1] | buff_suji;
            buff_suji=suuji[num][n];


            dot_hyouji(u_num);
            delay(TM);
          }
        }
        break;
      case 1:
        if(u_num>1){
          for(int n=7;n>=0;n--){
            v_shift_T(u_num,x);


            buff_suji=suuji[num][n];
           
            buff_suji=buff_suji>>5;
            dot_hoji[u_num][1]=dot_hoji[u_num][1] & 0b11111110;
            dot_hoji[u_num][1]=dot_hoji[u_num][1] | buff_suji;
           
            buff_suji=suuji[num][n];
            buff_suji=buff_suji<<3;
            dot_hoji[u_num-1][1]=dot_hoji[u_num-1][1] & 0b00111111;
            dot_hoji[u_num-1][1]=dot_hoji[u_num-1][1] | buff_suji;


            dot_hyouji(u_num);
            delay(TM);
          }
        }
        else{
          for(int n=7;n>=0;n--){
             v_shift_T(u_num,x);


            buff_suji=suuji[num][n];
            buff_suji=buff_suji>>5;
            dot_hoji[u_num][1]=dot_hoji[u_num][1] & 0b11111110;
            dot_hoji[u_num][1]=dot_hoji[u_num][1] | buff_suji;
           
            dot_hyouji(u_num);
            delay(TM);
          }
        }
        break;      
  }
}

次が,メモリーをシフトする部分のスケッチです。

/**************************************************************
*void v_shift_T(int u_num,x)
*
****************************************************************/
void v_shift_T(int u_num,int x){
  unsigned char buff=0;
  unsigned char buff1=0;
 
 switch (x){
    case 8:
       for(int n=8;n>1;n--){
        buff=dot_hoji[u_num][n-1] & 0b11100000;
        buff1=dot_hoji[u_num][n] & 0b00011111;
        dot_hoji[u_num][n]=buff | buff1;
      }
      break;
    case 7:
      for(int n=8;n>1;n--){
        buff=dot_hoji[u_num][n-1] & 0b01110000;
        buff1=dot_hoji[u_num][n] & 0b10001111;
        dot_hoji[u_num][n]=buff | buff1;
      }
      break;    
    case 6:
      for(int n=8;n>1;n--){
        buff=dot_hoji[u_num][n-1] & 0b00111000;
        buff1=dot_hoji[u_num][n] & 0b11000111;
        dot_hoji[u_num][n]=buff | buff1;
      }
      break;
    case 5:
      for(int n=8;n>1;n--){
        buff=dot_hoji[u_num][n-1] & 0b00011100;
        buff1=dot_hoji[u_num][n] & 0b11100011;
        dot_hoji[u_num][n]=buff | buff1;
      }
      break;
    case 4:
      for(int n=8;n>1;n--){
        buff=dot_hoji[u_num][n-1] & 0b00001110;
        buff1=dot_hoji[u_num][n] & 0b11110001;
        dot_hoji[u_num][n]=buff | buff1;
      }
      break;
    case 3:
        for(int n=8;n>1;n--){
          buff=dot_hoji[u_num][n-1] & 0b00000111;
          buff1=dot_hoji[u_num][n] & 0b11111000;
          dot_hoji[u_num][n]=buff | buff1;
        }
        break;
    case 2:
        if(u_num>1){


          for(int n=8;n>1;n--){
            buff=dot_hoji[u_num][n-1] & 0b00000011;
            buff1=dot_hoji[u_num][n] & 0b11111100;
            dot_hoji[u_num][n]=buff | buff1;


            buff=0;
            buff1=0;


            buff=dot_hoji[u_num-1][n-1] & 0b10000000;          
            buff1=dot_hoji[u_num-1][n] & 0b01111111;
            dot_hoji[u_num-1][n]=buff | buff1;
          }
        }
        else{
          for(int n=8;n>1;n--){
            buff=dot_hoji[u_num][n-1] & 0b00000011;
            buff1=dot_hoji[u_num][n] & 0b11111100;
            dot_hoji[u_num][n]=buff | buff1;
          }
        }
        break;
    case 1:
      if(u_num>1){
          for(int n=8;n>1;n--){
            buff=dot_hoji[u_num][n-1] & 0b00000001;
            buff1=dot_hoji[u_num][n] & 0b11111110;
            dot_hoji[u_num][n]=buff | buff1;


            buff=dot_hoji[u_num-1][n-1] & 0b11000000;          
            buff1=dot_hoji[u_num-1][n] & 0b00111111;
            dot_hoji[u_num-1][n]=buff | buff1;
          }
        }
        else{
          for(int n=8;n>1;n--){
            buff=dot_hoji[u_num][n-1] & 0b00000001;
            buff1=dot_hoji[u_num][n] & 0b11111110;
            dot_hoji[u_num][n]=buff | buff1;
          }
        }
      break;            
  }
}

かなり頭を悩ませましたが,やっとできて,ほっとしてます。こうやって,ああでもないこうでもないとあれ
これ考えることはとってもいいぼけ防止になってるるかなと思います。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA