| @ -0,0 +1,168 @@ | |||
| #include <msp430fr6989.h> | |||
| //GPIO definitions | |||
| #define CSBdefinition P1SEL1 |= BIT4 // Configure UCA0STE (slave select) | |||
| #define CLKdefinition P1SEL1 |= BIT5 // Configure UCA0CLK | |||
| #define SIMOdefinition P2SEL0 |= BIT0 // Configure UCA0SIMO/TXD | |||
| //Output configuration | |||
| #define DDRP1 P1DIR = 0x78; // 0111 1000 | |||
| #define DDRP2 P1DIR |= BIT0; | |||
| ///////////////////////////////////////// | |||
| #define RST_0 P1OUT &= ~BIT3 | |||
| #define RST_1 P1OUT |= BIT3 | |||
| #define CSB_0 P1OUT &= ~BIT4 | |||
| #define CSB_1 P1OUT |= BIT4 | |||
| #define RS_0 P1OUT &= ~BIT6 | |||
| #define RS_1 P1OUT |= BIT6 | |||
| #define SI_0 P2OUT &= ~BIT0 | |||
| #define SI_1 P2OUT |= BIT0 | |||
| // Global variables | |||
| unsigned char text1[] = {"Hi :D "}; | |||
| unsigned char text2[] = {"It's done! "}; | |||
| unsigned int position; | |||
| //************************** | |||
| // MSP430F59xx Demo - eUSCI_A0, SPI 4-Wire Master | |||
| // | |||
| // Description: SPI master send data to SPI slave using 4-wire mode. | |||
| // ACLK = 32.768kHz, MCLK = SMCLK = DCO ~1MHz. BRCLK = ACLK/2 | |||
| // | |||
| // | |||
| // MSP430FR6989 | |||
| // ----------------- | |||
| // /|\| XIN|- | |||
| // | | | 32KHz Crystal | |||
| // --|RST XOUT|- | |||
| // | | | |||
| // | P2.0|-> Data Out (UCA0SIMO) | |||
| // | | | |||
| // | P1.3|-> RST LCD | |||
| // | P1.6|-> RS LCD | |||
| // | P1.5|-> Serial Clock Out (UCA0CLK) | |||
| // | P1.4|-> Slave Select (UCA0STE) | |||
| // | | | |||
| // | |||
| // William Goh | |||
| // Texas Instruments Inc. | |||
| // April 2014 | |||
| // Built with IAR Embedded Workbench V5.60 & Code Composer Studio V6.0 | |||
| //************************** | |||
| /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //Function initialization | |||
| void initLCD(); | |||
| void initSPI(); | |||
| void display(); | |||
| void wData(unsigned char d); | |||
| void wCommand(unsigned char c); | |||
| volatile unsigned char TXData; | |||
| /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| void main(void) | |||
| { | |||
| WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer | |||
| PM5CTL0 &= ~LOCKLPM5; // Disable the GPIO power-on default high-impedance mode to activate | |||
| /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //Pin configuration | |||
| CSBdefinition; // Configure UCA0STE (slave select) | |||
| CLKdefinition; // Configure UCA0CLK | |||
| SIMOdefinition; // Configure UCA0SIMO/TXD | |||
| PJSEL0 |= BIT4 | BIT5; // For XT1 | |||
| DDRP1; | |||
| DDRP2; | |||
| initSPI(); | |||
| initLCD(); | |||
| __delay_cycles(50); | |||
| display(); | |||
| __delay_cycles(50); | |||
| while(1){ | |||
| } | |||
| }//main | |||
| /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| void initSPI(void){ | |||
| // Configure USCI_A0 for SPI operation | |||
| UCA0CTLW0 = UCSWRST; // **Put state machine in reset** | |||
| UCA0CTLW0 |= UCSSEL__SMCLK; // Choose SMLCK (1MHz) | |||
| UCA0BR0 = 0x04;//4 // Set prescaler to 8 to get SCLK=125kHz | |||
| UCA0BR1 = 0; | |||
| UCA0MCTLW = 0; | |||
| // By default -> 4-pin, 8-bit SPI master | |||
| UCA0CTLW0 |= UCMST; // Master mode | |||
| UCA0CTLW0 |= UCSYNC; // Synchronous mode | |||
| UCA0CTLW0 |= UCCKPL; // Clock polarity high | |||
| UCA0CTLW0 |= UCMSB; // MSB first (Most Significant Bit) | |||
| UCA0CTLW0 |= UCMODE_2; // 4-pin SPI with UCxSTE active high | |||
| UCA0CTLW0 |= UCSTEM; // Generate the enable signal for a 4-wire slave | |||
| UCA0CTLW0 &= ~UCSWRST; // **Initialize USCI state machine** | |||
| UCA0IE |= UCTXIE; // Enable USCI_A0 TX interrupt | |||
| UCA0IFG &= ~UCTXIFG; | |||
| } | |||
| /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //Initialize the LCD | |||
| void initLCD(){ | |||
| RST_0; //reset | |||
| __delay_cycles(2); | |||
| RST_1; //end reset | |||
| __delay_cycles(20); | |||
| wCommand(0x30); //wake up | |||
| __delay_cycles(2); | |||
| wCommand(0x30); //wake up | |||
| wCommand(0x30); //wake up | |||
| wCommand(0x39); //function set | |||
| wCommand(0x14); //internal osc frequency | |||
| wCommand(0x56); //power control | |||
| wCommand(0x6D); //follower control | |||
| wCommand(0x70); //contrast | |||
| wCommand(0x0C); //display on | |||
| wCommand(0x06); //entry mode | |||
| wCommand(0x01); //clear | |||
| __delay_cycles(100); | |||
| } | |||
| void wCommand(unsigned char c){ | |||
| CSB_0; //CSB active | |||
| RS_0; //Command/Instruction | |||
| UCA0TXBUF = c; | |||
| CSB_1; //CSB disabled | |||
| __delay_cycles(200); | |||
| } | |||
| void wData(unsigned char d){ | |||
| CSB_0; //CSB active | |||
| RS_1; //Data | |||
| UCA0TXBUF = d; | |||
| CSB_1; //CSB disabled | |||
| } | |||
| void display(){ | |||
| int a; | |||
| wCommand(0x80); | |||
| for(a=0; a<16; a++){ | |||
| wData(text1[a]); | |||
| } | |||
| wCommand(0xC0); | |||
| for(a=0; a<16; a++){ | |||
| wData(text2[a]); | |||
| } | |||
| } | |||