Hello sir/mam,
I am interfacing MSP430G2553 microcontroller with Silicon Technolabs LCD 16X2 Alphanumeric Display(JHD162A) .My code is given below and Hardware connections are also attached.After powering up the board,the LCD glows but why the characters
#include "msp430g2553.h"
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#define delay_value 500
void LCD_Init(void)
{
send_cmd(0x38); // configure LCD as 2 lined 5x7 matrix
delayms(delay_value);
send_cmd(0x0E); //display on, cursor blink
delayms(delay_value);
send_cmd(0x06); // auto <span id="IL_AD10" class="IL_AD">increment</span> of cursor
delayms(delay_value);
send_cmd(0x01); // <span id="IL_AD3" class="IL_AD">clear display</span>
delayms(delay_value);
}
void send_cmd(unsigned char command)
{
P1OUT &= 0X00;
P2OUT &= 0X00;
P2OUT = command;
P1OUT &= 0X00;
P1OUT &= ~0x40; // RS = 0 for command, P1.6 0x40
//RW is grounded
P1OUT &= ~0x80; //EN = 0, P1.7, 0x80
delayms(delay_value);
P1OUT |= 0x80; // EN = 1, P1.7, 0x80
delayms(delay_value);
P1OUT &= ~0x80; //EN = 0, P1.7, 0x80
delayms(delay_value);
}
void send_char(unsigned char character)
{
P1OUT &= 0X00;
P2OUT &= 0X00;
P2OUT = character;
// P1OUT &= 0x00;
P1OUT |= 0x40; // RS = 0 for command, P1.6
// RW is grounded
P1OUT &= ~0x80; //EN = 0, P1.7
delayms(delay_value);
P1OUT |= 0x80; // EN = 1, P1.7
delayms(delay_value);
P1OUT &= ~0x80; //EN = 0, P1.7
delayms(delay_value);
}
void send_string(char *String)
{
unsigned char i=0;
while(String[i]!='\0')
{
P1OUT &= 0X00;
P2OUT &= 0X00;
P2OUT = String[i];
P1OUT |= 0x40; // RS = 0 for command, P1.6
// RW is grounded
P1OUT &= ~0x80; //EN = 0, P1.7
delayms(delay_value);
P1OUT |= 0x80; // EN = 1, P1.7
delayms(delay_value);
P1OUT &= ~0x80; //EN = 0, P1.7
delayms(delay_value);
if(i>=16) // If the number of characters in the string > 16, then the below command automatically
send_cmd(0x18); // Shift the display right side
delayms(40000); // 100 millisec <span id="IL_AD5" class="IL_AD">delay</span>
i++;
}
}
void delayms(unsigned int value)
{
unsigned int i;
for(i=0;i< __delay_cycles;i++);
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
BCSCTL1 = CALBC1_1MHZ; // Set DCO
DCOCTL = CALDCO_1MHZ;
BCSCTL2 &= ~(DIVS_3); //This line of code ensures that the SMCLK divider is 0,
// so we have SMCLK=DCO=1MHz (in fact if we are to have a /8 divider, it should be BCSCTL2 |= DIVS_3;).
P1DIR = 0xFF; // make P1 as output
P2DIR = 0xFF; // make P2 as output
P2SEL = 0; // These two are "Function Select Registers PxSEL and PxSEL2",
P2SEL2 = 0; // If both are zero's means simple I/O function is selected.
P1DIR |= 0x01; // Set P1.0 to output direction
P1REN |= 0x01;
delayms(1500); // wait for more than 15ms after supply rises to 4.5V
send_cmd(0x30);
delayms(400); // wait more than 4.1ms
send_cmd(0x30);
delayms(100); // wait more than 100us, but delayms(1) will provide 1ms
send_cmd(0x30);
delayms(100);
send_cmd(0x02); // return to home
delayms(100);
LCD_Init(); // LCD initialization
while(1)
{
send_cmd(0x01); // clear display
delayms(delay_value);
send_cmd(0x81); // clear display
delayms(delay_value);
send_string("NPEDUCATIONS");
delayms(delay_value);
send_cmd(0xC0); // clear display
delayms(delay_value);
send_string("http://www.npeducations.com");
delayms(delay_value);
}
}
are not showing?