Files
2016-03-22 10:14:17 +01:00

151 lines
3.9 KiB
C

/*
* Project name : Demo5_7a : spi - 7 segments display
* Author : Avans-TI, WvdE, JW
* Revision History : 20110228: - initial release; 20120307: - this version
* Description : This program sends data to a 4-digit display with spi
* Test configuration:
MCU: ATmega128
Dev.Board: BIGAVR6
Oscillator: External Clock 08.0000 MHz
Ext. Modules: Serial 7-seg display
SW: AVR-GCC
* NOTES : Turn ON switch 15, PB1/PB2/PB3 to MISO/MOSI/SCK
*/
#include <avr/io.h>
#include <util/delay.h>
#include "spi.h"
void spi_masterInit(void)
{
DDR_SPI = 0xff; // All pins output: MOSI, SCK, SS, SS_display
DDR_SPI &= ~BIT(SPI_MISO); // except: MISO input
PORT_SPI |= BIT(SPI_SS); // SS_ADC == 1: deselect slave
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1); // or: SPCR = 0b11010010;
// Enable spi, MasterMode, Clock rate fck/64
// bitrate=125kHz, Mode = 0: CPOL=0, CPPH=0
}
// Write a byte from master to slave
void spi_write( unsigned char data )
{
SPDR = data; // Load byte --> starts transmission
while( !(SPSR & BIT(SPIF)) ); // Wait for transmission complete
}
// Write a byte from master to slave and read a byte from slave - not used here
char spi_writeRead( unsigned char data )
{
SPDR = data; // Load byte --> starts transmission
while( !(SPSR & BIT(SPIF)) ); // Wait for transmission complete
data = SPDR; // New received data (eventually, MISO) in SPDR
return data; // Return received byte
}
// Select device on pinnumer PORTB
void spi_slaveSelect(unsigned char chipNumber)
{
PORTB &= ~BIT(chipNumber);
}
// Deselect device on pinnumer PORTB
void spi_slaveDeSelect(unsigned char chipNumber)
{
PORTB |= BIT(chipNumber);
}
// Initialize the driver chip (type MAX 7219)
void displayDriverInit()
{
spi_slaveSelect(0); // Select display chip (MAX7219)
spi_write(0x09); // Register 09: Decode Mode
spi_write(0xFF); // -> 1's = BCD mode for all digits
spi_slaveDeSelect(0); // Deselect display chip
spi_slaveSelect(0); // Select dispaly chip
spi_write(0x0A); // Register 0A: Intensity
spi_write(0x0F); // -> Level 4 (in range [1..F])
spi_slaveDeSelect(0); // Deselect display chip
spi_slaveSelect(0); // Select display chip
spi_write(0x0B); // Register 0B: Scan-limit
spi_write(0x03); // -> 1 = Display digits 0..3
spi_slaveDeSelect(0); // Deselect display chip
spi_slaveSelect(0); // Select display chip
spi_write(0x0C); // Register 0B: Shutdown register
spi_write(0x01); // -> 1 = Normal operation
spi_slaveDeSelect(0); // Deselect display chip
}
// Set display on ('normal operation')
void displayOn()
{
spi_slaveSelect(0); // Select display chip
spi_write(0x0C); // Register 0B: Shutdown register
spi_write(0x01); // -> 1 = Normal operation
spi_slaveDeSelect(0); // Deselect display chip
}
void spi_intensity(int intensity)
{
if(intensity < 0)
intensity = 0;
if(intensity > 0x0F)
intensity = 0x0F;
spi_slaveSelect(0); // Select dispaly chip
spi_write(0x0A); // Register 0A: Intensity
spi_write(intensity); // -> Level 4 (in range [1..F])
spi_slaveDeSelect(0); // Deselect display chip
}
// Set display off ('shut down')
void displayOff()
{
spi_slaveSelect(0); // Select display chip
spi_write(0x0C); // Register 0B: Shutdown register
spi_write(0x00); // -> 1 = Normal operation
spi_slaveDeSelect(0); // Deselect display chip
}
void spi_writeWord( unsigned char adress, unsigned char data )
{
spi_slaveSelect(0); // Select display chip
spi_write(adress); // Write address
spi_write(data); // Write data
spi_slaveDeSelect(0); // Deselect display chip
}
void writeLedDisplay( int value )
{
if(value > 9999 || value < -999)
return;
if(value < 0)
{
value = value - (value + value);
spi_writeWord(4, 10);
}
else
{
//Display 4
int d4 = value / 1000;
value = value % 1000;
spi_writeWord(4, d4);
}
//Display 3
int d3 = value / 100;
value = value % 100;
spi_writeWord(3, d3);
//Display 2
int d2 = value / 10;
value = value % 10;
spi_writeWord(2, d2);
//Display 1
int d1 = value;
spi_writeWord(1, d1);
}