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....