#define SCK PB5
#define MISO PB4
#define MOSI PB3
#define CS PB2
byte max7219_reg_noop = 0x00;
byte max7219_reg_digit0 = 0x01;
byte max7219_reg_digit1 = 0x02;
byte max7219_reg_digit2 = 0x03;
byte max7219_reg_digit3 = 0x04;
byte max7219_reg_digit4 = 0x05;
byte max7219_reg_digit5 = 0x06;
byte max7219_reg_digit6 = 0x07;
byte max7219_reg_digit7 = 0x08;
byte max7219_reg_decodeMode = 0x09;
byte max7219_reg_intensity = 0x0a;
byte max7219_reg_scanLimit = 0x0b;
byte max7219_reg_shutdown = 0x0c;
byte max7219_reg_displayTest = 0x0f;
int NUM_DEVICES=4; ///для циклической строки нужно сымитировать пустую матрицу
#define DDR_SPI DDRB
#define DD_MISO DDB4
#define DD_MOSI DDB3
#define DD_SCK DDB2
volatile uint8_t j=0;
volatile uint8_t i;
volatile uint32_t bfb=0; //буфер однрой огромной строки
unsigned int angryface_B[] = {0x00, 0x00, 0x66, 0x66, 0x00, 0x18, 0x24, 0x42};
//unsigned char angryface_B[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
//volatile
int main(void)//туловище программы
{
Serial.begin(115200); //инициализация монитора последовательного интерфейса
SPI_MasterInit();
DDRB |=(1 << SCK)|(1 << MOSI)|(1 << CS); // MISO не назначаем на выход
Send_7219(0x0b, 7);
Send_7219(0x0C, 1);
Send_7219(0x0F, 0);
Send_7219(0x00, 0x00);
Send_7219(0x00, 0x00);
sei();//разрещаем глобальные прерывания
while(1)//основной код программы
{
for(int j=8*(NUM_DEVICES);j>=0;--j)
{
for(i=0;i<8;++i)
{
bfb=angryface_B[i];//содержимое строки переносим в буфер
for(int k=4; k>=1; --k)
{
// if ((j<=20)&&(j>=12))
if ((j%4==1))
{//angryface_B[6]=angryface_B[6]^0x18;
angryface_B[6]=0x3C;
angryface_B[5]=0x00;
}
else
{
angryface_B[5]=0x18;
angryface_B[6]=0x24;
}
Send_7219(i, ((bfb<<(j)))>>(NUM_DEVICES-k)*8);//выводим содержимое огромного буфера, сдвинутого на j позиций во все три матрицы
}
MAX7219_update();//разрешаем всем трем матрицам вывести то, что им пришло в регистры
}
_delay_ms(100);
}
}
}
void SPI_MasterInit(void)
{
/* Set MOSI and SCK output, all others input */
DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK);
/* Enable SPI, Master, set clock rate fck/16 */
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
/*
(1<<SPR0); - частоту делим на 16
MSTR - мастер
SPE - SPI EN SPI Interrupt Enable
SPIE -
When the DORD bit is written to one, the LSB of the data word is transmitted first.
When the DORD bit is written to zero, the MSB of the data word is transmitted first.
*/
}
void SPI_MasterTransmit(char cData)
{
/* Start transmission */
SPDR = cData;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)));
}
void Send_7219(char rg, char dt)
{
//
//PORTB &= ~(1<<CS); // разрешаем работу SPI внешнего выбранного устройства
SPI_MasterTransmit(rg);//передаем адрес регистра
SPI_MasterTransmit(dt);//передаем данные
PORTB &= ~(1<<CS);
//PORTB |= (1<<CS);
// запрещаем работу SPI внешнего выбранного устройства
}
void MAX7219_update (void) {
PORTB |= (1<<CS);//дергаем ногой, что бы данные, записанные в буферный регистр 7219 были отправлены в регистры
PORTB &= ~(1<<CS);// возвращаем SPI в рабочий режим
}