7seg через hc164

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Вс июл 25, 2010 14:19:37

Сообщение Aselicon »

Добрый день!
Проблема такая, запускаю семисегментный индикатор через сдвиговый регистр, не пойму как убрать "тень" на соседних разрядах. Уточню, это не тень от соседних разрядов, а небольшой "засвет" не горящих сегментов. даже при выводе "111"
Спойлер

Код: Выделить всё

#include <tiny45.h> 

// Массив значений для индикатора
 //Массив чисел - 0  ,  1  ,  2  , 3   ,  4  ,  5  ,  6  , 7  ,  8   ,  9 
const char buf[] = { 0xAF, 0x21, 0x9D, 0xB5, 0x33, 0xB6, 0xBE, 0x25, 0xBF, 0xB7 }; 
bit inv=0;
unsigned int value,t; 
volatile unsigned char rank_counter; //Счётчик разрядов индикации 


void indication (unsigned int data)
{ 
    unsigned char i;                                                    
    unsigned char digit;
    if (rank_counter == 1){       //Если разряд 2
      digit = buf[data] | (1<<6); //ставим после него точку
      }
    else{
        digit = buf[data];        //Берём число из массива
        }                                                   
    for( i=0; i<8; i++){         //и последовательно выводим 
     
    if (inv) {PORTB = (0<<4);} 
     PORTB.3 = digit & 1<<i; 
                                                                      
    if (inv) {PORTB = (1<<4);}           
        else {PORTB = (1<<4);PORTB = (0<<4);}

       }                            
}

void press_plus (void)
{ 
 if (!PINB.1) {t++;} 
} 

void press_minus (void)
{                                                    
 if (!PINB.2) {t--;}                                                 
}

// Timer 0 output compare A interrupt service routine
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
     
        switch (rank_counter) {                                                                           

              case 0:{                         //Выводим первый разряд 
                  indication( value % 10);
                  DDRB.0 =1;
                  PORTB.0 =0;         
                  DDRB.1 =0;
                  PORTB.1 =1;
                  if (!PINB.1) {press_plus();}
                  DDRB.2 =0;
                  PORTB.2 =1;
                  break;
                  };   
                   
              case 1:{                 //Выводим второй разряд 
                  indication( value / 10 % 10);  
                  
                  PORTB.0 = 1;         
                  DDRB.1 = 1;
                  PORTB.1 = 0;
                  DDRB.2 =0;
                  PORTB.2 =1;
                  break;
                  };  
                                 
              case 2:{                //Выводим третий разряд
                  indication( value / 100); 
                  if (!PINB.2) {press_minus();}
                  PORTB.0 = 1;         
                  DDRB.1=0;
                  PORTB.1 = 1;
                  DDRB.2 =1;
                  PORTB.2 = 0;
                  break;};  
                                  
              } 

        rank_counter++; 
        if (rank_counter>2) {rank_counter=0;}
}


// Declare your global variables here

void main(void)
{
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port B initialization
// Func5=In Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
// State5=T State4=0 State3=0 State2=0 State1=0 State0=0 
PORTB=0x00;
DDRB=0x1F;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 9,375 kHz
// Mode: Normal top=0xFF
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x02;
TCCR0B=0x04;
TCNT0=0x00;
OCR0A=0x7F;
OCR0B=0x00;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK=0x10;


#asm("sei")

while (1)
      { 
      value=t; 
      }
}
Последний раз редактировалось Aselicon Чт июл 17, 2014 10:14:29, всего редактировалось 1 раз.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Если под "тенью" имеется в виду засветка, то никак. Вам нужен регистр с управлением выходами.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Друг Кота
Аватара пользователя
Сообщения: 20183
Зарегистрирован: Пт фев 04, 2011 17:57:51
Откуда: Рыбинск

Сообщение Martin76 »

Можно гасить все разряды на время записи в случае статической индикации, либо включать ключ разряда только после записи в регистр, в случае динамической. А так 4094, 74НС595 и подобные этого недостатка не имеют.
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Если показания индикатора у вас меняются не слишком часто (а смысла обновлять показания чаще 1...2 раз в секунду особого смысла не имеют), сильной засветки быть не должно.
Ну и в программе не обновлять показания, если они не изменились. Лень курить код.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

как выше уже сказали, если перед загрузкой регистра выключать катоды/аноды, то засветок не будет
СпойлерИзображение
Реклама
Ответить

Вернуться в «Периферия»