#include <SPI.h>
#define LATCH_PIN PA0 // ST_CP
int a,b,c,d,e,f,g,dp = 0;
// Qa Qb Qc Qd Qe Qf Qg Qh
// Q7 Q6 Q5 Q4 Q3 Q2 Q1 Q0
int massive_sectors[] = { c, d, e, b, a, f, g, dp};
// Правильно получаем количество пинов
int pinCount = sizeof(massive_sectors) / sizeof(massive_sectors[0]);
/*
struct Segments {
uint8_t c : 1,
d : 1,
e : 1,
b : 1,
a : 1,
f : 1,
g : 1,
dp : 1;
};*/
// Структура для одного сегментиника (один разряд)
struct Segments {
uint8_t a,
b,
c,
d,
e,
f,
g,
dp;
};
Segments seg;
void UpdateArray();
void UserSendTo595(Segments* s);
int InvertCheckLamp();
void ShowNumber(int number);
#define TypeSend 1 // прямая запись байта (УЧИТЫВАЙ ПОРЯДОК т.е. сами задаем порядок в UserSendTo595 -> uint8_t data = (s->ВОТ ЭТО МЕНЯЕМ << 0) ....)
#define TypeSendMassive 0 // как двигаемся (Учитывай массив: прямой Q0-Q7 (order), обратный Q7-Q0(order_reverse))
// ЗДЕСЬ задаем подключение где Qx - это пины на 595
// Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7
uint8_t* order[] = { &seg.dp, &seg.g, &seg.f, &seg.a, &seg.b, &seg.e, &seg.d, &seg.c };
// Q7 Q6 Q5 Q4 Q3 Q2 Q1 Q0
uint8_t* order_reverse[] = { &seg.c, &seg.d, &seg.e, &seg.b, &seg.a, &seg.f, &seg.g, &seg.dp };
/*
*/
void UserSendTo595(Segments* s) {
#if TypeSend == 0 // значит прямой порядок ЗАДАЕМ ЗДЕСЬ!
uint8_t data = (s->dp << 0) | (s->g << 1) | (s->f << 2) | (s->a << 3) |
(s->b << 4) | (s->e << 5) | (s->d << 6) | (s->c << 7);
#else // значит порядок УЖЕ задали в массиве
uint8_t data = 0;
#if TypeSendMassive == 1 // Порядок Q0-Q7
for (int i = 0; i < 8; i++) {
if (*order[i]) {
data |= (1 << i);
}
}
#else // Порядок Q7-Q0
for (int i = 0; i < 8; i++) {
if (*order_reverse[i]) {
data |= (1 << (7 - i));
}
}
#endif
#endif
Serial.print("data = ");
Serial.print(data);
digitalWrite(LATCH_PIN, LOW);
SPI.transfer(data);
digitalWrite(LATCH_PIN, HIGH);
}
#define TypeSegmemt 1
#if TypeSegmemt == 0 // значит катодный
int checkLamp = 1; // включаем зажиганием
#else // значит анодный
int checkLamp = 0; // включаем выключением
#endif
int InvertCheckLamp(){
if (checkLamp == 1){
return 0;
}
else{
return 1;
}
}
void setup() {
Serial.begin(115200);
// ВАЖНО: отключаем SWD/JTAG на PB3
// На STM32C0 нужно использовать HAL или регистры
// Но в Arduino STM32 это может быть автоматически
// Инициализация SPI1 на пинах PB3 (SCK), PB5 (MOSI)
SPI.setMOSI(PB5);
SPI.setSCLK(PB3);
SPI.begin();
pinMode(LATCH_PIN, OUTPUT);
digitalWrite(LATCH_PIN, LOW);
Serial.println("74HC595 initialized");
Serial.println("SCK on PB3, MOSI on PB5");
}
void loop() {
for (int i = 0; i < 10; i++){
Serial.print("i = ");
Serial.println(i);
ShowNumber2(i);
UserSendTo595(&seg);
delay(1000);
Serial.println("***************end****************");
}
delay(1000);
}
String strxc = "";
void ShowNumber(int number){
CleanNumber();
switch(number){
case 1:
// 1
massive_sectors[4] = 0;
massive_sectors[7] = 0;
break;
case 2:
// 2
massive_sectors[3] = 0;
massive_sectors[4] = 0;
massive_sectors[1] = 0;
massive_sectors[5] = 0;
massive_sectors[6] = 0;
break;
case 3:
// 3
massive_sectors[3] = 0;
massive_sectors[4] = 0;
massive_sectors[1] = 0;
massive_sectors[7] = 0;
massive_sectors[6] = 0;
break;
case 4:
// 4
massive_sectors[2] = 0;
massive_sectors[1] = 0;
massive_sectors[4] = 0;
massive_sectors[7] = 0;
break;
case 5:
// 5
massive_sectors[3] = 0;
massive_sectors[2] = 0;
massive_sectors[1] = 0;
massive_sectors[7] = 0;
massive_sectors[6] = 0;
break;
case 6:
// 6
massive_sectors[3] = 0;
massive_sectors[2] = 0;
massive_sectors[1] = 0;
massive_sectors[7] = 0;
massive_sectors[6] = 0;
massive_sectors[5] = 0;
break;
case 7:
// 7
massive_sectors[3] = 0;
massive_sectors[4] = 0;
massive_sectors[7] = 0;
break;
case 8:
// 8
massive_sectors[1] = 0;
massive_sectors[2] = 0;
massive_sectors[3] = 0;
massive_sectors[4] = 0;
massive_sectors[5] = 0;
massive_sectors[6] = 0;
massive_sectors[7] = 0;
break;
case 9:
// 9
massive_sectors[1] = 0;
massive_sectors[2] = 0;
massive_sectors[3] = 0;
massive_sectors[4] = 0;
massive_sectors[6] = 0;
massive_sectors[7] = 0;
break;
case 0:
// 0
massive_sectors[3] = 0;
massive_sectors[4] = 0;
massive_sectors[7] = 0;
massive_sectors[6] = 0;
massive_sectors[5] = 0;
massive_sectors[2] = 0;
break;
default:
break;
}
}
void ShowNumber2(int number){
CleanNumber();
switch(number){
case 1:
// 1
seg.c = checkLamp;
seg.b = checkLamp;
break;
case 2:
// 2
seg.a = checkLamp;
seg.b = checkLamp;
seg.g = checkLamp;
seg.e = checkLamp;
seg.d = checkLamp;
break;
case 3:
// 3
seg.a = checkLamp;
seg.b = checkLamp;
seg.g = checkLamp;
seg.c = checkLamp;
seg.d = checkLamp;
break;
case 4:
// 4
seg.f = checkLamp;
seg.g = checkLamp;
seg.b = checkLamp;
seg.c = checkLamp;
break;
case 5:
// 5
seg.a = checkLamp;
seg.f = checkLamp;
seg.g = checkLamp;
seg.c = checkLamp;
seg.d = checkLamp;
break;
case 6:
// 6
seg.a = checkLamp;
seg.f = checkLamp;
seg.g = checkLamp;
seg.c = checkLamp;
seg.d = checkLamp;
seg.e = checkLamp;
break;
case 7:
// 7
seg.a = checkLamp;
seg.b = checkLamp;
seg.c = checkLamp;
break;
case 8:
// 8
seg.a = checkLamp;
seg.b = checkLamp;
seg.c = checkLamp;
seg.d = checkLamp;
seg.e = checkLamp;
seg.f = checkLamp;
seg.g = checkLamp;
break;
case 9:
// 9
seg.a = checkLamp;
seg.b = checkLamp;
seg.c = checkLamp;
seg.d = checkLamp;
seg.f = checkLamp;
seg.g = checkLamp;
break;
case 0:
// 0
seg.a = checkLamp;
seg.b = checkLamp;
seg.c = checkLamp;
seg.d = checkLamp;
seg.e = checkLamp;
seg.f = checkLamp;
break;
default:
break;
}
Serial.println("We send: ");
char buffer[100];
sprintf(buffer, "a = %d; b = %d; c = %d; d = %d; e = %d; f = %d; g = %d; dp = %d", seg.a, seg.b, seg.c, seg.d, seg.e, seg.f, seg.g, seg.dp);
String strxc = String(buffer);
Serial.println(strxc);
sprintf(buffer, "с = %d; d = %d; e = %d; b = %d; a = %d; f = %d; g = %d; dp = %d", seg.c, seg.d, seg.e, seg.b, seg.a, seg.f, seg.g, seg.dp);
strxc = String(buffer);
Serial.println(strxc);
Serial.println("============");
}
void CleanNumber(){
seg.a = seg.b = seg.c = seg.d = seg.e = seg.f = seg.g = seg.dp = InvertCheckLamp();
}