Hello,
I'm learning on my 4 module of LED matrix 8x8, I did showing a letter and did little of letters scroll but the data crashes on the end of the display.
I want to learn how:
- Scroll letters or data without crash.
- Scroll of one display.
- Scroll of multiple displays.
This is my code:
void SPI_Init(void);
void SPI_TX_s16(uint16_t data);
void SPI_TX_m16(uint16_t data);
void MAX7219_init(void);
void draw(void);
void clr(void);
void setup() {
SPI_Init();
MAX7219_init();
}
void loop() {
clr();
_delay_ms(100);
draw();
_delay_ms(200);
}
void SPI_Init(void)
{
DDRB |= (1<<DDB3)|(1<<DDB5)|(1<<DDB2); // DDB3 MOSI, DDB5 SCrow, DDB2 SS
SPCR = (1<<SPE)|(1<<MSTR); // SPI enable, Master Mode
}
void MAX7219_init(void)
{
SPI_TX_s16(0x0A00); // intensity
SPI_TX_s16(0x0900); // decode mode
SPI_TX_s16(0x0B07); // scan limit
SPI_TX_s16(0x0C01); // shutdown on
}
void SPI_TX_s16(uint16_t data) // for single bytes
{
PORTB &= ~(1<<PB2);
SPDR = data>>8;
while(!(SPSR & (1<<SPIF)));
SPDR = data;
while(!(SPSR & (1<<SPIF)));
PORTB |= (1<<PB2);
}
void SPI_TX_m16(uint16_t data) // for multiple byte
{
SPDR = data>>8;
while(!(SPSR & (1<<SPIF)));
SPDR = data;
while(!(SPSR & (1<<SPIF)));
}
void draw(void)
{
s=0;
for (l=0;l<26;l++) // to print 26 letters
{
for (row=1;row<9;row++) // for 8 matrix rows
{
PORTB &= ~(1<<PB2);
for (p=0;p<4;p++) // for 4 matrix devices
{
SPI_TX_m16(data = (row<<8) | (Alphabet[s]));
}PORTB |= (1<<PB2);s++;
}_delay_ms(500);
}
}
void clr(void)
{
for (k=1;k<4;k++)
{
for (i=1;i<10;i++)
{
PORTB &= ~(1<<PB2);
SPI_TX_s16(data = i<<8 | (0x00));
PORTB |= (1<<PB2);
}
}
}
Thank you,