MSP430 1602LCD程序

之前做51的时候,点亮1602觉得很简单,玩过德飞莱的板子,今天第一次拿到MSP430F5529,手里头只有几根杜邦线和一块1602,想着把它点亮,数据口用的P3,RS、 RW、 EN这三根线分别是P1.3 P1.4 P1.5.   废话不多说,代码如下:

#include <msp430.h>

#define CPU_F ((double)8000000)
#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))

#define DataDir     P3DIR
#define DataPort    P3OUT
//#define Busy        0x80
//#define CtrlDir     P1DIR
#define RS_CLR P1OUT&=~BIT3;    //RS = P1.3
#define RS_SET P1OUT|=BIT3;
#define RW_CLR P1OUT&=~BIT4;    //RW = P1.4
#define RW_SET P1OUT|=BIT4;
#define EN_CLR P1OUT&=~BIT5;    //EN = P1.5
#define EN_SET P1OUT|=BIT5;

/*------------------------------------------------
              判忙函数
------------------------------------------------*/
 int LCD_Check_Busy(void)
 {
    DataPort= 0xFF;
    RS_CLR;
    RW_SET;
    EN_CLR;
    delay_ms(5);
    EN_SET;
    return (DataPort & 0x80);
 }

 void Port_init()
 {
     P1DIR |= BIT3+BIT4+BIT5;
     DataDir = 0xFF;
 }
/*------------------------------------------------
              写入命令函数
------------------------------------------------*/
 void LCD_Write_Com(unsigned char com)
 {
    // while(LCD_Check_Busy()); //忙则等待
    delay_ms(5);
    RS_CLR;
    RW_CLR;
    EN_SET;
    DataPort= com;
    delay_ms(5);
    EN_CLR;
 }
/*------------------------------------------------
              写入数据函数
------------------------------------------------*/
 void LCD_Write_Data(unsigned char Data)       //ok
 {
    //while(LCD_Check_Busy()); //忙则等待
    delay_ms(5);
    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_String(unsigned char x,unsigned char y,unsigned char *s)  //ok
 {
    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)      //OK
{
    if (y == 0)
    {
        LCD_Write_Com(0x80 + x);
    }
    else
    {
        LCD_Write_Com(0xC0 + x);
    }
        LCD_Write_Data(Data);
}
/*------------------------------------------------
              初始化函数
------------------------------------------------*/
void LCD_Init(void)                                    //ok
{
    LCD_Write_Com(0x38);    /*显示模式设置*/
    delay_ms(5);
    LCD_Write_Com(0x38);
    delay_ms(5);
    LCD_Write_Com(0x38);
    delay_ms(5);
    LCD_Write_Com(0x38);
    LCD_Write_Com(0x08);    /*显示关闭*/
    LCD_Write_Com(0x01);    /*显示清屏*/
    LCD_Write_Com(0x06);    /*显示光标移动设置*/
    delay_ms(5);
    LCD_Write_Com(0x0C);    /*显示开及光标设置*/
}

/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main(void)
{
    WDTCTL = WDTPW | WDTHOLD;        // stop watchdog timer

    Port_init();
    delay_ms(10);
    LCD_Init();
    LCD_Clear();//清屏
    while (1)
    {
        LCD_Write_Char(7,0,'o');
        LCD_Write_Char(8,0,'k');
        LCD_Write_String(0,1,"make it possible");
        while(1);
    }
}

//end

初始化那段也是按照1602的手册来的,有点啰嗦,本来想加个判忙,后面懒得再去弄了,感兴趣的可以直接调用了

希望可以对大家有点用

说实话,1602用的没那么多了,回头有空了再写个OLED的

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值