Страница 1 из 1

7seg через hc164

Добавлено: Чт июл 17, 2014 09:39:58
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; 
      }
}

Re: 7seg через hc164

Добавлено: Чт июл 17, 2014 10:09:22
Gudd-Head
Если под "тенью" имеется в виду засветка, то никак. Вам нужен регистр с управлением выходами.

Re: 7seg через hc164

Добавлено: Чт июл 17, 2014 10:29:40
Martin76
Можно гасить все разряды на время записи в случае статической индикации, либо включать ключ разряда только после записи в регистр, в случае динамической. А так 4094, 74НС595 и подобные этого недостатка не имеют.

Re: 7seg через hc164

Добавлено: Чт июл 17, 2014 10:35:17
Gudd-Head
Если показания индикатора у вас меняются не слишком часто (а смысла обновлять показания чаще 1...2 раз в секунду особого смысла не имеют), сильной засветки быть не должно.
Ну и в программе не обновлять показания, если они не изменились. Лень курить код.

Re: 7seg через hc164

Добавлено: Чт июл 17, 2014 13:09:09
oleg110592
как выше уже сказали, если перед загрузкой регистра выключать катоды/аноды, то засветок не будет
СпойлерИзображение