use strict;
use warnings;
use POSIX qw( strftime );
use Device::FTDI::SPI;
use Time::HiRes qw( sleep );
my $spi = Device::FTDI::SPI->new(
mode => 0,
clock_rate => 1E6,
);
sub max7221_write_digit
{
my ( $digit, $value ) = @_;
$spi->write( pack "C C", $digit+1, $value );
}
# Decode mode all
$spi->write( pack "C C", 0x09, 0xff );
# Intensity medium
$spi->write( pack "C C", 0x0A, 4 );
# Scan Limit 8
$spi->write( pack "C C", 0x0B, 7 );
# Display test for 1 second on startup
$spi->write( pack "C C", 0x0F, 1 );
# Blank all the digits
$spi->write( pack "C C", $_, 0x0f ) for 1 .. 8;
# No shutdown
$spi->write( pack "C C", 0x0C, 1 )->get;
sleep 1;
# Display test off
$spi->write( pack "C C", 0x0F, 0 )->get;
while(1) {
my $digits = strftime "%H%M%S", localtime();
print "Time: $digits\n";
max7221_write_digit( 0, substr $digits, 5, 1 );
max7221_write_digit( 1, substr $digits, 4, 1 );
max7221_write_digit( 3, substr $digits, 3, 1 );
max7221_write_digit( 4, substr $digits, 2, 1 );
max7221_write_digit( 6, substr $digits, 1, 1 );
max7221_write_digit( 7, substr $digits, 0, 1 )->get;
sleep 1;
}