Ви не увійшли.
Сторінки 1
Здравствуйте!
Прошу помощи, может кто ради "тренировки" возможно для кого то это вообще плёвое дело, подскажет что и как сделать.
Предистория.От кассового аппарата достались ЖК экранчики.
Соответствие сегментов и знакомест, и протокол передачи инфы на экран победил с помощью форумов.
1 Соответствие сегментов и и знаков конкретно экранчика что у меня на руках.
0 0 0 D0 7
1 0 H0 6
2 0 E0 5
3 0 C0 4
4 0 F0 3
5 0 A0 2
6 0 G0 1
7 0 B0 0
8 0 1 D1 7
9 0 H1 6
10 0 E1 5
11 0 C1 4
12 0 F1 3
13 0 A1 2
14 0 G1 1
15 0 B1 0
16 0 2 D2 7
17 0 H2 6
18 0 E2 5
19 0 C2 4
20 0 F2 3
21 0 A2 2
22 0 G2 1
23 0 B2 0
24 0 3 D3 7
25 0 H3 6
26 0 E3 5
27 0 C3 4
28 0 F3 3
29 0 A3 2
30 0 G3 1
31 0 B3 0
32 0 4 D4 7
33 0 H4 6
34 0 E4 5
35 0 C4 4
36 0 F4 3
37 0 A4 2
38 0 G4 1
39 0 B4 0
40 0 5 D5 7
41 0 H5 6
42 0 E5 5
43 0 C5 4
44 0 F5 3
45 0 A5 2
46 0 G5 1
47 0 B5 0
48 0 6 D6 7
49 0 H6 6
50 0 E6 5
51 0 C6 4
52 0 3
53 0 2
54 0 1
55 0 0
56 0 7 F6 7
57 0 A6 6
58 0 G6 5
59 0 B6 4
60 0 D7 3
61 0 H7 2
62 0 E7 1
63 0 C7 0
64 0 8 F7 7
65 0 A7 6
66 0 G7 5
67 0 B7 4
68 0 D8 3
69 0 H8 2
70 0 E8 1
71 0 C8 0
72 0 9 F8 7
73 0 A8 6
74 0 G8 5
75 0 B8 4
76 0 D9 3
77 0 H9 2
78 0 E9 1
79 0 C9 0
80 0 10 F9 7
81 0 A9 6
82 0 G9 5
83 0 B9 4
84 0 ENTER 3
85 0 "-"znak 2
86 0 [-] 1
87 0 [+] 0
88 0 11 [/] 7
89 0 [*] 6
90 0 [P] 5
91 0 [=] 4
92 0 [X] 3
93 0 [Z] 2
94 0 [ECR] 1
95 0 [R] 0
96 0 12 M 7
97 0 STL 6
98 0 4BAT 1/4 5
99 0 BAT 0 4
100 0 3BAT1/4 3
101 0 2
102 0 2BAT1/4 1
103 0 0
104 0 13 1BAT1/4 7
105 0 6
106 0 5
107 0 4
108 0 3
109 0 2
110 0 1
111 1 0
2 Вот рабочий скетч
#define INH 6//Закрепление выводов
#define CE 5//за сигналами управления
#define SCL 2//экраном
#define DN 4
//Объявление массива для записи изображения на экран
byte buf[13];
String in_line;
//Кодирование изображения цифр(знаков) именами сегментов
//
const unsigned char
dig[10][7] =
{
{'a', 'b', 'c', 'd', 'e', 'f'}, //Цифра0
{'b', 'c'}, //Цифра1
{'a', 'b', 'd', 'e', 'g'}, //Цифра2
{'a', 'b', 'c', 'd', 'g'}, //Цифра3
{'b', 'c', 'f', 'g'}, //Цифра4
{'a', 'c', 'd', 'f', 'g'}, //Цифра5
{'a', 'c', 'd', 'e', 'f', 'g'},//Цифра6
{'a', 'b', 'c'}, //Цифра7
{'a', 'b', 'c', 'd', 'e', 'f', 'g'}, //Цифра8
{'a', 'b', 'c', 'd', 'f', 'g'}, //Цифра9
};
//Номера бит которые должны быть равны 1
//для отображения нужного сегмента в нужном знакоместе
const byte sega[] = {5, 13, 21, 29, 37, 45, 57, 65, 73, 81};
const byte segb[] = {7, 15, 23, 31, 39, 47, 59, 67, 75, 83};
const byte segc[] = {3, 11, 19, 27, 35, 43, 51, 63, 71, 79};
const byte segd[] = {0, 8, 16, 24, 32, 40, 48, 60, 68, 76};
const byte sege[] = {2, 10, 18, 26, 34, 42, 50, 62, 70, 78};
const byte segf[] = {4, 12, 20, 28, 36, 44, 56, 64, 72, 80};
const byte segg[] = {6, 14, 22, 30, 38, 46, 58, 66, 74, 82};
const byte segh[] = {1, 9, 17, 25, 33, 41, 49, 61, 69, 77};
const byte bat[] = {99, 104, 102, 100, 98};
void setup()
{
Serial.begin(9600);
pinMode(CE, OUTPUT);
pinMode(SCL, OUTPUT);
pinMode(DN, OUTPUT);
pinMode(INH, OUTPUT);
CLS();
OUTSCR();
}
void loop()
{
while (!Serial.available())
{
}
in_line = Serial.readString();
CLS();
SSL(in_line);
Serial.flush();
}
void SSL(String thisline)
{
byte pos = 0;
byte inlong = thisline.length() - 1;
for (int i = inlong; i > -1; i--)
{
switch (thisline[i])
{
case'a': BS(bat[0]); break;
case'b': BS(bat[1]); break;
case'c': BS(bat[2]); break;
case'd': BS(bat[3]); break;
case'e': BS(bat[4]); break;
case' ': pos++; break;
case'-': BS(segg[pos]); pos++; break;
case'.': BS(segh[pos]); break;
case'0': SAVCIF(pos, 0); pos++; break;
case'1': SAVCIF(pos, 1); pos++; break;
case'2': SAVCIF(pos, 2); pos++; break;
case'3': SAVCIF(pos, 3); pos++; break;
case'4': SAVCIF(pos, 4); pos++; break;
case'5': SAVCIF(pos, 5); pos++; break;
case'6': SAVCIF(pos, 6); pos++; break;
case'7': SAVCIF(pos, 7); pos++; break;
case'8': SAVCIF(pos, 8); pos++; break;
case'9': SAVCIF(pos, 9); pos++; break;
}
}
OUTSCR();
}
//=============Подпрограмма очистки buf=================
//
void CLS(void)
{
register byte internalCounter;
for (internalCounter = 0; internalCounter < 13; internalCounter++)
{
buf[internalCounter] = 0;
}
buf[internalCounter] = 1;
}
//
//=================================================================
//==Подпрограмма записи еденицы сегмента(знака) в массив экрана ==
//
void BS(byte hbit)
{
byte this_byte = hbit / 8;
byte this_bit = 7 - hbit % 8;
bitSet(buf[this_byte], this_bit);
}
//
//================================================================
//=======Подпрограмма отправки изображения на экран==============
//
void OUTSCR(void)
{
digitalWrite(CE, HIGH);
for (register byte i = 0; i < 14; i++)
{
shiftOut(DN, SCL, MSBFIRST, buf[i]);
}
digitalWrite(CE, LOW);
digitalWrite(INH, HIGH);
}
//=================================================================
//=======Подпрограмма записи изображения цифры в массив экрана========
//
//
void SAVCIF(byte pozicia, byte znak)
{
byte counter = 0;
while (dig[znak][counter] != 0)
{
switch (dig[znak][counter])
{
case 'a': BS(sega[pozicia]); break;
case 'b': BS(segb[pozicia]); break;
case 'c': BS(segc[pozicia]); break;
case 'd': BS(segd[pozicia]); break;
case 'e': BS(sege[pozicia]); break;
case 'f': BS(segf[pozicia]); break;
case 'g': BS(segg[pozicia]); break;
}
counter++;
}
}
//
//=====================================================================
Код громоздкий, и медленный как помоему.
Может будут советы по оптимизации.
А когда делаю из скетча библиотеку, вообще кошмар.....
Вываливается куча ошибок.
На примеры типа "КОДА МОРЗЕ" не отправлять!!!!
Тому кто этот пример писал надо "руки поодбивать" .
Смотрел другие чужие библиотеки они устроены немного не так как пишется в примере.
файл .h
#ifndef mylcd
#define mylcd
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
class screen
{
public:
SET(int pinINH,int pinCE,int pinSCL,int pinDN);
void CLS();
void SSL();
int pinINH,pinCE,pinSCL,pinDN;
String in_line;
private:
void OUTSCR();
};
#endif
файл .cpp
#include "mylcd.h"
//Номера бит которые должны быть равны 1
//для отображения нужного сегмента в нужном знакоместе
const byte sega[] = {5, 13, 21, 29, 37, 45, 57, 65, 73, 81};
const byte segb[] = {7, 15, 23, 31, 39, 47, 59, 67, 75, 83};
const byte segc[] = {3, 11, 19, 27, 35, 43, 51, 63, 71, 79};
const byte segd[] = {0, 8, 16, 24, 32, 40, 48, 60, 68, 76};
const byte sege[] = {2, 10, 18, 26, 34, 42, 50, 62, 70, 78};
const byte segf[] = {4, 12, 20, 28, 36, 44, 56, 64, 72, 80};
const byte segg[] = {6, 14, 22, 30, 38, 46, 58, 66, 74, 82};
const byte segh[] = {1, 9, 17, 25, 33, 41, 49, 61, 69, 77};
const byte bat[] = {99, 104, 102, 100, 98};
//Кодирование изображения цифр(знаков) именами сегментов
const unsigned char
dig[10][7] =
{
{'a', 'b', 'c', 'd', 'e', 'f'}, //Цифра0
{'b', 'c'}, //Цифра1
{'a', 'b', 'd', 'e', 'g'}, //Цифра2
{'a', 'b', 'c', 'd', 'g'}, //Цифра3
{'b', 'c', 'f', 'g'}, //Цифра4
{'a', 'c', 'd', 'f', 'g'}, //Цифра5
{'a', 'c', 'd', 'e', 'f', 'g'},//Цифра6
{'a', 'b', 'c'}, //Цифра7
{'a', 'b', 'c', 'd', 'e', 'f', 'g'}, //Цифра8
{'a', 'b', 'c', 'd', 'f', 'g'}, //Цифра9
};
//Объявление массива для записи изображения на экран
byte buf[13];
int INH,CE,SCL,DN;
//String in_line;
screen::SET( INH, CE, SCL, DN)
{
INH=pinINH;
CE=pinCE;
SCL=pinSCL;
DN=pinDN;
pinMode(CE, OUTPUT);
pinMode(SCL, OUTPUT);
pinMode(DN, OUTPUT);
pinMode(INH, OUTPUT);
CLS();
OUTSCR();
}
screen::SSL(String pline)
{
pline=in_line;
byte pos = 0;
byte inlong = String pline.length() - 1;
for (int i = inlong; i > -1; i--)
{
switch (pline[i])
{
case'a': BS(bat[0]); break;
case'b': BS(bat[1]); break;
case'c': BS(bat[2]); break;
case'd': BS(bat[3]); break;
case'e': BS(bat[4]); break;
case' ': pos++; break;
case'-': BS(segg[pos]); pos++; break;
case'.': BS(segh[pos]); break;
case'0': SAVCIF(pos, 0); pos++; break;
case'1': SAVCIF(pos, 1); pos++; break;
case'2': SAVCIF(pos, 2); pos++; break;
case'3': SAVCIF(pos, 3); pos++; break;
case'4': SAVCIF(pos, 4); pos++; break;
case'5': SAVCIF(pos, 5); pos++; break;
case'6': SAVCIF(pos, 6); pos++; break;
case'7': SAVCIF(pos, 7); pos++; break;
case'8': SAVCIF(pos, 8); pos++; break;
case'9': SAVCIF(pos, 9); pos++; break;
}
}
OUTSCR();
}
//=============Подпрограмма очистки buf=================
//
void screen::CLS()
{
register byte internalCounter;
for (internalCounter = 0; internalCounter < 13; internalCounter++)
{
buf[internalCounter] = 0;
}
buf[internalCounter] = 1;
}
//
//=================================================================
//==Подпрограмма записи еденицы сегмента(знака) в массив экрана ==
//
void BS(byte hbit)
{
byte this_byte = hbit / 8;
byte this_bit = 7 - hbit % 8;
bitSet(buf[this_byte], this_bit);
}
//
//================================================================
//=======Подпрограмма отправки изображения на экран==============
//
void OUTSCR(void)
{
digitalWrite(CE, HIGH);
for (register byte i = 0; i < 14; i++)
{
shiftOut(DN, SCL, MSBFIRST, buf[i]);
}
digitalWrite(CE, LOW);
digitalWrite(INH, HIGH);
}
//=================================================================
//=======Подпрограмма записи изображения цифры в массив экрана========
//
//
void SAVCIF(byte pozicia, byte znak)
{
byte counter = 0;
while (dig[znak][counter] != 0)
{
switch (dig[znak][counter])
{
case 'a': BS(sega[pozicia]); break;
case 'b': BS(segb[pozicia]); break;
case 'c': BS(segc[pozicia]); break;
case 'd': BS(segd[pozicia]); break;
case 'e': BS(sege[pozicia]); break;
case 'f': BS(segf[pozicia]); break;
case 'g': BS(segg[pozicia]); break;
}
counter++;
}
}
У кого какие будут соображения?
Прошу подсказки, наставления.
Сторінки 1