Проблема такая, запускаю семисегментный индикатор через сдвиговый регистр, не пойму как убрать "тень" на соседних разрядах. Уточню, это не тень от соседних разрядов, а небольшой "засвет" не горящих сегментов. даже при выводе "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;
}
}


