エレキジャックweb mbed入門 mbed CWデコーダ課題5です。数字とアルファベットを解読します。・-の長さを計測し、速度変化に自動追従します。デコーダ基板が必要です。

Dependencies:   mbed

main.cpp

Committer:
takeuchi
Date:
2012-07-15
Revision:
0:eb69dcfe8114

File content as of revision 0:eb69dcfe8114:

// CW05
// auto speed
#include "mbed.h"
#include "TextLCD0420.h"

#define ON 1
#define OFF 0
#define XON 0
#define XOFF 1
#define XHI 0
#define XLOW 1
#define HI 1
#define LOW 0
#define OUBUN 1
#define WABUN 0

DigitalOut mled1(LED1);
DigitalOut mled2(LED2);
DigitalOut mled3(LED3);
DigitalOut mled4(LED4);
DigitalIn CW(p5);
DigitalIn SP_SELECT(p6);
DigitalIn GENGO_MODE(p7);
DigitalIn GENGO_SELECT(p8);

TextLCD lcd(p24, p25, p26, p27, p28, p29, p30,20,4); // rs, rw, e, d0, d1, d2, d3

int retu,gyou;
char g2[20],g3[20];
int init_flag=ON;
int min_ms,max_ms;

void set_speed(){
  if(SP_SELECT==HI){
    min_ms=30;
    max_ms=90;
    lcd.locate(5,0);
    lcd.printf("H");
  }
  else if(SP_SELECT==LOW){
    min_ms=70;
    max_ms=210;
    lcd.locate(5,0);
    lcd.printf("L");
  }
}  

int main() {      
  
  int i,j,k;
  int code[20];
  int scount;
  char mj[115];
  int cw_sum,tan_sum,tanten;
  
  for(i=0;i<115;i++){
    mj[i]=' ';
  }
  mj[5]='A';mj[16]='B';mj[20]='C';mj[8]='D';mj[1]='E';
  mj[19]='F';mj[10]='G';mj[15]='H';mj[3]='I';mj[29]='J';
  mj[12]='K';mj[17]='L';mj[6]='M';mj[4]='N';mj[14]='O';
  mj[21]='P';mj[26]='Q';mj[9]='R';mj[7]='S';mj[2]='T';
  mj[11]='U';mj[23]='V';mj[13]='W';mj[24]='X';mj[28]='Y';
  mj[18]='Z';
  mj[61]='1';mj[59]='2';mj[55]='3';mj[47]='4';mj[31]='5';
  mj[32]='6';mj[34]='7';mj[38]='8';mj[46]='9';mj[62]='0';
  mj[105]='.';mj[114]=',';mj[75]='?';mj[48]='=';mj[96]='-';
  mj[70]=':';mj[93]='\'';mj[44]='(';mj[108]=')';mj[41]='+';
  mj[81]='"'; 
  
  lcd.cls();
  lcd.printf("*CW05 ");
  
  for(i=0;i<6;i++){
    code[i]=0;
  }

  i=0;
  tan_sum=0;
  set_speed();
  
  while( i<5 ){
    lcd.locate(7,0);
    lcd.printf("%2d",5-i);
    scount=0;
    while(CW==XLOW){
    }
    mled1=ON;
    while(CW==XHI){
      scount++;
      wait_ms(1);
    }
    mled1=OFF;
    if(min_ms < scount && scount < max_ms){
      tan_sum=tan_sum+scount;
      i++;
    }
    
  }  
  tanten=tan_sum/5;
  lcd.locate(0,1);
  lcd.printf("%3d ",tanten);    
  
  j=0;
  tan_sum=0;
  k=0;
  
  while(1){
        while(CW==XLOW){
        }
        
        scount=0;  
        mled1=ON;
        while(CW==XHI){
          wait_ms(1);
          scount++;
        }
        mled1=OFF;
        
        if(min_ms < scount && scount < max_ms){ 
          //lcd.printf(".");
          code[k]=1;
          k++;
          tan_sum=tan_sum+scount;
          j++;
        }

        else if ( scount > tanten*2.0){
          //lcd.printf("_");
          code[k]=2;
          k++;
          tan_sum=tan_sum+scount/3;
          j++;
        }        
                 
        scount=0;
        while(CW==XLOW){
          wait_ms(1);
          scount++;
          if(scount > tanten*10){
            break;
          }
        }
        
        if(k>=6){
          k=0;
          lcd.printf("*");
          for(i=0;i<6;i++){
            code[i]=0;
          }
        }
        
        if(scount > tanten*2.0){      
          cw_sum=0;
          for(i=0;i<6;i++){
              cw_sum=cw_sum+code[i]*int(pow(2.0,i));
          }
          lcd.printf("%c",mj[cw_sum]);
          k=0;
          for(i=0;i<6;i++){
            code[i]=0;
          }
        }//if
        
        if(scount > tanten*7){
          lcd.printf(" ");
        }
        
        if(j==10){
          tanten=tan_sum/10;
          tan_sum=0;
          j=0;
          lcd.printf("%3d ",tanten);
        }
  }//while 1
}//main