Вот мой код (можно было и лучше написать, но мне лень). Для работы с русскими буквами надо перевести терминал в кодировку Win1251.
► Показать
Код: Выделить всё
#define PC0_DD1_A0 0
#define PC1_DD1_A1 1
#define PC2_DD1_A2 2
#define PC3_DD2_A0 3
#define PC4_DD2_A1 4
#define PC5_DD2_A2 5
#define D4_OUTDIS 4 // 1 - выход отключен
#define D8_UPREG 8 // 0 - верхний регистр (L-O)
#define D9_INMOTION 9 // 0 - рычаг или каретка в движении (L-N,S)
#define D10_EOL 10 // 0 - конец строки (L-M)
#define D11_COLOR 12 // 0 - черная лента (L-R)
#define SIZE_ROW 5
#define SIZE_COL 46
// {'!', 147, '#', '&', '%', '&', 146, '(', ')', '*', '+', ',', '-', '.', '?', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '[', '|', ']', 172, '_'},
// {'1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '/', 'а', 'б', 'ц', 'д', 'е', 'ф', 'г', 'х', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'я', 'р', 'с', 'т', 'у', 'ж', 'в', 'ь', 'ы', 'з', 'ш', 'э', 'щ', 'ч', 'ю'},
// {'!', 147, '#', '&', '%', '&', 146, '(', ')', '*', '+', ',', '-', '.', '?', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '|', ']', 172, '_'},
// {'1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '/', 'а', 'б', 'ц', 'д', 'е', 'ф', 'г', 'х', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'я', 'р', 'с', 'т', 'у', 'ж', 'в', 'ь', 'ы', 'з', 'ш', 'э', 'щ', 'ч', 'ю'},
// {B010001, B010010, B010011, B010100, B010101, B010110, B010111, B011000, B011001, B011010, B011011, B011100, B011101, B011110, B011111, B100001, B100010, B100011, B100100, B100101, B100011, B100111, B101000, B101001, B101010, B101011, B101100, B101101, B101110, B101111, B110000, B110001, B110010, B110011, B110100, B110101, B110110, B110111, B111000, B111001, B111010, B111011, B111100, B111101, B111110, B111111},
const unsigned char convert [SIZE_ROW][SIZE_COL] = {
{'!', 147, '#', '&', '%', '&', 146, '(', ')', '*', '+', ',', '-', '.', '?', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '[', '|', ']', 172, '_'},
{'1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '/', 224, 225, 246, 228, 229, 244, 227, 245, 232, 233, 234, 235, 236, 237, 238, 239, 255, 240, 241, 242, 243, 230, 226, 252, 251, 231, 248, 253, 249, 247, 254},
{'!', 147, '#', '&', '%', '&', 146, '(', ')', '*', '+', ',', '-', '.', '?', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '|', ']', 172, '_'},
{'1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '/', 192, 193, 214, 196, 197, 212, 195, 213, 200, 201, 202, 203, 204, 205, 206, 207, 223, 208, 209, 210, 211, 198, 194, 220, 219, 199, 216, 221, 217, 215, 222},
{B010001, B010010, B010011, B010100, B010101, B010110, B010111, B011000, B011001, B011010, B011011, B011100, B011101, B011110, B011111, B100001, B100010, B100011, B100100, B100101, B100011, B100111, B101000, B101001, B101010, B101011, B101100, B101101, B101110, B101111, B110000, B110001, B110010, B110011, B110100, B110101, B110110, B110111, B111000, B111001, B111010, B111011, B111100, B111101, B111110, B111111},
};
void setup() {
pinMode(D4_OUTDIS, OUTPUT);
digitalWrite(D4_OUTDIS, true);
DDRC = DDRC | B00111111;
PORTC = 0;
pinMode(D8_UPREG, INPUT);
pinMode(D9_INMOTION, INPUT);
pinMode(D10_EOL, INPUT);
pinMode(D11_COLOR, INPUT);
Serial.begin(9600);
}
void send_symbol (unsigned char data_char) {
while (digitalRead(D9_INMOTION) == 0) {};
while (digitalRead(D10_EOL) == 0) {};
PORTC = data_char;
digitalWrite(D4_OUTDIS, false);
delay(40);
digitalWrite(D4_OUTDIS, true);
PORTC = 0;
delay (80);
while (digitalRead(D9_INMOTION) == 0) {};
while (digitalRead(D10_EOL) == 0) {};
delay (10);
}
boolean service_moves (unsigned char symbol) {
switch (symbol) {
case 13: send_symbol(B000010); return false; // перевод строки
case 32: send_symbol(B010000); return false; // пробел
case 127: send_symbol(B000000); return false; // забой
case 17: send_symbol(B001010); delay(100); return false; // DC1 черная лента
case 18: send_symbol(B001001); delay(100); return false; // DC2 красная лента
default: return true;
}
}
void print_char (unsigned char symbol) {
unsigned char i, j, code;
bool lowercase_set, lowercase_get;
lowercase_set = 0;
for (i = 0; i < SIZE_ROW - 1; i++) {
for (j = 0; j < SIZE_COL; j++){
//Serial.println(convert[i][j]);
if (symbol == convert[i][j]) {
if ((i == 0) || (i == 2)) lowercase_set = 1; // 1 - нижний регистр
code = convert[4][j];
//Serial.println(code);
//Serial.println(lowercase_set);
goto quit;
}
}
}
return;
quit:
Serial.println(code);
lowercase_get = digitalRead(D8_UPREG); // 1 - нижний регистр (L-O)
if (!(lowercase_get == lowercase_set)) {
if ((lowercase_get == 1) && (lowercase_set == 0)) {send_symbol(B000110);} else {send_symbol(B000111);}
delay (40);
while (!(digitalRead(D8_UPREG) == lowercase_set));
delay (10);
}
send_symbol(code);
}
void loop() {
unsigned char a;
while (!Serial.available());
a = Serial.read();
if (service_moves(a)) print_char(a);
}