Помогит с четверным семисегментиком
Добавлено: Вс авг 20, 2017 17:57:44
Всем привет, написал программу для двойного семисегметика, попытался написать четверного, ну чтоб считал до 9999, но получается какая-та каша, хотя вроде по логике вещей всё делаю правильно, мб кто-нибудь знает как мне надо изменить программу для четрыхсемисегментиков, ( это прога написана для двойного семисегментика).
#define F_CPU 4000000l
#include
#include
#include
unsigned int i;
unsigned char direction;
unsigned char R1=0, R2=0;
void ledprint(unsigned int number)
{
R1 = number%10; // младший разряд
R2 = number/10; // старший разпряд
}
void segchar (unsigned char seg)
{
switch (seg)
{
case 1: PORTD = 0b11111001; break;
case 2: PORTD = 0b10100100; break;
case 3: PORTD = 0b10110000; break;
case 4: PORTD = 0b10011001; break;
case 5: PORTD = 0b10010010; break;
case 6: PORTD = 0b10000010; break;
case 7: PORTD = 0b11111000; break;
case 8: PORTD = 0b10000000; break;
case 9: PORTD = 0b10010000; break;
case 0: PORTD = 0b11000000; break;
}
}
unsigned char n_count=0;
ISR (TIMER1_COMPA_vect)
{
if (n_count==0)
{
PORTB &=~(1<<PB0);// отключаем пб0,
PORTB |= (1<<PB1);// включаем пб1
segchar(R1);
}
//---
if (n_count==1) // когда идёт переполнения
{
PORTB &=~(1<<PB1);
PORTB |= (1<1) n_count =0;
}
int main(void)
{
DDRC = 0x00;
PORTC |= (1 << PC0); // Подключаем внутренний подтягивающий резистор
DDRD = 0xFF;
PORTD = 0x00;
DDRB = 0xFF;
PORTB = 0b011000000;
TCCR1B = (1 << CS12)|(1 << WGM12); //предделитель clk/256, режим таймера СТС
OCR1A = 100; // Выбор коэффициента деления
TIMSK |= (1 << OCIE1A); // Разрешение прерывания по совпадению
sei(); // Разрешение прерываний
while(1)
{
for (i=0;i<100; i++)
{
ledprint(i);
_delay_ms(500);
}
}
}
#define F_CPU 4000000l
#include
#include
#include
unsigned int i;
unsigned char direction;
unsigned char R1=0, R2=0;
void ledprint(unsigned int number)
{
R1 = number%10; // младший разряд
R2 = number/10; // старший разпряд
}
void segchar (unsigned char seg)
{
switch (seg)
{
case 1: PORTD = 0b11111001; break;
case 2: PORTD = 0b10100100; break;
case 3: PORTD = 0b10110000; break;
case 4: PORTD = 0b10011001; break;
case 5: PORTD = 0b10010010; break;
case 6: PORTD = 0b10000010; break;
case 7: PORTD = 0b11111000; break;
case 8: PORTD = 0b10000000; break;
case 9: PORTD = 0b10010000; break;
case 0: PORTD = 0b11000000; break;
}
}
unsigned char n_count=0;
ISR (TIMER1_COMPA_vect)
{
if (n_count==0)
{
PORTB &=~(1<<PB0);// отключаем пб0,
PORTB |= (1<<PB1);// включаем пб1
segchar(R1);
}
//---
if (n_count==1) // когда идёт переполнения
{
PORTB &=~(1<<PB1);
PORTB |= (1<1) n_count =0;
}
int main(void)
{
DDRC = 0x00;
PORTC |= (1 << PC0); // Подключаем внутренний подтягивающий резистор
DDRD = 0xFF;
PORTD = 0x00;
DDRB = 0xFF;
PORTB = 0b011000000;
TCCR1B = (1 << CS12)|(1 << WGM12); //предделитель clk/256, режим таймера СТС
OCR1A = 100; // Выбор коэффициента деления
TIMSK |= (1 << OCIE1A); // Разрешение прерывания по совпадению
sei(); // Разрешение прерываний
while(1)
{
for (i=0;i<100; i++)
{
ledprint(i);
_delay_ms(500);
}
}
}