/* * 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 #include #define BIT(x) ( 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); } 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(0x03); // -> 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<=4; i++) { // spi_slaveSelect(0); // Select display chip //spi_write(i); // digit adress: (digit place) //spi_write(0); // digit value: 0 //spi_slaveDeSelect(0); // Deselect display chip spi_writeCommand(i,i); } wait(1000); // write 4-digit data for (unsigned char i =1; i<=4; i++) { //spi_slaveSelect(0); // Select display chip //spi_write(i); // digit adress: (digit place) //spi_write(i); // digit value: i (= digit place) //spi_slaveDeSelect(0); // Deselect display chip spi_writeCommand(i,i); wait(1000); } wait(1000); return (1); }