7seg через hc164
Добавлено: Чт июл 17, 2014 09:39:58
Добрый день!
Проблема такая, запускаю семисегментный индикатор через сдвиговый регистр, не пойму как убрать "тень" на соседних разрядах. Уточню, это не тень от соседних разрядов, а небольшой "засвет" не горящих сегментов. даже при выводе "111"
Проблема такая, запускаю семисегментный индикатор через сдвиговый регистр, не пойму как убрать "тень" на соседних разрядах. Уточню, это не тень от соседних разрядов, а небольшой "засвет" не горящих сегментов. даже при выводе "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;
}
}