// chip Registers addresses:
#define NO_OP 0x00
#define DECODE_MODE 0X09
#define INTENSITY 0x0A
#define SCAN_LIMIT 0x0B
#define SHUTDOWN 0X0C
#define DISPLAY_TEST 0X0F
//Operation
#define NORMAL_OPERATION 1
#define TEST_OFF 0
#define TEST_ON 1
//Decode mode
#define NO_DECODE 0X00
#define CODE_B_D0 0x01
#define CODE_B_D3_D0 0x0F
#define CODE_B_D7_D0 0xFF
#define ALL_DIGITS 7
void Write_to_display(uint8_t address, uint8_t cData)
{
PORTB &= ~(1 << PORTB2);
SPDR = address;
while (!(SPSR & (1 << SPIF)));
SPDR = cData;
while (!(SPSR & (1 << SPIF)));
_delay_us(1);
PORTB |= (1 << PORTB2);
}
void Matrix_init(void)
{
Write_to_display(DISPLAY_TEST, TEST_OFF); //test mode off
Write_to_display(SCAN_LIMIT, ALL_DIGITS);
Write_to_display(SHUTDOWN, NORMAL_OPERATION);
Write_to_display(INTENSITY, 7);
Write_to_display(DECODE_MODE, NO_DECODE);
}
void Write_to2_display(uint8_t address, uint8_t cData)
{
PORTB &= ~(1 << PORTB2);
SPDR = address;
while (!(SPSR & (1 << SPIF)));
SPDR = cData;
while (!(SPSR & (1 << SPIF)));
SPDR = address;
while (!(SPSR & (1 << SPIF)));
SPDR = cData;
while (!(SPSR & (1 << SPIF)));
_delay_us(1);
PORTB |= (1 << PORTB2);
}
void Matrix2_init(void)
{
Write_to2_display(DISPLAY_TEST, TEST_OFF);
Write_to2_display(SCAN_LIMIT, ALL_DIGITS);
Write_to2_display(SHUTDOWN, NORMAL_OPERATION);
Write_to2_display(INTENSITY, 7);
Write_to2_display(DECODE_MODE, NO_DECODE);
}
void SPI_MasterInit(void);
void SPI_MasterTx(uint8_t cData);
void Write_to_display(uint8_t address, uint8_t cData);
void Matrix_init();
void setup() {
// put your setup code here, to run once:
SPI_MasterInit();
Matrix_init();
}
void loop() {
// put your main code here, to run repeatedly:
//for(int i =1; i<=8;i++)
//{
//Write_to_display(i,0xff);
//_delay_ms(10);
//}
for(int i =0; i<=7;i++)
{
Write_to_display(i+1,1<<i);
_delay_ms(10);
}
_delay_ms(500);
}
void SPI_MasterInit(void)
{
/* Set MOSI and SCK output, all others input */
DDRB |= (1 << PORTB3 ) | (1 << PORTB5) | (1 << PORTB2 );
/* Enable SPI, Master, set clock rate Fck/16 */
SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR0);
PORTB |= (1 << PORTB2);
}
void SPI_MasterTx(uint8_t cData)
{
PORTB &= ~(1 << PORTB2);
SPDR = cData;
while (!(SPSR & (1 << SPIF)));
PORTB |= (1 << PORTB2);
}