Здравствуйте. Помогите пожалуйста разобраться с дисплеем на драйвере SM1628C. Пробовал разные библиотеки, но на экране высвечиваются сплошные кракозябры. Пробывал код от Евгения П
#define PIN_CLK 3
#define PIN_DIO 2
#define PIN_STB 4
#define PIN_IR 13
/////////////////////////////////////////////////////////////
///////////// ТИПА "библиотека" ДЛЯ TM1668 ////////////
/////////////////////////////////////////////////////////////
//
// при том подключении, что есть
// достаточно 10 байтов на светодиоды и 2 на кнопки
//
#define LED_DATA_LENGTH 10
//
// Подключено 5 "цифр".
// 0-ая - это двоеточие, залействовано только два младших бита
// 1-4 - собственно цифры слева направо.
// В цифрах задействовано 7 битов под сегменты (с 0-го по 6-ой)
// и 7-ой бит под доплнительный символ (питание, конверт и т.п.)
//
#define SEG_A 0x80 // цифры с 1 по 4
#define SEG_B 0x0000 // цифры с 1 по 4
#define SEG_C 0x0000 // цифры с 1 по 4
#define SEG_D 0x0000 // цифры с 1 по 4
#define SEG_E 0x0000 // цифры с 1 по 4
#define SEG_F 0x0000 // цифры с 1 по 4
#define SEG_G 0x0000 // цифры с 1 по 4
#define SEG_H 0x80 // Дополнительный символ ( // цифры с 1 по 4)
#define SEG_ENVELOP SEG_H // только 1-ая цифра
#define SEG_ANTENNA SEG_H // только 2-ая цифра
#define SEG_POWER SEG_H // только 3-я цифра
#define SEG_MUSIC SEG_H // только 4-ая цифра
#define SYMBOL_COLON 0x0020 //(SEG_UDOT | SEG_LDOT) // Двоеточие (только 0-ая цифра)
//
// Символы (цифры / буквы, можно ещё добавить всяких)
//
#define SYMBOL_0 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F)
#define SYMBOL_1 (SEG_B | SEG_C)
#define SYMBOL_2 (SEG_A | SEG_B | SEG_D | SEG_E | SEG_G)
#define SYMBOL_3 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_G)
#define SYMBOL_4 (SEG_B | SEG_C | SEG_F | SEG_G)
#define SYMBOL_5 (SEG_A | SEG_C | SEG_D | SEG_F | SEG_G)
#define SYMBOL_6 (SEG_A | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)
#define SYMBOL_7 (SEG_A | SEG_B | SEG_C)
#define SYMBOL_8 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)
#define SYMBOL_9 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_G)
#define SYMBOL_MINUS (SEG_G)
#define SYMBOL_A (SEG_A | SEG_B | SEG_C | SEG_E | SEG_F | SEG_G)
#define SYMBOL_C (SEG_A | SEG_E | SEG_F | SEG_D)
#define SYMBOL_E (SEG_A | SEG_D | SEG_E | SEG_F | SEG_G)
#define SYMBOL_H (SEG_B | SEG_C | SEG_E | SEG_F | SEG_G)
#define SYMBOL_P (SEG_A | SEG_B | SEG_E | SEG_F | SEG_G)
#define SYMBOL_G (SEG_A | SEG_E | SEG_F)
#define SYMBOL_L (SEG_D | SEG_E | SEG_F)
#define SYMBOL_F (SEG_A | SEG_E | SEG_F | SEG_G)
#define SYMBOL_d (SEG_B | SEG_C | SEG_D | SEG_E | SEG_G)
#define SYMBOL_b (SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)
#define SYMBOL_rP (SEG_A | SEG_B | SEG_C | SEG_E | SEG_F)
//
// Глобальные переменные
//
static uint16_t ledGRID[LED_DATA_LENGTH / 2]; // текущее состояние экрана
static uint8_t currentBrightness = 5; // текущая яркость
static uint8_t digits[] = { SYMBOL_0, SYMBOL_1, SYMBOL_2, SYMBOL_3, SYMBOL_4, SYMBOL_5, SYMBOL_6, SYMBOL_7, SYMBOL_8, SYMBOL_9 };
static uint16_t saveGRID[LED_DATA_LENGTH / 2]; // нужно для сохранения состояния экрана на время теста
static uint8_t saveBrightness; // нужно для сохранения яркости на время теста
//
static IRrecv irrecv(PIN_IR);
//
// Запись одиночной команды в TM1668
//
void writeSingleCommand(const uint8_t command) {
digitalWrite(PIN_STB, LOW);
shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, command);
digitalWrite(PIN_STB, HIGH);
delayMicroseconds(1); // Пауза до следующей команды
}
//
// Запись состояния дисплея в TM1668
//
void updateDisplay(void) {
writeSingleCommand(0x40); // запись данных, автоматический адрес
digitalWrite(PIN_STB, LOW);
shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, 0xC0); // Установка адреса в 0
uint8_t * p = (uint8_t *) ledGRID;
for (int8_t i = 0; i < LED_DATA_LENGTH; i++, p++) {
shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, *p);
}; // запись данных
digitalWrite(PIN_STB, HIGH);
delayMicroseconds(1); // Пауза до следующей команды
}
//
// Установить яркость от 0 (выключено) до 8
// (возвращает старую яркость)
//
static inline uint8_t setBrightness(const uint8_t newBrighness) {
const uint8_t res = currentBrightness;
currentBrightness = (newBrighness > 8) ? 8 : newBrighness;
if (currentBrightness == 0) writeSingleCommand(0x80); // Выключить дисплей
else writeSingleCommand(0x88 + (currentBrightness - 1)); // Установить яркость
return res;
}
//
// Увеличить яркость на 1 (возвращает старую яркость)
//
static inline uint8_t increaseBrightness(void) {
const uint8_t res = currentBrightness;
if (currentBrightness < 8) setBrightness(currentBrightness + 1);
return res;
}
//
// Уменьшить яркость на 1 (возвращает старую яркость)
//
static inline uint8_t decreaseBrightness(void) {
const uint8_t res = currentBrightness;
if (currentBrightness > 0) setBrightness(currentBrightness - 1);
return res;
}
//
// Показать тест экрана
// (все символы включены на максимальной яркости)
//
void showTest(void) {
memcpy(saveGRID, ledGRID, sizeof(saveGRID));
ledGRID[0] = 0x0ff0;
ledGRID[1] = 0x0FF0;
ledGRID[2] = 0x0FF0;
ledGRID[3] = 0x0FF0;
ledGRID[4] = 0x0FF0;
ledGRID[5] = 0x0FF0;
ledGRID[6] = 0x0FF0;
updateDisplay();
saveBrightness = setBrightness(4);
}
//
// Восстановить экран после теста
//
void hideTest(void) {
memcpy(ledGRID, saveGRID, sizeof(saveGRID));
updateDisplay();
setBrightness(saveBrightness);
}
/*//
// Показать/скрыть/инвертировать дополнительный символ на цифре n
// Одополнительные символы по цифрам:
// 1-ая - конверт
// 2-ая - сигнал (антенна), а может громоксть?
// 3-я - значок питания
// 4-ая - нота (типа музыка)
//
static inline void showExtraSymbol(const int8_t n) { ledGRID[n] |= SEG_H; }
static inline void hideExtraSymbol(const int8_t n) { ledGRID[n] &= ~SEG_H; }
static inline void invertExtraSymbol(const int8_t n) { ledGRID[n] ^= SEG_H; }
//
// Показать/скрыть/инвертировать конверт
//
static inline void showEnvelope(void) { showExtraSymbol(1); }
static inline void hideEnvelope(void) { hideExtraSymbol(1); }
static inline void invertEnvelope(void) { invertExtraSymbol(1); }
//
// Показать/скрыть/инвертировать антенну
//
static inline void showAntenna(void) { showExtraSymbol(2); }
static inline void hideAntenna(void) { hideExtraSymbol(2); }
static inline void invertAntenna(void) { invertExtraSymbol(2); }
//
// Показать/скрыть/инвертировать символ питания
//
static inline void showPower(void) { showExtraSymbol(3); }
static inline void hidePower(void) { hideExtraSymbol(3); }
static inline void invertPower(void) { invertExtraSymbol(3); }
//
// Показать/скрыть/инвертировать ноту
//
static inline void showMusic(void) { showExtraSymbol(4); }
static inline void hideMusic(void) { hideExtraSymbol(4); }
static inline void invertMusic(void) { invertExtraSymbol(4); }*/
//
// Показать/скрыть/инвертировать верхнюю точку двоеточия
//
//static inline void showUpperDot(void) { ledGRID[0] |= SEG_UDOT; }
//static inline void hideUpperDot(void) { ledGRID[0] &= ~SEG_UDOT; }
//static inline void invertUpperDot(void) { ledGRID[0] ^= SEG_UDOT; }
//
// Показать/скрыть/инвертировать нижнюю точку двоеточия
//
//static inline void showLowerDot(void) { ledGRID[0] |= SEG_LDOT; }
//static inline void hideLowerDot(void) { ledGRID[0] &= ~SEG_LDOT; }
//static inline void invertLowerDot(void) { ledGRID[0] ^= SEG_LDOT; }
//
// Показать/скрыть/инвертировать двоеточие
//
static inline void showColon(void) { ledGRID[4] |= SYMBOL_COLON; }
static inline void hideColon(void) { ledGRID[4] &= ~SYMBOL_COLON; }
static inline void invertColon(void) { ledGRID[4] ^= SYMBOL_COLON; }
//
// Показать цифру value (0-9) в позиции digit (1-4)
// при этом, если у цифры горит дополнительный символ, сохраняем его
//
static inline void setDigit(const int8_t digit, const uint8_t value) {
if (digit < 0 || digit > 14) return; // цифры у нас с 1-ой по 4-ую слева направо
ledGRID[digit] = value | (ledGRID[digit] & SEG_H); // не обижать дополнительный символ, если есть
}
//
// Показать число m в двух правых цифрах (типа минуты или там секунды)
//
static inline void showMinutes(const int8_t m) {
setDigit(4, digits[m % 10]);
setDigit(7, digits[m / 10]);
}
//
// Показать число h в двух левых цифрах (типа часы или там минуты)
//
static inline void showHours(const int8_t h) {
setDigit(2, digits[h % 10]);
setDigit(1, digits[h / 10]);
}
//
// Показать и часы, и минуты
//
static inline void showClock(const int8_t h, const int8_t m) {
showHours(h);
showMinutes(m);
}
/////////////////////////////////////////////////////////////
//////////// КОНЕЦ "библиотеки" ДЛЯ TM1668 ////////////
/////////////////////////////////////////////////////////////
void setup(void) {
//
// Инициализация пинов
pinMode(PIN_CLK, OUTPUT);
pinMode(PIN_DIO, OUTPUT);
pinMode(PIN_STB, OUTPUT);
pinMode(PIN_IR, INPUT);
digitalWrite(PIN_STB, HIGH);
digitalWrite(PIN_CLK, HIGH);
//
// Инициализация экрана
writeSingleCommand(0x03); // Режим отображения (1 и 2 - ничего не меняется)
setBrightness(currentBrightness);
//
// Пишем на экране слово ПОПА
//setDigit(14, SYMBOL_1);
//setDigit(6, SYMBOL_0|SYMBOL_2);
//setDigit(3, SYMBOL_2);
//setDigit(0, SYMBOL_3);
// updateDisplay();
//
// Даём 5 секунд полюбоваться
//delay(5000);
//
// Рисуем нулевое время
showClock(0, 0);
showColon();
updateDisplay();
//
// Приступаем к слушанию "эфира"
irrecv.enableIRIn(); // Слушаем пульт
}
void loop(void) {
static int8_t m = 0, s = 0; // минуты и секунды для показа
static uint32_t oldMillis = 0; // запомненное состояние счётчика миллисекунд
static bool alreadyBlinked = false; // флаг. Если true, то на этой секунде двоеточием уже мигали
bool haveToUpdate = false; // Если true, то в конце нужно обновить экран
const uint32_t currMillis = millis();
const uint32_t diffMillis = currMillis - oldMillis;
//
// Двоеточием мигаем вдвое чаще, чем меняются цифры
//
if (! alreadyBlinked && diffMillis >= 500) {
invertColon();
haveToUpdate = true;
alreadyBlinked = true;
}
//
// Пришла пора сменить цифру
//
if (diffMillis >= 1000) {
s++;
if (s == 60) {
s = 0;
m = (m + 1) % 60;
}
showClock(m, s);
invertColon();
haveToUpdate = true;
alreadyBlinked = false;
oldMillis = currMillis;
}
//
// Если пришла команда с пульта (любая, кроме символа повтора),
// Показываем тест экрана
//
decode_results results;
if (irrecv.decode(&results)) {
if (results.value != 0xFFFFFFFFUL) {
showTest();
delay(1000);
hideTest();
}
irrecv.resume();
}
if (haveToUpdate) updateDisplay(); // Обновляем экран, если нужно
}
Но ничего не получилось. вот с этим кодом показывает счет до 9999, но первый сегмент переключает цифры вместе со вторым
const int dataPin = 2; // VDIO
const int clockPin = 3; // VCLK
const int strobePin = 4; // VSTR
const int intensity = 7; // яркость 0-7
byte led[14]={};//массив дисплея
void setup() {
pinMode(dataPin, OUTPUT); //
pinMode(clockPin, OUTPUT);//
pinMode(strobePin, OUTPUT);//
//long x=0L;// число для записи в дисплей
for(long x=0; x<9999; x++){
for(int i=0; i<14; i++){// очистка дисплея
led[i]=0x00;
}
delay (30);
// разбивка числа на цифры для формирования массива
byte n0=x/1000;// 1-я цифра
kodd_3(0x0002,n0);// подготовка вывода на led 1
byte n2=(x/1000)%10;//2-я цифра
kodd_3(0x0001,n2);// подготовка вывода на led 2
byte n3=(x/100)%10;// 3-я цифра
kodd(0x80,n3);// подготовка вывода на led 3
byte n4=(x/10)%10;// 4-я цифра
kodd(0x40,n4);// подготовка вывода на led 4
byte n5=6;
kodd_2(0x30,n5);
//*********************************************************
digitalWrite(strobePin, HIGH);
digitalWrite(clockPin, HIGH);
t_sendCommand(0x88 | min(7, intensity));// команда 4 0x88
t_sendCommand(0x03);// команда 1
t_sendCommand(0x40);// команда 2
t_sendCommand3(0XC0);// команда 3+
for (int j=0; j<14; j++){// запись сформированного массива
t_send(led[j]);// в led дисплей
}
digitalWrite(strobePin,HIGH);
}
}
//***************************************************************
// функции (подпропраммы)
void kodd(byte kod, byte n1)
{
if (n1==1)
{
led[2]+=kod, led[4]+=kod;// запись в массив цифры 1
}
if (n1==2)
{
led[0]+=kod, led[2]+=kod, led[12]+=kod, led[8]+=kod, led[6]+=kod;//запись в массив цифры 2
}
if (n1==3)
{
led[0]+=kod, led[2]+=kod, led[12]+=kod, led[4]+=kod, led[6]+=kod;//запись в массив цифры 3
}
if (n1==4)
{
led[10]+=kod, led[12]+=kod, led[2]+=kod, led[4]+=kod; //запись в массив цифры 4
}
if (n1==5)
{
led[0]+=kod, led[10]+=kod, led[12]+=kod, led[4]+=kod, led[6]+=kod; //запись в массив цифры 5
}
if (n1==6)
{
led[0]+=kod, led[10]+=kod, led[8]+=kod, led[6]+=kod,led[4]+=kod, led[12]+=kod;// цифры 6
}
if (n1==7)
{
led[0]+=kod, led[2]+=kod, led[4]+=kod; //запись в массив цифры 7
}
if (n1==8)
{
led[0]+=kod, led[2]+=kod, led[4]+=kod, led[6]+=kod, led[8]+=kod, led[10]+=kod, led[12]+=kod;// цифры 8
}
if (n1==9)
{
led[0]+=kod, led[2]+=kod, led[4]+=kod, led[6]+=kod, led[10]+=kod, led[12]+=kod;// цифры 9
}
if(n1==0)
{
led[0]+=kod, led[2]+=kod, led[4]+=kod, led[6]+=kod, led[8]+=kod, led[10]+=kod;// цифры 0
}
}
void kodd_3(byte kod, byte n1)
{
if (n1==1)
{
led[3]+=kod, led[5]+=kod;// запись в массив цифры 1
}
if (n1==2)
{
led[1]+=kod, led[3]+=kod, led[13]+=kod, led[9]+=kod, led[7]+=kod;//запись в массив цифры 2
}
if (n1==3)
{
led[1]+=kod, led[3]+=kod, led[13]+=kod, led[5]+=kod, led[7]+=kod;//запись в массив цифры 3
}
if (n1==4)
{
led[11]+=kod, led[13]+=kod, led[3]+=kod, led[5]+=kod; //запись в массив цифры 4
}
if (n1==5)
{
led[1]+=kod, led[11]+=kod, led[13]+=kod, led[5]+=kod, led[7]+=kod; //запись в массив цифры 5
}
if (n1==6)
{
led[1]+=kod, led[11]+=kod, led[9]+=kod, led[7]+=kod,led[5]+=kod, led[13]+=kod;// цифры 6
}
if (n1==7)
{
led[1]+=kod, led[3]+=kod, led[5]+=kod; //запись в массив цифры 7
}
if (n1==8)
{
led[1]+=kod, led[3]+=kod, led[5]+=kod, led[7]+=kod, led[9]+=kod, led[11]+=kod, led[13]+=kod;// цифры 8
}
if (n1==9)
{
led[1]+=kod, led[3]+=kod, led[5]+=kod, led[7]+=kod, led[11]+=kod, led[13]+=kod;// цифры 9
}
if(n1==0)
{
led[1]+=kod, led[3]+=kod, led[5]+=kod, led[7]+=kod, led[9]+=kod, led[11]+=kod;// цифры 0
}
}
void kodd_2(byte kod, byte n2)
{
if(n2==0)
{
led[0]+=kod;// play=0
}
if(n2==1)
{
led[2]+=kod;// rec=2
}
if(n2==2)
{
led[4]+=kod;//usb=4
}
if(n2==3)
{
led[6]+=kod;// disc=6
}
if(n2==4)
{
led[10]+=kod;// hdd=10
}
if(n2==5)
{
led[12]+=kod;// lan=12
}
if(n2==6)
{
led[8]+=kod;// dp=8
}
}
//custom functions
//******************************************************************************************************
void t_sendCommand(byte cmd)// управление дисплеем
{
digitalWrite(strobePin, LOW);
t_send(cmd);
digitalWrite(strobePin, HIGH);
}
void t_sendCommand3(byte cmd)
{
digitalWrite(strobePin, LOW);
t_send(cmd);
}
void t_sendData(byte seg)// byte Nled
{
digitalWrite(strobePin, LOW);
t_send(seg);
digitalWrite(strobePin, HIGH);
}
void t_send(byte data)
{
for (int i = 0; i < 8; i++) { //пишет 8 бит
digitalWrite(clockPin, LOW);
digitalWrite(dataPin, data & 1 ? HIGH : LOW);// данных в ТМ
data >>= 1;
digitalWrite(clockPin, HIGH);
}
}
void loop (){
}
Помогите пожалуйста, просто я в этом новичок