/**************************************************************** ASCII 8N2 50baud RTTY(R) v1.00 2016.12.01 /****************************************************************/ #include <LiquidCrystal.h> #include <FlexiTimer2.h> LiquidCrystal lcd(4,5,6,7,8,9,10); boolean dsp; boolean org; byte ti; int x; byte y; char ch; char c[33]; uint8_t ascii; void setup() { lcd.begin(16, 2); lcd.cursor(); lcd.setCursor(0, 0); FlexiTimer2::set(1, timer_interrupt); FlexiTimer2::start(); } void timer_interrupt(void) { static byte rSq; ti++; if(rSq == 0 && digitalRead(19) == 0) { rSq = 1; ti = 0; } if(rSq == 1 && ti == 10) { if(digitalRead(19) == 0) { rSq = 2; ti = 0; } else { rSq = 0; } } else if(rSq == 2 && ti == 20) { bitWrite(ascii, 0, digitalRead(19)); } else if(rSq == 2 && ti == 40) { bitWrite(ascii, 1, digitalRead(19)); } else if(rSq == 2 && ti == 60) { bitWrite(ascii, 2, digitalRead(19)); } else if(rSq == 2 && ti == 80) { bitWrite(ascii, 3, digitalRead(19)); } else if(rSq == 2 && ti == 100) { bitWrite(ascii, 4, digitalRead(19)); } else if(rSq == 2 && ti == 120) { bitWrite(ascii, 5, digitalRead(19)); } else if(rSq == 2 && ti == 140) { bitWrite(ascii, 6, digitalRead(19)); } else if(rSq == 2 && ti == 160) { bitWrite(ascii, 7, digitalRead(19)); dsp = 1; } if(rSq == 2 && ti == 190) { rSq = 0; } } //DISPLAYS CHARACTER void lcdOut() { int i; lcd.print(ch); c[16 * y + x] = ch; x++; if(x == 16 && y == 0) { x = 0; y = 1; } else if(x == 16 && y == 1) { for(i = 0; i < 16; i++) { c[i] = c[16 + i]; } for(i = 0; i < 16; i++) { c[16 + i] = '\0'; } lcd.clear(); lcd.noCursor(); for(i = 0; i < 16; i++) { lcd.print(c[i]); } lcd.cursor(); x = 0; y = 1; } lcd.setCursor(x, y); } //HANDLES BACKSPACE void lcdBs() { int i; if(x == 0 && y == 0) { org = true; } else { org = false; x--; if(x == -1 && y == 1) { x = 15; y = 0; while(c[x] == '\0') { x--; } lcd.noCursor(); lcd.setCursor(x, y); lcd.print(" "); lcd.setCursor(x, y); lcd.cursor(); c[x] = '\0'; } else { lcd.noCursor(); lcd.setCursor(x, y); lcd.print(" "); lcd.setCursor(x, y); lcd.cursor(); c[16 * y + x] = '\0'; } } } //HANDLES CRLF void lcdCrLf() { byte skip = (16 - x); int i; lcd.noCursor(); for(i = 0; i < skip; i++) { if(i == 0) { c[16 * y + x] = '\r'; } else { c[16 * y + x] = '\0'; } x++; } if(y == 0) { x = 0; y = 1; } else { for(i = 0; i < 16; i++) { c[i] = c[16 + i]; } for(i = 0; i < 16; i++) { c[16 + i] = '\0'; } lcd.clear(); for(i = 0; i < 16; i++) { if(c[i] == '\r' || c[i] == '\0') { lcd.print(' '); } else { lcd.print(c[i]); } } x = 0; y = 1; } lcd.setCursor(x, y); lcd.cursor(); } void loop() { if(dsp == 1) { ch = ascii; if(ch == '\r') { //SKIP } else if(ch == '\n') { lcdCrLf(); } else if(ch == '\b') { lcdBs(); } else { lcdOut(); } dsp = 0; } delay(5); }