Подключение 5 пинового 7 сег дисплея 88

нет такого.
digitalWrite в инпут режиме включает и выключает подтяжку на пине.

1 лайк

чет и я херню написал уже про digitalWrite
тоже спать))

Короче чет сложно, без драйвера или либы этим китайским поделием управлять. Тоже спать, всем спасибо!

это да…
а на самом деле, час два, разрисовать на бумажке, вникнуть, и переложить в код.
не сдаваться!!!

и мне не за что, вопрос решен ставить, я смуты больше навел)))

1 лайк

Я сегодня добрый.
Тут правда на 6 пинов и 3 регистра, но в дефайнах все меняется. Таблицу выводов нужно будет ещё подправить под твою схему
Держи:

#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;
    }            
}
1 лайк

ТС можно поинтересоваться вы всё это делаете для развития мозга, поиграться и забыть? доказать себе, что сможете запустить этот единственный у вас дисплей? хотите сделать проект и в дальнейшем пустить его в тираж? у вас не хватает ног контроллера, чтобы подключить обычный (не динамический) семисегментник? Какова ваша цель, тратить не только своё время, но и время людей пытающихся вам помочь, в условиях, когда ваших знаний не хватает для решения в лоб данной задачи. Не понятно, зачем вся эта дискуссия?

@SAB
Да что там решать -то?
Автор попросил вывести цифру 2 - задачка абсолютно элементарная. И ведь практически решил уже. Я не понял, чего он вдруг резко сдался в полуметре от победы…

Да я хотел из той же кружки термистор подключить и термеметр сделать, но как увидел сколько нужно что бы просто “2” отобразить испугался и забил))

Человека никто не может заставить насильно тратить свое время, это уже рабство какое-то. Тут все просто - есть желание что-то ответить - ответь, нет - иди дальше

Даже не заостряя внимание на очередное поучение очередного новичка в сторону “что делать” старожилам, таки вставлю свои пять копеек. У кого-то появилось желание помочь человеку, он потратил свое время, а в результате оказалось, что потратил это время впустую, не так-то оно человеку и нужно было. И зачем тогда этот кто-то свое время тратил?

Так он свое время потратил только на гневный комент, а ты - на то, что бы его заадвокатить. Что то я от вас не вижу ни помощи, ни кода.

А другие и не против помочь судя по треду, причем задачка для этих ребят максимально тривиальная и не требует огромных трудозатрат, это просто обмен опытом.

Может для вас это просто очень сложно, и вы проецируете задачу на себя, думая что помогающие люди дествительно тратят уймы часов что бы понять как 2 отобразить на дисплейчике из кружки китайской?

1 лайк

Вместо того чтоб тратить время на пререкания - попробовали бы все-таки победить хотя бы цифру два… даже если весь термометр потом делать не будете.

Не слишком ли борзо, новенький? :wink: Правила форума читал?

Мне нравится, когда новичок, не умеющий даже цифру на индикаторе зажечь, пытается оценивать уровень сложности задачи :sweat_smile:

1 лайк

А я сейчас вот это кручу, вроде все получается, выше кактус скинул

#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;
    }            
}


Да ты тоже не можешь

Сильный ход, да. Во дворе среди пацанов, поди, всегда срабатывает? :wink:

Я бы сказал: “на очередное хамство”.

1 лайк

Ребята все получилось, освоил дисплеи такого типа, всем спасибо!
clideo_editor_6e047e5334b14eb29c705d01701b7633-ezgif.com-video-to-webp-converter

2 лайка