#define F_CPU 1200000UL
#include <avr/io.h>
#include <util/delay.h>
#define latchPin 1//8
#define clockPin 2//12
#define dataPin 0//11
char tik=0,tik2=3; //счётчик для генератора случайных чисел
#define RAND_MAX 5 //максимальное число
word myArr1[] = {0b0000000010000000,0b0000000000000010,0b1000000000000000,0b0000001000000000,0b0000010000000000,0b0100000000000000,0b0000000000000100,0b0000000001000000}; // массив для бегущей точки
byte dice[] = {0b00010000,0b10000100,0b10010100,0b11000110,0b11010110,0b11101110};
unsigned char display[2];
void write_display(unsigned char *data, unsigned char nbytes)
{
unsigned char mask,i;
for(i = 0; i < nbytes; i++)
{
mask = 0x80;
for(char k = 0; k < 8; k++)
{
// Сравниваем каждый бит с единицей
if(data[i] & mask)
{
PORTB |= (1 << PB0); // DATA 1
PORTB |= (1 << PB2); // CLK 1
PORTB &= ~(1 << PB2); // CLK 0
}
else
{
PORTB &= ~(1 << PB0); // DATA 0
PORTB |= (1 << PB2); // CLK 1
PORTB &= ~(1 << PB2); // CLK 0
}
mask = mask >> 1; // Сдвигаем биты
}
}
// Защелкиваем регистр
PORTB |= (1 << PB1);
PORTB &= ~(1 << PB1);
}
int main( void )
{
DDRB |= (1<<latchPin);
DDRB |= (1<<clockPin);
DDRB |= (1<<dataPin);
DDRB &= ~(1<<4);
display[0] = dice[0];
display[1] = dice[0];
write_display(display,2);
while(1)
{
tik++; //таймер для настройки генератора случайных чисел.
if(tik>RAND_MAX){tik=0;}
tik2--;
if(tik2<0){tik2=RAND_MAX;}
for (byte i=RAND_MAX; i>tik; i--){
tik2--;
if(tik2<0){tik2=RAND_MAX;}
}
if(!(PINB&(1<<4))) //Если нажата, то…
{
_delay_ms(100); //задержка для защиты от дребезга
while(!(PINB&(1<<4))); //Ждем, когда отпустят кнопку
for (byte i=0; i<8;i++){
display[0] = myArr1[i]>>8;
display[1] = myArr1[i];
write_display(display,2);
_delay_ms(100);
}
display[0] = dice[tik];
display[1] = dice[tik2];
write_display(display,2);
_delay_ms(100);
}}}