MSP430+LCD1602显示实验
LCD12864同样适用
1、本实验用开发板
2、程序代码
3、实验效果

1、本实验用开发板
使用的模块是TI官方的MSP430F5529开发板,只需更改引脚即可适用于其他型号的MSP430开发板。

2、程序代码
代码如下:

#include "MSP430F5529.h"
#define uchar unsigned char
#define uint unsigned int
#define CPU_F ((double)8000000)   //外部高频晶振8MHZ
//#define CPU_F ((double)32768)   //外部低频晶振32.768KHZ
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
//12864/1602液晶控制管脚
#define RS_CLR                P6OUT &= ~BIT1           //RS置低
#define RS_SET                P6OUT |=  BIT1           //RS置高

#define RW_CLR                P6OUT &= ~BIT2           //RW置低
#define RW_SET                P6OUT |=  BIT2          //RW置高

#define EN_CLR                P6OUT &= ~BIT3           //E置低
#define EN_SET                P6OUT |=  BIT3           //E置高
//彩屏/12864液晶/1602液晶的数据口,三液晶共用
#define DataDIR         P3DIR                     //数据口方向
#define DataPort        P3OUT                     //P4口为数据口


void clock_init()
{
  UCSCTL3 = SELREF_2;                       // Set DCO FLL reference = REFO
  UCSCTL4 |= SELA_2;                        // Set ACLK = REFO
  UCSCTL0 = 0x0000;                         // Set lowest possible DCOx, MODx

  // Loop until XT1,XT2 & DCO stabilizes - In this case only DCO has to stabilize
  do
  {
    UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);
                                            // Clear XT2,XT1,DCO fault flags
    SFRIFG1 &= ~OFIFG;                      // Clear fault flags
  }while (SFRIFG1&OFIFG);                   // Test oscillator fault flag

  __bis_SR_register(SCG0);                  // Disable the FLL control loop
  UCSCTL1 = DCORSEL_5;                      // Select DCO range 16MHz operation
  UCSCTL2 |= 249;                           // Set DCO Multiplier for 8MHz
                                            // (N + 1) * FLLRef = Fdco
                                            // (249 + 1) * 32768 = 8MHz
  __bic_SR_register(SCG0);                  // Enable the FLL control loop

  // Worst-case settling time for the DCO when the DCO range bits have been
  // changed is n x 32 x 32 x f_MCLK / f_FLL_reference. See UCS chapter in 5xx
  // UG for optimization.
  // 32 x 32 x 8 MHz / 32,768 Hz = 250000 = MCLK cycles for DCO to settle
  __delay_cycles(250000);
}

//*************************************************************************
//                        初始化IO口子程序
//*************************************************************************
void Port_init()
{
        P1DIR|=BIT0;
        P1OUT|=BIT0;
        P3SEL = 0x00;
        P3DIR = 0xFF;                   //数据口输出模式
        P6SEL = 0x00;
        P6DIR|= BIT1 + BIT2 + BIT3;     //控制口设置为输出模式
}

//***********************************************************************
//        显示屏命令写入函数
//***********************************************************************
void LCD_write_com(unsigned char com)
{
        RS_CLR;
        RW_CLR;
        EN_SET;
        DataPort = com;                 //命令写入端口
        delay_ms(5);
        EN_CLR;
}

//***********************************************************************
//        显示屏数据写入函数
//***********************************************************************
void LCD_write_data(unsigned char data)
{
        RS_SET;
        RW_CLR;
        EN_SET;
        DataPort = data;                //数据写入端口
        delay_ms(5);
        EN_CLR;
}

//***********************************************************************
//        显示屏清空显示
//***********************************************************************
void LCD_clear(void)
{
        LCD_write_com(0x01);            //清屏幕显示
        delay_ms(5);
}

//***********************************************************************
//        显示屏字符串写入函数
//***********************************************************************
void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s)
{

    if (y == 0)
    {
            LCD_write_com(0x80 + x);        //第一行显示
    }
    else
    {
            LCD_write_com(0xC0 + x);        //第二行显示
    }

    while (*s)
    {
            LCD_write_data( *s);
            s ++;
    }
}

//***********************************************************************
//        显示屏单字符写入函数
//***********************************************************************
void LCD_write_char(unsigned char x,unsigned char y,unsigned char data)
{

    if (y == 0)
    {
            LCD_write_com(0x80 + x);        //第一行显示
    }
    else
    {
            LCD_write_com(0xC0 + x);        //第二行显示
    }

    LCD_write_data( data);
}

//***********************************************************************
//        显示屏初始化函数
//***********************************************************************
void LCD_init(void)
{
    LCD_write_com(0x38);                //显示模式设置
    delay_ms(5);
    LCD_write_com(0x08);                //显示关闭
    delay_ms(5);
    LCD_write_com(0x01);                //显示清屏
    delay_ms(5);
    LCD_write_com(0x06);                //显示光标移动设置
    delay_ms(5);
    LCD_write_com(0x0C);                //显示开及光标设置
    delay_ms(5);
}

void main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  clock_init();
  uchar i,*p;
  Port_init();                        //系统初始化,设置IO口属性
  delay_ms(100);                      //延时100ms
  LCD_init();                         //液晶参数初始化设置
  LCD_clear();                        //清屏
   while (1)
      {
                i = 1;
                p = "12345678";                //字符串输出显示
                LCD_clear();
                LCD_write_str(0,0,"Welcome.MSP430");
                delay_ms(250);

                while (*p) {
                        LCD_write_char(i,1,*p);      //单个字符输出显示
                        i ++;
                        p ++;
                        delay_ms(100);               //延时250ms
                        }
                delay_ms(250);
                P1OUT^=BIT0;
      }
}

3、接线

RS P6.1
RW P6.2
EN P6.3
D0 ~D7 P3.0~P3.7
A(背光+) 5V
K(背光-) GND

4、实验效果如图:

下面一行“12345678”挨个字符依次显示,可以在程序更改想要显示的字符。
使用 LCD1602需要注意的是
引脚3:VL为液晶显示器对比度调节端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”现象,使用时可以通过一个10k的电位器调整其对比度。