This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

4 bit LCD code using msp430G2231 microcontroller



Hello, I'm working on MSP430G2231 microcontroller, I want to send 4bit data on LCD port pins but m unable to get even LCD cursor blinking so Please help me out. I have used external crystal of 32KHz. Please reply soon m waiting for suggestions and please tell me if there are any mistakes in my code....please please please   :( Thank you!

 

 

#include<MSP430G2231.h>

#define RS 0x02 ;  // P1.1(3) 
#define RW 0x04;  // P1.2(4)
#define E  0x08;  // P1.3(5)

//#define bWDTFLAG  STATUS.FLAG2  // status flag for WATCHDOG timer
#define FALSE  0
#define TRUE   1

#define LINE_1_ADDRESS 0x80    
#define LINE_2_ADDRESS 0xC0

#define WDT_MDLY_4          (WDTPW+WDTTMSEL+WDTCNTCL)   // 4ms interval (default)
#define WDT_MDLY_1          (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS0)  // 1ms     "
#define WDT_MDLY_0_0625     (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1)  // 0.0625ms   "
#define WDT_MDLY_0_008      (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1+WDTIS0) // 0.008ms "

void init();
void LcdCommand(unsigned char CommandData );
void send_data(unsigned char data);
void test();
void vWait(unsigned int uibaseinterval, unsigned char ucrounds);
volatile unsigned int i;
void main()
{
WDTCTL = WDTPW + WDTHOLD;       // Stop watchdog timer
BCSCTL1 |=  DIVA_2;                      // ACLK = LFXT1 = HF XTAL
BCSCTL3 |= LFXT1S_0;             // 3 – 16MHz crystal or resonator
  do
  {
    IFG1 &= ~OFIFG;                      // Clear OSCFault flag
    for (i = 0xFF; i > 0; i--);          // Time for flag to set
  }
  while (IFG1 & OFIFG);                  // OSCFault flag still set?
BCSCTL2 |= SELM_3 + DIVM_2;              // MainCLK = LFXT1 (safe)
P1SEL |= 0xFE;        // Select the 
P1DIR |= 0xFE;
init();
test();
}

void init()
{
 //Make RS and RW 0
  P1OUT &= ~RS;
  P1OUT &= ~RW;
  P1OUT &= ~E;
 
 vWait(WDT_MDLY_4, 20);    // 80ms delay
 LcdCommand(0x38);      // FUNCTION_SET
 vWait(WDT_MDLY_0_0625, 8);   // 0.50ms delay
 LcdCommand(0x38);     // FUNCTION_SET
 vWait(WDT_MDLY_0_0625, 8);   // 0.50ms delay
 LcdCommand(0x38);     // FUNCTION_SET
 vWait(WDT_MDLY_0_0625, 8);   // 0.50ms delay
 LcdCommand(0x06);     // SET_ENTRY_MODE_1
 vWait(WDT_MDLY_4, 3);    // 12ms delay
 LcdCommand(0x0F);     // DISPLAY_ON,Cursor ON,cursor blink
}

void LcdCommand(unsigned char CommandData)
{
 P1OUT &= ~E;
 P1OUT &= ~RS;
 vWait(WDT_MDLY_0_0625, 8);   // 0.50ms delay
 P1OUT |= E;
 vWait(WDT_MDLY_0_0625, 8);   // 0.50ms delay
 P1OUT=(CommandData & 0xF0);
 vWait(WDT_MDLY_0_0625, 8);   // 0.50ms delay
 P1OUT &= ~E;
 
 P1OUT &= ~E;
 P1OUT &= ~RS;
 vWait(WDT_MDLY_0_0625, 8);   // 0.50ms delay
 P1OUT |= E;
 vWait(WDT_MDLY_0_0625, 8);   // 0.50ms delay
 P1OUT=((CommandData<<4) & 0xF0);
 vWait(WDT_MDLY_0_0625, 8);   // 0.50ms delay
 P1OUT &= ~E;
}

void send_data(unsigned char data)
{
P1OUT |= RS;
P1OUT &= ~E;
vWait(WDT_MDLY_0_0625, 2);   // 0.125ms delay
P1OUT |= E;
P1OUT =(data& 0xF0);
vWait(WDT_MDLY_0_0625, 5);   // 0.3125ms delay
P1OUT &= ~E;


P1OUT |= RS;
P1OUT &= ~E;
vWait(WDT_MDLY_0_0625, 2);   // 0.125ms delay
P1OUT |= E;
P1OUT =((data<<4)& 0xF0);
vWait(WDT_MDLY_0_0625, 5);   // 0.3125ms delay
P1OUT &= ~E;

}

void vWait(unsigned int uibaseinterval, unsigned char ucrounds)
{
  IFG1 &= ~WDTIFG;                    // reset timer status flag
  WDTCTL = uibaseinterval;            // set watchdog timer interval time
  IE1 |= WDTIE;                       // enable watchdog timer interrupt, 1
  while(ucrounds > FALSE)
  {
    while(WDTIFG == FALSE)            // wait for Timer Interrupt
    {
      __no_operation();
    }
   IFG1 &= ~WDTIFG;                   // reset timer status flag
    ucrounds--;
  }
  WDTCTL = WDTPW + WDTHOLD;           // Stop WDT
  IE1 &= ~WDTIE;                      // disable watchdog timer interrupt, 0
  return;
}                      
 
void test()
{
P1OUT &= ~RS;
P1OUT &= ~E;
vWait(WDT_MDLY_0_0625, 8);   // 0.50ms delay
P1OUT |= E;
vWait(WDT_MDLY_0_0625, 8);   // 0.50ms delay
send_data((0x81)|(LINE_1_ADDRESS + 1));
vWait(WDT_MDLY_0_0625, 8);   // 0.50ms delay
P1OUT &= ~E;
P1OUT |= RS;

send_data('M');
send_data('S');
send_data('P');
send_data('4');
send_data('3');
send_data('0');
}

#pragma vector = WDT_VECTOR
__interrupt void vTimerWDT_IntMode(void)
{
    IFG1 |= WDTIFG;                      // set timer status flag
}


please read the code and help me out....

**Attention** This is a public forum