Код: Выделить всё
/* --------- ATiny85 --------- */
#define F_CPU 8000000UL //частота процессора 8 MHz
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include "shiftreg.h"
#define Prescaler_No (1<<CS00) //No prescaling)
#define Prescaler_8 (1<<CS01)
#define Prescaler_64 (1<<CS01)|(1<<CS00)
#define Prescaler_256 (1<<CS02)
#define Prescaler_1024 (1<<CS00)|(1<<CS02);
volatile uint8_t trigger = 1;
volatile uint8_t dat = 0;
volatile uint8_t temp;
uint8_t display[4];
uint8_t digits[] = {
0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x00
};
SHIFTREG_register reg;
void INT0_init( void )
{
GIMSK = (1 << INT0);
MCUCR = (1 << ISC01);
};
ISR(INT0_vect)//External Interrupt
{
dat++;
};
void TIM0_COMPA_init(void ){
TCNT0 = 0; //Очищаем счетный регистр (на вcякий случай)
OCR0A = (256-1)-0;//Регистр сравнения, (256-1)-число
TCCR0A = (1<<WGM01);// Сброс при совпадении.
TIFR = (1<<OCF0A); // Регистр флагов прерываний таймера счетчика
TIMSK = (1<<OCIE0A); //Разрешение прерывания по совпадению таймера/счётчика 0A
TCCR0B = Prescaler_1024;// Делитель частоты
};
ISR(TIM0_COMPA_vect){
trigger = (trigger==0)?(1):(0);
switch (dat) {
case 0:{ display[0] = 23; break; }
case 1:{ display[0] = 55; break; }
case 2:{ display[0] = 119; break; }
case 3:{ display[0] = 247; break; }
case 4:{ display[0] = (trigger) ? (247) : (19); break;}
case 5:{ display[0] = (trigger) ? (247) : (51); break;}
case 6:{ display[0] = (trigger) ? (247) : (115); break;}
case 7:{ display[0] = 243; break; }
case 8:{ display[0] = (trigger) ? (243) : (17); break;}
case 9:{ display[0] = (trigger) ? (243) : (49); break;}
case 10:{ display[0] = (trigger) ? (243) : (113); break;}
case 11:{ display[0] = 241; break; }
case 12:{ display[0] = (trigger) ? (241) : (16); break;}
case 13:{ display[0] = (trigger) ? (241) : (48); break;}
case 14:{ display[0] = (trigger) ? (241) : (112); break;}
case 15:{ display[0] = 240; break; }
default:{ break; }
}
temp = (dat / 100) % 10;
display[3] = digits[temp];
temp = (dat / 10) % 10;
display[2] = digits[temp];
temp = dat % 10;
display[1] = digits[temp];
SHIFTREG_OutputValue( ®, display, 4 );
if( dat>15 ){ dat=0; }
};
int main(void)
{
DDRB &= ~(1 << PB2);
// ds_pin,st_cp_pin,sh_cp_pin
reg = SHIFTREG_InitRegister(&DDRB, &PORTB, PB0, PB1, PB3);
TIM0_COMPA_init();
INT0_init();
sei();
while (1) { }
return 0;
}
/*
23,55, ... 240 коды, при отправке которых в регистр 74HC595, загораются светодиоды в матрице
-------------------------------------------------------------------------------------
(0) 23 ---------D0
(1) 55 ---------D0,D1
(2) 119 --------D0,D1,D2
(3) 247 --------D0,D1,D2,D3
(4) 247+19 -----D0,D1,D2,D3 + D4 (динамическая индикация)
(5) 247+51 -----D0,D1,D2,D3 + D4,D5 (динамическая индикация)
(6) 247+115 ----D0,D1,D2,D3 + D4,D5,D6 (динамическая индикация)
(7) 243 --------D0,D1,D2,D3,D4,D5,D6,D7
(8) 243+17 -----D0,D1,D2,D3,D4,D5,D6,D7 + D8 (динамическая индикация)
(9) 243+49 -----D0,D1,D2,D3,D4,D5,D6,D7 + D8,D9 (динамическая индикация)
(10) 243+113 ---D0,D1,D2,D3,D4,D5,D6,D7 + D8,D9,D10 (динамическая индикация)
(11) 241 -------D0,D1,D2,D3,D4,D5,D6,D7,D8,D9,D10,D11
(12) 241+16 ----D0,D1,D2,D3,D4,D5,D6,D7,D8,D9,D10,D11 + D12 (динамическая индикация)
(13) 241+48 ----D0,D1,D2,D3,D4,D5,D6,D7,D8,D9,D10,D11 + D12,D13 (динамическая индикация)
(14) 241+112 ---D0,D1,D2,D3,D4,D5,D6,D7,D8,D9,D10,D11 + D12,D13,D14 (динамическая индикация)
(15) 240 -------D0,D1,D2,D3,D4,D5,D6,D7,D8,D9,D10,D11,D12,D13,D14,D15
*/