/* Seven-segment display counter * * This program counts number 0-3 on the seven segment display. * The seven segment display is driven by a shift register which is * connected to UCB0 in SPI mode. * * Built and tested with MSP432P401R Rev. C, Keil MDK-ARM v5.24a and MSP432P4xx_DFP v3.1.0 */ #include "msp.h" void delayMs(int n); void sevenseg_init(void); void UCB0_write(unsigned char data); int main(void) { const static unsigned char digitPattern[] = {0x3F, 0x06, 0x5B, 0x4F}; static int i; sevenseg_init(); /* initialize UCB0 that connects to the shift registers */ while(1) { UCB0_write(~digitPattern[i]); /* write digit pattern to the seven segments */ if (++i > 3) i = 0; delayMs(1000); } } /* configure UCB0 and associated GPIO pins */ void sevenseg_init(void) { EUSCI_B0->CTLW0 = 0x0001; /* soft reset */ EUSCI_B0->CTLW0 = 0xE9C1; /* SPI master PH=1, PL=1 */ EUSCI_B0->CTLW0 &= ~0x0001; /* out of reset */ P1->SEL0 |= (1 << 5) | (1 << 6); /* P1.5, P1.6 for UCB0 */ P1->SEL1 &= ~((1 << 5) | (1 << 6)); /* P2.3 as slave select */ P2->DIR |= 1 << 3; /* P2.3 set as output */ P2->OUT |= 1 << 3; /* /SS idle high */ } /* This function enables slave select, writes one byte to UCB0, */ /* wait for transmit complete and deassert slave select. */ void UCB0_write(unsigned char data) { P2->OUT &= ~(1 << 3); /* assert slave select */ EUSCI_B0->TXBUF = data; /* write data */ while(EUSCI_B0->STATW & 0x01) ; /* wait for transmit done */ P2->OUT |= 1 << 3; /* deassert slave select */ } /* system clock at 3 MHz */ void delayMs(int n) { int i, j; for (j = 0; j < n; j++) for (i = 750; i > 0; i--); /* Delay */ }