129 lines
3.9 KiB
C
129 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
|
|
*/
|
|
#define F_CPU 10e6
|
|
#include <avr/io.h>[-]
|
|
#include <util/delay.h>
|
|
#define BIT(x) ( 1<<x )
|
|
#define DDR_SPI DDRB // spi Data direction register
|
|
#define PORT_SPI PORTB // spi Output register
|
|
#define SPI_SCK 1 // PB1: spi Pin System Clock
|
|
#define SPI_MOSI 2 // PB2: spi Pin MOSI
|
|
#define SPI_MISO 3 // PB3: spi Pin MISO
|
|
#define SPI_SS 0 // PB0: spi Pin Slave Select
|
|
// wait(): busy waiting for 'ms' millisecond - used library: util/delay.h
|
|
void wait(int ms)
|
|
{
|
|
for (int i=0; i<ms; i++)
|
|
_delay_ms(1);
|
|
}
|
|
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);
|
|
}
|
|
|
|
void spi_writeCommand(unsigned char adress, unsigned char data)
|
|
{
|
|
spi_slaveSelect(0);
|
|
spi_write(adress);
|
|
spi_write(data);
|
|
spi_slaveDeSelect(0);
|
|
}
|
|
|
|
// 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(0x04); // ->the hex value here selects the intensity (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(0x07); // -> 1 = Display digits 0..1 the hex value here selects how many segments get initialized
|
|
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
|
|
}
|
|
// 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
|
|
}
|
|
int main()
|
|
{
|
|
DDRB=0x01; // Set PB0 pin as output for display select
|
|
spi_masterInit(); // Initialize spi module
|
|
displayDriverInit(); // Initialize display chip
|
|
// clear display (all zero's)
|
|
|
|
for (unsigned char i =1; i<=8; i++)
|
|
{
|
|
spi_writeCommand(i,0);
|
|
}
|
|
wait(1000);
|
|
// write 4-digit data
|
|
for (unsigned char i =1; i<=8; i++)
|
|
{
|
|
spi_writeCommand(i,i);
|
|
wait(1000);
|
|
}
|
|
wait(1000);
|
|
return (1);
|
|
} |