нет такого.
digitalWrite в инпут режиме включает и выключает подтяжку на пине.
чет и я херню написал уже про digitalWrite
тоже спать))
Короче чет сложно, без драйвера или либы этим китайским поделием управлять. Тоже спать, всем спасибо!
это да…
а на самом деле, час два, разрисовать на бумажке, вникнуть, и переложить в код.
не сдаваться!!!
и мне не за что, вопрос решен ставить, я смуты больше навел)))
Я сегодня добрый.
Тут правда на 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;
}
}
ТС можно поинтересоваться вы всё это делаете для развития мозга, поиграться и забыть? доказать себе, что сможете запустить этот единственный у вас дисплей? хотите сделать проект и в дальнейшем пустить его в тираж? у вас не хватает ног контроллера, чтобы подключить обычный (не динамический) семисегментник? Какова ваша цель, тратить не только своё время, но и время людей пытающихся вам помочь, в условиях, когда ваших знаний не хватает для решения в лоб данной задачи. Не понятно, зачем вся эта дискуссия?
@SAB
Да что там решать -то?
Автор попросил вывести цифру 2 - задачка абсолютно элементарная. И ведь практически решил уже. Я не понял, чего он вдруг резко сдался в полуметре от победы…
Да я хотел из той же кружки термистор подключить и термеметр сделать, но как увидел сколько нужно что бы просто “2” отобразить испугался и забил))
Человека никто не может заставить насильно тратить свое время, это уже рабство какое-то. Тут все просто - есть желание что-то ответить - ответь, нет - иди дальше
Даже не заостряя внимание на очередное поучение очередного новичка в сторону “что делать” старожилам, таки вставлю свои пять копеек. У кого-то появилось желание помочь человеку, он потратил свое время, а в результате оказалось, что потратил это время впустую, не так-то оно человеку и нужно было. И зачем тогда этот кто-то свое время тратил?
Так он свое время потратил только на гневный комент, а ты - на то, что бы его заадвокатить. Что то я от вас не вижу ни помощи, ни кода.
А другие и не против помочь судя по треду, причем задачка для этих ребят максимально тривиальная и не требует огромных трудозатрат, это просто обмен опытом.
Может для вас это просто очень сложно, и вы проецируете задачу на себя, думая что помогающие люди дествительно тратят уймы часов что бы понять как 2 отобразить на дисплейчике из кружки китайской?
Вместо того чтоб тратить время на пререкания - попробовали бы все-таки победить хотя бы цифру два… даже если весь термометр потом делать не будете.
Не слишком ли борзо, новенький? Правила форума читал?
Мне нравится, когда новичок, не умеющий даже цифру на индикаторе зажечь, пытается оценивать уровень сложности задачи
А я сейчас вот это кручу, вроде все получается, выше кактус скинул
#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;
}
}
Да ты тоже не можешь
Сильный ход, да. Во дворе среди пацанов, поди, всегда срабатывает?
Я бы сказал: “на очередное хамство”.
Ребята все получилось, освоил дисплеи такого типа, всем спасибо!