/* ----------------------- CW DECODER Program 2015.1.23 JH7UBC ----------------------- */ #include LiquidCrystal lcd(12,11,5,4,3,2);//LCD接続ピン rs,enable,d4,d5,d6,d7 const int colums=16;//LCD桁数 const int rows=2;//LCD行数 int SignalPin=0;//信号入力ピン番号 byte Mcode=1;//モールス符号内部コード long startLOW;//LOW状態が始まった時刻 long startHIGH;//HIGH状態が始まった時刻 long LOWtime;//LOW状態が続いた時間(ms) long HIGHtime;//HIGH状態が続いた時間(ms) long nosignaltime;//無信号(HIGH状態)が続いた時間 int state=HIGH;//入力ピンの状態(初期値HIGH) int statebefore=HIGH;//入力ピンの前の状態(初期値HIGH) byte data;//dot(短点)のときdata=0,dash(長点)のときdata=1 byte bitcount=0;//入力bit数 long time;//無信号時の経過時間(ms) boolean space=false;//spaceを送出するかどうかのflag boolean wabun=false;//和文モードflag int dottime=100;//短点と長点を分ける時間(ms)の初期値 int Ltime=100;//dot(LOWtime)の一時記憶,初期値100ms int lcdindex=0; int line1[colums];//LCD 1行目を記憶する配列 int line2[colums];//LCD 2行目を記憶する配列 void setup(){ pinMode(SignalPin,INPUT); // digitalWrite(SignalPin,HIGH);//0番地pull up lcd.begin(colums,rows);//LCDの桁数と行数をセット //line1とline2にspace(コード32)を書き込む for (int index=0;index < colums;index++){ line1[index]=32;//32=" " line2[index]=32; } lcd.print("CW Decorder Ver1"); } void loop(){ state=digitalRead(0);//入力ピンの状態を読む if (state==HIGH && statebefore==LOW){//信号がLOWからHIGHに変わったら startHIGH=millis();//HIGH状態が始まった時刻 LOWtime=millis() - startLOW;//LOW状態が続いた時間(信号があった時間)(ms) if (LOWtime < dottime){//基準時間(dottime)より短ければ data=0;//dot Ltime=LOWtime;//LOWtimeを記憶 }else{ data=1;//dash } bitcount++; Mcode=Mcode<<1; Mcode=Mcode | data; if (bitcount > 8){//8 bit 以上はerror Mcode=1; bitcount=0; } } if (state==LOW && statebefore==HIGH){ startLOW=millis(); } if (state==HIGH && statebefore==HIGH){ time = millis()- startHIGH; if(bitcount !=0){ if(time>(2 * Ltime)){ if (wabun == true){ decodewabun(); }else{ decode(); } Mcode=1; bitcount=0; space=true; } } if (space==true && time > 7*Ltime){ printascii(32); space=false; } } statebefore=state; } void decode(){ switch(Mcode){ case B00000101: printascii(65);//"A" break; case B00011000: printascii(66);//"B" break; case B00011010: printascii(67);//"C" break; case B00001100: printascii(68);//"D" break; case B00000010: printascii(69);//"E" break; case B00010010: printascii(70);//"F" break; case B00001110: printascii(71);//"G" break; case B00010000: printascii(72);//"H" break; case B00000100: printascii(73);//"I" break; case B00010111: printascii(74);//"J" break; case B00001101: printascii(75);//"K" break; case B00010100: printascii(76);//"L" break; case B00000111: printascii(77);//"M" break; case B00000110: printascii(78);//"N" break; case B00001111: printascii(79);//"O" break; case B00010110: printascii(80);//"P" break; case B00011101: printascii(81);//"Q" break; case B00001010: printascii(82);//"R" break; case B00001000: printascii(83);//"S" break; case B00000011: printascii(84);//"T" break; case B00001001: printascii(85);//"U" break; case B00010001: printascii(86);//"V" break; case B00001011: printascii(87);//"W" break; case B00011001: printascii(88);//"X" break; case B00011011: printascii(89);//"Y" break; case B00011100: printascii(90);//"Z" break; case B00101111: printascii(49);//"1" break; case B00100111: printascii(50);//"2" break; case B00100011: printascii(51);//"3" break; case B00100001: printascii(52);//"4" break; case B00100000: printascii(53);//"5" break; case B00110000: printascii(54);//"6" break; case B00111000: printascii(55);//"7" break; case B00111100: printascii(56);//"8" break; case B00111110: printascii(57);//"9" break; case B00111111: printascii(48);//"0" break; case B00110010: printascii(47);//"/" break; case B01001100: printascii(63);//"?" break; case B01110011: printascii(44);//"," break; case B01010101: printascii(46);//"." break; case B01011010: printascii(64);//"@" break; case B00110110: printascii(40);//"(" break; case B01101101: printascii(41);//")" break; case B00101010: printascii(91);//"[" printascii(65);//"A" printascii(82);//"R" printascii(93);//"]" break; case B01000101: printascii(91);//"[" printascii(86);//"V" printascii(65);//"A" printascii(93);//"]" break; case B00110001: printascii(91);//"[" printascii(66);//"B" printascii(84);//"T" printascii(93);//"]" break; case B01100111://"ホレ" wabun=true; printascii(60);//"<" break; default: printascii(42);//"*" } } void decodewabun(){ switch(Mcode){ case B00010111: printascii(166);//"ヲ" break; case B00101101: printascii(176);//"-" break; case B00111011: printascii(177);//"ア" break; case B00000101: printascii(178);//"イ" break; case B00001001: printascii(179);//"ウ" break; case B00110111: printascii(180);//"エ" break; case B00101000: printascii(181);//"オ" break; case B00010100: printascii(182);//"カ" break; case B00110100: printascii(183);//"キ" break; case B00010001: printascii(184);//"ク" break; case B00011011: printascii(185);//"ケ" break; case B00011111: printascii(186);//"コ" break; case B00110101: printascii(187);//"サ" break; case B00111010: printascii(188);//"シ" break; case B00111101: printascii(189);//"ス" break; case B00101110: printascii(190);//"セ" break; case B00011110: printascii(191);//"ソ" break; case B00000110: printascii(192);//"タ" break; case B00010010: printascii(193);//"チ" break; case B00010110: printascii(194);//"ツ" break; case B00101011: printascii(195);//"テ" break; case B00100100: printascii(196);//"ト" break; case B00001010: printascii(197);//"ナ" break; case B00011010: printascii(198);//"ニ" break; case B00010000: printascii(199);//"ヌ" break; case B00011101: printascii(200);//"ネ" break; case B00010011: printascii(201);//"ノ" break; case B00011000: printascii(202);//"ハ" break; case B00111001: printascii(203);//"ヒ" break; case B00011100: printascii(204);//"フ" break; case B00000010: printascii(205);//"ヘ" break; case B00001100: printascii(206);//"ホ" break; case B00011001: printascii(207);//"マ" break; case B00100101: printascii(208);//"ミ" break; case B00000011: printascii(209);//"ム" break; case B00110001: printascii(210);//"メ" break; case B00110010: printascii(211);//"モ" break; case B00001011: printascii(212);//"ヤ" break; case B00110011: printascii(213);//"ユ" break; case B00000111: printascii(214);//"ヨ" break; case B00001000: printascii(215);//"ラ" break; case B00001110: printascii(216);//"リ" break; case B00110110: printascii(217);//"ル" break; case B00001111: printascii(218);//"レ" break; case B00010101: printascii(219);//"ロ" break; case B00001101: printascii(220);//"ワ" break; case B00101010: printascii(221);//"ン" break; case B00000100: printascii(222);//"゙" break; case B00100110: printascii(223);//"゚" break; case B00101111: printascii(49);//"1" break; case B00100111: printascii(50);//"2" break; case B00100011: printascii(51);//"3" break; case B00100001: printascii(52);//"4" break; case B00100000: printascii(53);//"5" break; case B00110000: printascii(54);//"6" break; case B00111000: printascii(55);//"7" break; case B00111100: printascii(56);//"8" break; case B00111110: printascii(57);//"9" break; case B00111111: printascii(48);//"0" break; case B01001100: printascii(63);//"?" break; case B01010101: printascii(46);//"." break; case B01110011: printascii(44);//"," break; case B01010100: printascii(163);//"」" break; case B00100010://"ラタ" wabun=false; printascii(62);//">" break; case B01101101: wabun=false; printascii(40);//"(" break; case B01010010: wabun=true; printascii(41);//")" break; default: printascii(42);//"*" } } void printascii(int asciinumber){ if (lcdindex > colums-1){ lcdindex=0; for (int i=0;i <= colums-1;i++){ lcd.setCursor(i,rows-2); lcd.write(line1[i]); lcd.setCursor(i,rows-1); lcd.write(32); } } line1[lcdindex]=asciinumber; lcd.setCursor(lcdindex,rows-1); lcd.write(asciinumber); lcdindex +=1; }