| @ -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]); | |||||
| } | |||||
| } | |||||