151 lines
3.9 KiB
C
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);
|
|
} |