/*
max7221.c
Raspberry Pi driving the Max7221
to compile : gcc max7221.c -o max7221 -lwiringPi
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <wiringPi.h>
#include <wiringPiSPI.h>
// The Max7221 Registers :
#define DECODE_MODE 0x09
#define INTENSITY 0x0a
#define SCAN_LIMIT 0x0b
#define SHUTDOWN 0x0c
#define DISPLAY_TEST 0x0f
#define
NLEDS
4 // Number of Digits
#define SPI_CHANNEL
0 //
// Take a reg numer and data and send to the max7221
//
// reg_number : Register Address of max7221 (0x00-0x0f See
datasheet)
// dataout : Send Data
//
static void MAX7221Send (unsigned char reg_number,
unsigned char dataout)
{
unsigned char data[2];
int retCode;
data[0]=reg_number;
data[1]=dataout;
retCode=wiringPiSPIDataRW
(SPI_CHANNEL,data,sizeof(data));
}
void displayNumber(int digit, uint32_t number) {
int i;
uint8_t data;
uint32_t num = number;
for(i=0;i<digit;i++) {
data = num % 10;
// printf("data[%d]=%d ",i,data);
MAX7221Send(i+1
,data); // displays the 1 digit
number
num = num / 10;
}
// printf("\n");
}
int main (void)
{
int i,j;
int retCode;
printf ("\n\nRaspberry Pi Max7221 Test using
WiringPi\n\n");
if (wiringPiSPISetup(SPI_CHANNEL, 1000000) < 0)
{
printf("SPISetup failed:\n");
}
MAX7221Send(SCAN_LIMIT, NLEDS-1);
/*
BCD decode mode off : data bits correspond to the
segments (A-G and DP) of the seven segment display.
BCD mode on : 0 to 15 = 0 to 9, -, E, H,
L, P, and ' '
*/
MAX7221Send(DECODE_MODE, 0xff); // Set BCD decode
mode on
MAX7221Send(DISPLAY_TEST, 0); // Disable test mode
MAX7221Send(SHUTDOWN, 1);
// come out of shutdown mode(turn on the digits)
for(i=0;i<NLEDS;i++) {
MAX7221Send(i+1 ,i);
}
for(i=0;i<5;i++){
MAX7221Send(INTENSITY, i); // set
brightness
sleep(1);
}
for(i=0;i<16;i++) {
for(j=0;j<NLEDS;j++) {
MAX7221Send(j+1,i); //
displays the 4 digit number
}
delay(500);
}
for(i=0;i<1000;i++) {
displayNumber(NLEDS, i);
delay(100);
}
return 0;
}
|