You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

168 lines
5.6 KiB

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