надо понимать, какой у него протокол. Тупо управлять 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;
}
}