/* * 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 #include #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< 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); }