#1 Програмування Arduino » Контроллер ЖК 10 знакомест 7сегментов+точка + ещё знаки NJU6432BF. » 2017-04-05 09:57:58

MAI
відповідей: 0

Здравствуйте!
Прошу помощи, может кто ради "тренировки" возможно для кого то это вообще плёвое дело, подскажет что и как сделать.

Предистория.От кассового аппарата достались ЖК экранчики.
Соответствие сегментов и знакомест, и протокол передачи инфы на экран победил с помощью форумов.
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++;
}
}


У кого какие будут соображения?
Прошу подсказки, наставления.

Підвал форуму