/************************************************************** RTTY DECODER (with 16seg LEDs) v1.0 2015.06.10 5BIT-BAUDOT-CODE, 45.45BAUD /**************************************************************/ #include <TimerOne.h> #include <FlexiTimer2.h> boolean dsp; int i; byte ti; uint8_t baudot; //-- -a,b,c,d,e,f,g,h,k,m,n,p,r,s,t,u,v- const byte font_A[] = {0,0,1,1,0,0,0,0,0,0,1,1,0,0,1,0,0}; const byte font_B[] = {1,1,1,1,1,1,0,0,0,1,0,1,0,1,0,0,0}; const byte font_C[] = {1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0}; const byte font_D[] = {1,1,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0}; const byte font_E[] = {1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0}; const byte font_F[] = {1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0}; const byte font_G[] = {1,1,0,1,1,1,1,1,0,0,0,1,0,0,0,0,0}; const byte font_H[] = {0,0,1,1,0,0,1,1,0,0,0,1,0,0,0,1,0}; const byte font_I[] = {1,1,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0}; const byte font_J[] = {0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0}; const byte font_K[] = {0,0,0,0,0,0,1,1,0,0,1,0,1,0,0,1,0}; const byte font_L[] = {0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0}; const byte font_M[] = {0,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0}; const byte font_N[] = {0,0,1,1,0,0,1,1,1,0,0,0,1,0,0,0,0}; const byte font_O[] = {1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0}; const byte font_P[] = {1,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,0}; const byte font_Q[] = {1,1,1,1,1,1,1,1,0,0,0,0,1,0,0,0,0}; const byte font_R[] = {1,1,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0}; const byte font_S[] = {1,1,0,1,1,1,0,0,1,0,0,1,0,0,0,0,0}; const byte font_T[] = {1,1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0}; const byte font_U[] = {0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0}; const byte font_V[] = {0,0,0,0,0,0,1,1,0,0,1,0,0,0,1,0,0}; const byte font_W[] = {0,0,1,1,0,0,1,1,0,0,0,0,1,0,1,0,0}; const byte font_X[] = {0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,0}; const byte font_Y[] = {0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0}; const byte font_Z[] = {1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0}; //-- -a,b,c,d,e,f,g,h,k,m,n,p,r,s,t,u,v- const byte font_0[] = {1,1,1,1,1,1,1,1,0,0,1,0,0,0,1,0,0}; const byte font_1[] = {0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0}; const byte font_2[] = {1,1,1,0,1,1,1,0,0,0,0,1,0,0,0,1,0}; const byte font_3[] = {1,1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0}; const byte font_4[] = {0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,1,0}; const byte font_5[] = {1,1,0,1,1,1,0,1,0,0,0,1,0,0,0,1,0}; const byte font_6[] = {1,1,0,1,1,1,1,1,0,0,0,1,0,0,0,1,0}; const byte font_7[] = {1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0}; const byte font_8[] = {1,1,1,1,1,1,1,1,0,0,0,1,0,0,0,1,0}; const byte font_9[] = {1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,1,0}; //-- -a,b,c,d,e,f,g,h,k,m,n,p,r,s,t,u,v- const byte font_Min[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0}; const byte font_Slu[] = {0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0}; const byte font_Per[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}; const byte font_Que[] = {1,1,1,0,0,0,0,1,0,0,0,1,0,1,0,0,1}; const byte font_Col[] = {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0}; byte dgBuf7[18]; byte dgBuf6[18]; byte dgBuf5[18]; byte dgBuf4[18]; byte dgBuf3[18]; byte dgBuf2[18]; byte dgBuf1[18]; void timer1_interrupt(void) { volatile static byte dg = 14; switch(dg) { case 14: digitalWrite(20, 1); for(i=22; i<39; i++) { digitalWrite(i, dgBuf7[i - 22]); } digitalWrite(14, 0); break; case 15: digitalWrite(14, 1); for(i=22; i<39; i++) { digitalWrite(i, dgBuf6[i - 22]); } digitalWrite(15, 0); break; case 16: digitalWrite(15, 1); for(i=22; i<39; i++) { digitalWrite(i, dgBuf5[i - 22]); } digitalWrite(16, 0); break; case 17: digitalWrite(16, 1); for(i=22; i<39; i++) { digitalWrite(i, dgBuf4[i - 22]); } digitalWrite(17, 0); break; case 18: digitalWrite(17, 1); for(i=22; i<39; i++) { digitalWrite(i, dgBuf3[i - 22]); } digitalWrite(18, 0); break; case 19: digitalWrite(18, 1); for(i=22; i<39; i++) { digitalWrite(i, dgBuf2[i - 22]); } digitalWrite(19, 0); break; case 20: digitalWrite(19, 1); for(i=22; i<39; i++) { digitalWrite(i, dgBuf1[i - 22]); } digitalWrite(20, 0); break; } dg++; if(dg == 21) { dg = 14; } } void timer2_interrupt(void) { static byte rSq; ti++; if(rSq == 0 && digitalRead(53) == 0) { rSq = 1; ti = 0; } if(rSq == 1 && ti == 10) { if(digitalRead(53) == 0) { rSq = 2; ti = 0; } else { rSq = 0; } } if(rSq == 2 && ti == 22) { bitWrite(baudot, 0, digitalRead(53)); } if(rSq == 2 && ti == 44) { bitWrite(baudot, 1, digitalRead(53)); } if(rSq == 2 && ti == 66) { bitWrite(baudot, 2, digitalRead(53)); } if(rSq == 2 && ti == 88) { bitWrite(baudot, 3, digitalRead(53)); } if(rSq == 2 && ti == 110) { bitWrite(baudot, 4, digitalRead(53)); dsp = 1; } if(rSq == 2 && ti == 135) { rSq = 0; } } void setup() { Timer1.initialize(); Timer1.attachInterrupt(timer1_interrupt, 2300); FlexiTimer2::set(1, timer2_interrupt); FlexiTimer2::start(); for(i=14; i<21; i++)//14-20,7digit { pinMode(i, OUTPUT); } for(i=22; i<39; i++)//22-38,17segment { pinMode(i, OUTPUT); } for(i=14; i<21; i++)//all OFF at first { digitalWrite(i, 1); } for(i=22; i<39; i++)//all OFF at first { digitalWrite(i, 0); } } void led_Print(char ch) { if(ch >= 97 && ch <= 122) //CONVERT LOWER CASE TO UPPER CASE { ch = ch - 32; } for(i=0; i<18; i++) { dgBuf7[i] = dgBuf6[i]; } for(i=0; i<18; i++) { dgBuf6[i] = dgBuf5[i]; } for(i=0; i<18; i++) { dgBuf5[i] = dgBuf4[i]; } for(i=0; i<18; i++) { dgBuf4[i] = dgBuf3[i]; } for(i=0; i<18; i++) { dgBuf3[i] = dgBuf2[i]; } for(i=0; i<18; i++) { dgBuf2[i] = dgBuf1[i]; } switch(ch) { case 'A': for(i=0; i<18; i++){dgBuf1[i] = font_A[i];} break; case 'B': for(i=0; i<18; i++){dgBuf1[i] = font_B[i];} break; case 'C': for(i=0; i<18; i++){dgBuf1[i] = font_C[i];} break; case 'D': for(i=0; i<18; i++){dgBuf1[i] = font_D[i];} break; case 'E': for(i=0; i<18; i++){dgBuf1[i] = font_E[i];} break; case 'F': for(i=0; i<18; i++){dgBuf1[i] = font_F[i];} break; case 'G': for(i=0; i<18; i++){dgBuf1[i] = font_G[i];} break; case 'H': for(i=0; i<18; i++){dgBuf1[i] = font_H[i];} break; case 'I': for(i=0; i<18; i++){dgBuf1[i] = font_I[i];} break; case 'J': for(i=0; i<18; i++){dgBuf1[i] = font_J[i];} break; case 'K': for(i=0; i<18; i++){dgBuf1[i] = font_K[i];} break; case 'L': for(i=0; i<18; i++){dgBuf1[i] = font_L[i];} break; case 'M': for(i=0; i<18; i++){dgBuf1[i] = font_M[i];} break; case 'N': for(i=0; i<18; i++){dgBuf1[i] = font_N[i];} break; case 'O': for(i=0; i<18; i++){dgBuf1[i] = font_O[i];} break; case 'P': for(i=0; i<18; i++){dgBuf1[i] = font_P[i];} break; case 'Q': for(i=0; i<18; i++){dgBuf1[i] = font_Q[i];} break; case 'R': for(i=0; i<18; i++){dgBuf1[i] = font_R[i];} break; case 'S': for(i=0; i<18; i++){dgBuf1[i] = font_S[i];} break; case 'T': for(i=0; i<18; i++){dgBuf1[i] = font_T[i];} break; case 'U': for(i=0; i<18; i++){dgBuf1[i] = font_U[i];} break; case 'V': for(i=0; i<18; i++){dgBuf1[i] = font_V[i];} break; case 'W': for(i=0; i<18; i++){dgBuf1[i] = font_W[i];} break; case 'X': for(i=0; i<18; i++){dgBuf1[i] = font_X[i];} break; case 'Y': for(i=0; i<18; i++){dgBuf1[i] = font_Y[i];} break; case 'Z': for(i=0; i<18; i++){dgBuf1[i] = font_Z[i];} break; case '0': for(i=0; i<18; i++){dgBuf1[i] = font_0[i];} break; case '1': for(i=0; i<18; i++){dgBuf1[i] = font_1[i];} break; case '2': for(i=0; i<18; i++){dgBuf1[i] = font_2[i];} break; case '3': for(i=0; i<18; i++){dgBuf1[i] = font_3[i];} break; case '4': for(i=0; i<18; i++){dgBuf1[i] = font_4[i];} break; case '5': for(i=0; i<18; i++){dgBuf1[i] = font_5[i];} break; case '6': for(i=0; i<18; i++){dgBuf1[i] = font_6[i];} break; case '7': for(i=0; i<18; i++){dgBuf1[i] = font_7[i];} break; case '8': for(i=0; i<18; i++){dgBuf1[i] = font_8[i];} break; case '9': for(i=0; i<18; i++){dgBuf1[i] = font_9[i];} break; case '-': for(i=0; i<18; i++){dgBuf1[i] = font_Min[i];} break; case '.': for(i=0; i<18; i++){dgBuf1[i] = font_Per[i];} break; case '/': for(i=0; i<18; i++){dgBuf1[i] = font_Slu[i];} break; case '?': for(i=0; i<18; i++){dgBuf1[i] = font_Que[i];} break; case ':': for(i=0; i<18; i++){dgBuf1[i] = font_Col[i];} break; default: for(i=0; i<18; i++){dgBuf1[i] = 0;} } } void loop() { static boolean fig; static char ch; if(dsp == 1) { ch = '\0'; if(baudot == B11111){fig = 0; } //LETTERS else if(baudot == B11011){fig = 1; } //FIGURES else if(baudot == B01000){ } //CR else if(baudot == B00010){ch = ' ';} //LF else if(baudot == B00100){ch = ' ';} //SPACE if(fig == 0) { if(baudot == B00011){ch = 'A';} else if(baudot == B11001){ch = 'B';} else if(baudot == B01110){ch = 'C';} else if(baudot == B01001){ch = 'D';} else if(baudot == B00001){ch = 'E';} else if(baudot == B01101){ch = 'F';} else if(baudot == B11010){ch = 'G';} else if(baudot == B10100){ch = 'H';} else if(baudot == B00110){ch = 'I';} else if(baudot == B01011){ch = 'J';} else if(baudot == B01111){ch = 'K';} else if(baudot == B10010){ch = 'L';} else if(baudot == B11100){ch = 'M';} else if(baudot == B01100){ch = 'N';} else if(baudot == B11000){ch = 'O';} else if(baudot == B10110){ch = 'P';} else if(baudot == B10111){ch = 'Q';} else if(baudot == B01010){ch = 'R';} else if(baudot == B00101){ch = 'S';} else if(baudot == B10000){ch = 'T';} else if(baudot == B00111){ch = 'U';} else if(baudot == B11110){ch = 'V';} else if(baudot == B10011){ch = 'W';} else if(baudot == B11101){ch = 'X';} else if(baudot == B10101){ch = 'Y';} else if(baudot == B10001){ch = 'Z';} } if(fig == 1) { if(baudot == B00011){ch = '-';} else if(baudot == B11001){ch = '?';} else if(baudot == B01110){ch = ':';} else if(baudot == B01001){ } else if(baudot == B00001){ch = '3';} else if(baudot == B01101){ } else if(baudot == B11010){ } else if(baudot == B10100){ } else if(baudot == B00110){ch = '8';} else if(baudot == B01011){ } else if(baudot == B01111){ch = '(';} else if(baudot == B10010){ch = ')';} else if(baudot == B11100){ch = '.';} else if(baudot == B01100){ch = ',';} else if(baudot == B11000){ch = '9';} else if(baudot == B10110){ch = '0';} else if(baudot == B10111){ch = '1';} else if(baudot == B01010){ch = '4';} else if(baudot == B00101){ } else if(baudot == B10000){ch = '5';} else if(baudot == B00111){ch = '7';} else if(baudot == B11110){ } else if(baudot == B10011){ch = '2';} else if(baudot == B11101){ch = '/';} else if(baudot == B10101){ch = '6';} else if(baudot == B10001){ } } if(ch != '\0') { led_Print(ch); } dsp = 0; } delay(2); }