Подскажите где собака зарыта. По 7-мисегментному
Добавлено: Пт авг 29, 2014 23:17:02
При выводе на 7-ми сегментный индикатор на 2ке, 3ке не горит G, А на 0 не горит F. В чом может быть загвоздка.
Матрицу проверил все сходится.
вот программа. Под схему http://radiokot.ru/circuit/digital/automat/16/
#include <mega8.h>
#include <delay.h>
unsigned char sek,see,min,chasi,i,q,k;
bit m;
static flash unsigned char digit[] = { //массив с цифрами
(0b00111111), //0
(0b00000110), //1
(0b01011011), //2
(0b01001111), //3
(0b01100110), //4
(0b01101101), //5
(0b01111101), //6
(0b00000111), //7
(0b01111111), //8
(0b01101111), //9
};
////////// Timer /////////////////
interrupt [TIM2_OVF] void timer2_ovf_isr(void) //Прерывание по переполнению таймера счётчика 2
{
// TCNT2=0x00;
sek++;
if (sek==60)
{
sek=0;
min++;
}
if (min==60)
{
min=0;
chasi++;
}
if (chasi==24) chasi=0;
}
/////////// Indikator ///////////////////
void ind(unsigned char chislo)
{
unsigned char desjatki=0;
while(chislo>=10)
{
chislo-=10;
desjatki++;
}
if (m==0)
{ // PORTC=0b11111111;
// 1
PORTC.3=0;
PORTD=digit[desjatki] ;
delay_ms(5);
PORTC.3=1;
// 2
PORTC.2=0;
PORTD=digit[chislo];
delay_ms(5);
PORTC.2=1;
m=1;
}
else
{
// 3
PORTC.5=0;
PORTD=digit[desjatki] ;
delay_ms(5);
PORTC.5=1;
// 4
PORTC.4=0;
PORTD=digit[chislo];
delay_ms(5);
PORTC.4=1;
m=0;
}
};
///////////////////////////////////////////////////
void main(void)
{
PORTB=0b00111110;
DDRB=0b00000000;
// PORTC=0b11111111;
DDRC=0b11111111;
// PORTD=0b00000000;
DDRD=0b11111111;
////// TIMER//////
TIMSK |= (1 << TOIE2); // Разрешение прерывания по таймеру2
TCCR2=0b00000110; //0b00000110; // |= (1 << CS21) ; //(1 << CS20) || (1 << CS22) Предделитель на 8
OCR2=250;
#asm ("sei");
while(1) //!!!!!!! Пример цадачи в бесконечном цикле: переключение лог. уров.
{
m=0;
ind(sek);
ind(min);
if (!PINB.3)
{
delay_ms(20);
for(i=0;i<50;i++)
{
ind(77);
ind(77);
}
while(k<=2)
{
k=1;
for(i=0;i<10;i++)
{
ind(sek);
ind(min);
}
while(!PINB.5)
{
min++;
if (min==60)min=0;
for(i=0;i<10;i++)
{
ind(sek);
ind(min);
}
}
while(!PINB.4)
{
sek++;
if (sek==60)sek=0;
for(i=0;i<10;i++)
{
ind(sek);
ind(min);
}
}
if (!PINB.2)
{
delay_ms(20);
k=3;
sek=0;
}
}
k=0;
}
}
}
Матрицу проверил все сходится.
вот программа. Под схему http://radiokot.ru/circuit/digital/automat/16/
#include <mega8.h>
#include <delay.h>
unsigned char sek,see,min,chasi,i,q,k;
bit m;
static flash unsigned char digit[] = { //массив с цифрами
(0b00111111), //0
(0b00000110), //1
(0b01011011), //2
(0b01001111), //3
(0b01100110), //4
(0b01101101), //5
(0b01111101), //6
(0b00000111), //7
(0b01111111), //8
(0b01101111), //9
};
////////// Timer /////////////////
interrupt [TIM2_OVF] void timer2_ovf_isr(void) //Прерывание по переполнению таймера счётчика 2
{
// TCNT2=0x00;
sek++;
if (sek==60)
{
sek=0;
min++;
}
if (min==60)
{
min=0;
chasi++;
}
if (chasi==24) chasi=0;
}
/////////// Indikator ///////////////////
void ind(unsigned char chislo)
{
unsigned char desjatki=0;
while(chislo>=10)
{
chislo-=10;
desjatki++;
}
if (m==0)
{ // PORTC=0b11111111;
// 1
PORTC.3=0;
PORTD=digit[desjatki] ;
delay_ms(5);
PORTC.3=1;
// 2
PORTC.2=0;
PORTD=digit[chislo];
delay_ms(5);
PORTC.2=1;
m=1;
}
else
{
// 3
PORTC.5=0;
PORTD=digit[desjatki] ;
delay_ms(5);
PORTC.5=1;
// 4
PORTC.4=0;
PORTD=digit[chislo];
delay_ms(5);
PORTC.4=1;
m=0;
}
};
///////////////////////////////////////////////////
void main(void)
{
PORTB=0b00111110;
DDRB=0b00000000;
// PORTC=0b11111111;
DDRC=0b11111111;
// PORTD=0b00000000;
DDRD=0b11111111;
////// TIMER//////
TIMSK |= (1 << TOIE2); // Разрешение прерывания по таймеру2
TCCR2=0b00000110; //0b00000110; // |= (1 << CS21) ; //(1 << CS20) || (1 << CS22) Предделитель на 8
OCR2=250;
#asm ("sei");
while(1) //!!!!!!! Пример цадачи в бесконечном цикле: переключение лог. уров.
{
m=0;
ind(sek);
ind(min);
if (!PINB.3)
{
delay_ms(20);
for(i=0;i<50;i++)
{
ind(77);
ind(77);
}
while(k<=2)
{
k=1;
for(i=0;i<10;i++)
{
ind(sek);
ind(min);
}
while(!PINB.5)
{
min++;
if (min==60)min=0;
for(i=0;i<10;i++)
{
ind(sek);
ind(min);
}
}
while(!PINB.4)
{
sek++;
if (sek==60)sek=0;
for(i=0;i<10;i++)
{
ind(sek);
ind(min);
}
}
if (!PINB.2)
{
delay_ms(20);
k=3;
sek=0;
}
}
k=0;
}
}
}