10-контактный TN дисплей


Кто нибудь заводил это без всяких там HT1621 итд. какой библиотекой пользовались?

надо понимать, какой у него протокол. Тупо управлять 3х7 сегментов - 10 пинов маловато, надо 12. Значит там что-то другое

Не, не маловато. В самый раз.

да. что-то обсчитался

Заводил, все коды и пр. здесь.

Никакой

3 лайка

Чой та ?
У меня есть семисегментный индикатор трехразрядный , с точками. Так у него всего 6 выводов. А из электроники там только светодиоды.
Вполне себе управляется.

@Kakmyc , в отдельной теме (возможно, а может и в этой) - опиши алгоритм.
Я так понимаю, что ты использовал схему где светодиоды подключены к одним и тем же пинам, но разной полярностью?

ЗЫ: Если ошибся - прошу прощения.

Смотри “чарлиплексинг”. Только у кактуса через жопу всё расписано, как обычно.(

Это не я использовал, это китайцы такое продают.

Пример кода:

#include <avr/interrupt.h>
#include <avr/io.h>
#define nPIN 6
#define nREG 3
#define nSEG 8

//byte pinArr[6]={14,15,16,17,18,19};

//массив всех диодов {анод,катод}
const byte diodArr[nREG][nSEG][2]={
    {{2,3},{2,4},{5,2},{2,6},{2,5},{3,2},{4,2},{2,1}        
    },
    {{5,4},{3,5},{4,5},{3,4},{6,3},{4,3},{5,3},{3,1}        
    },
    {{1,6},{3,6},{5,6},{6,4},{4,6},{6,5},{1,5},{10,10}       
    }
};

#define space 10
const byte simbol[12]{//abcdefgDp
    0b11111100,//0
    0b01100000,//1
    0b11011010,//2
    0b11110010,//3
    0b01100110,//4
    0b10110110,//5
    0b10111110,//6
    0b11100000,//7
    0b11111110,//8
    0b11110110, //9    
    0b00000000,//space
    0b11101110,//A
};

byte value[3]={0,0,8};
byte stepDir[nPIN];
byte stepState[nPIN];
byte _stepDir[nPIN];
byte _stepState[nPIN];
float count=0;
boolean dot1=0,dot2=1;
volatile byte step=0;

void Calc(){    
    for(int i=0;i<nPIN;i++){/*
  количество шагов равняется количеству пинов.
 каждый шаг увеличивает номер вывода на который будет подаватся +5в на 1.
сначала смотрим вывод 1, потом 2 и тд  
        */
        //обнуляем массивы
        _stepDir[i]=0;
        _stepState[i]=0;
        
 for(int reg=0;reg<nREG;reg++){//для каждого из трех регистров
    for(int j=0;j<nSEG;j++){//по каждому из 8 сегментов (точка 8ой)
 //для вывода точек берем значение из массива знаков и работаем сним
 byte simbolCurrent=simbol[value[reg]];
 //если регистр самый левый добавляем к выводимому символу значение точки
                 if(reg==0)simbolCurrent=simbolCurrent+dot1;
//то же со средним регистром
if(reg==1)simbolCurrent+=dot2;
//если в текущей итерации сегмента нужно выводить то смотрим следующее условие
  if((simbolCurrent>>(nSEG-1-j))&1){
/*смотрим совпадает ли номер вывода текущего диода с текущим шагом
                    */
       if(diodArr[reg][j][0]==i+1){
                        /*
      если есть совпадение то по тогда пинаем в значение шага единичку на глубину указанную в массиве пинов
 то же для катода этого же диода , но плюс подаем только на анод
                        */
_stepDir[i]|=1<<(diodArr[reg][j][0]-1);
_stepDir[i]|=1<<(diodArr[reg][j][1]-1);
_stepState[i]|=1<<(diodArr[reg][j][0]-1);            }
  }
            }
   }
        }
    cli();
    //копируем из временного массива в массив вывода предварительно отключив прерывание
   memcpy(stepDir,_stepDir,nPIN);
   memcpy(stepState,_stepState,nPIN);
    sei();
}

ISR(TIMER1_COMPA_vect){
    
    DDRC=stepDir[step];
    PORTC=stepState[step];
   
    step==nPIN-1?step=0:step++;
}

void setup(){
    TCCR1A=0;
    TCCR1B=0;
    OCR1A=100;
    TCCR1B|=1<<WGM12;
    TCCR1B|=1<<CS11;
    TIMSK1|=1<<OCIE1A;
    sei();
}

void loop(){    
   static uint32_t calcTime=millis();
       int outVal=0;
    if(count<10){
        dot1=1;
        dot2=0;
        outVal=count*100;
    }else if(count<100){
        dot1=0;
        dot2=1;
        outVal=count*10;
    }
    
    value[0]=outVal/100;
    value[1]=(outVal/10)%10;
    value[2]=outVal%10;
   if(millis()-calcTime>=200){
        calcTime=millis();
        Calc();
        count+=0.01;
    }            
}