MSP430驱动 液晶显示 屏程序怎么写。求大神指导。

2019-07-15 16:42发布

MSP430驱动 液晶显示 屏程序怎么写。求大神指导。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
6条回答
碎宇星魂
2019-07-16 15:44
#include "msp430f5438.h"

#define uint unsigned int
#define uchar unsigned char

/*****************************宏定义****************************************/
#define LCD_DIN_EN    P4DIR=0x00                    //数据口方向设置为输入
#define LCD_DOUT_EN   P4DIR=0xff                    //数据口方向设置为输出
#define LCD_DATA_IN   P4IN                          //数据输入
#define LCD_DATA_OUT  P4OUT                         //数据输出
#define LCD_CMD_EN    P2DIR |= 0x1f                 //控制信号号设置为输出
#define LCD_RS_1      P2OUT |= BIT0                 //数据/命令选择信号RS->1(数据)
#define LCD_RS_0      P2OUT &= ~BIT0                //RS->0(命令)
#define LCD_RW_1      P2OUT |= BIT1                 //读/写信号RW->1(读)
#define LCD_RW_0      P2OUT &= ~BIT1                //RW->0(写)
#define LCD_EN_1      P2OUT |= BIT2                 //使能信号EN->1
#define LCD_EN_0      P2OUT &= ~BIT2                //EN->0
#define LCD_PSB_1     P2OUT |= BIT3                 //并串选择PSB->1(并行)
#define LCD_PSB_0     P2OUT &= ~BIT3                //PSB->0(串行)
#define LCD_RST_1     P2OUT |= BIT4                 //复位端RST->1
#define LCD_RST_0     P2OUT &= ~BIT4                //RST->0(复位)

uchar num[]={"温度27度 "};

/**延时函数,us**/
void Delay(uint dtime)
{
    while (dtime--);
}

void Delay1ms(void)//1ms
{
    uint dtime = 300;
   
    while (dtime--);
}

void Delayms(uint dtime)
{
    while (dtime--)
    {
        Delay1ms();
    }
}

void Delays(uint dtime)
{
    while (dtime--)
        Delayms(1000);
}
/**检查忙函数,检测D7位的状态是否为1来判断当前液晶是否在处理程序**/
void CheckBusy(void)
{
    uchar lcdtemp = 0;
                       
    LCD_RS_0;                           //命令
    LCD_RW_1;                           //读状态
    LCD_DIN_EN;                         //数据输入使能
    do
    {
        LCD_EN_1;                       //Lcd使能
        _NOP();
               lcdtemp = LCD_DATA_IN;          //读取数据
               LCD_EN_0;
    }
    while (lcdtemp & 0x80);             //检测液晶是否忙
}

/**写指令函数**/
void WriteCmd(uchar cmd)
{
    CheckBusy();                        //等待液晶内部操作完成

    LCD_RS_0;                           //命令
    LCD_RW_0;                                  //写状态   
    LCD_EN_1;                           //使能   
    LCD_DOUT_EN;                        //数据输出使能
    LCD_DATA_OUT = cmd;                 //写命令                                                                 
    LCD_EN_0;
}
/**写数据函数**/
void  WriteData(uchar data)
{
    CheckBusy();                        //等待液晶内部操作完成
   
    LCD_RS_1;                           //数据
    LCD_RW_0;                           //写状态  
    LCD_EN_1;                           //使能Lcd
    LCD_DOUT_EN;                        //数据输出使能        
    LCD_DATA_OUT = data;                //输出数据
    LCD_EN_0;
}
/**显示字符函数:
addr是显示字符的首地址
*pStr是显示字符的数组
num是显示字符的个数
**/
void DispStr(uchar addr, uchar *pStr, uchar num)
{
    uchar i;
   
    WriteCmd(addr);                     //定位首地址
   
    for (i=0; i<num; i++)               //循环输出数据
        WriteData(*(pStr++));
}
/**显示汉字的函数
addr是显示汉字的首地址
*pStr使显示汉字的数组
num是显示汉字的个数
**/
void DispHZ(uchar addr, uchar *pStr, uchar num)
{
    uchar i;
   
    if ((addr % 2) == 1)                //汉字显示位置调整
        addr++;
    WriteCmd(addr);                     //定位首地址
   
    for (i=0; i<(num*2); i++)           //循环输出数据
        WriteData(*(pStr++));
}

void DispClrLcd(void)//清除显示
{
    WriteCmd(0x01);                     
}
/**初始化函数**/
void InitLcd(void)   
{   
    LCD_RST_0;                          //12864复位
    LCD_CMD_EN;                         //液晶控制端口设置为输出
    LCD_RST_1;
    LCD_PSB_1;                          //并行操作
   
    Delayms(500);
    WriteCmd(0x30);                     //选择基本指令集
    Delay1ms();
    WriteCmd(0x02);                     //地址归位
    Delay1ms();
    WriteCmd(0x0c);                     //整体显示打开,游标关闭
    Delay1ms();
    WriteCmd(0x01);                     //清除显示
    Delay1ms();
    WriteCmd(0x06);                     //游标右移
    Delay1ms();
    WriteCmd(0x80);                     //设定显示的起始地址
}

void main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
           InitLcd();
        DispHZ(0x80, num, 4);//显示汉字的函数
        Delayms(500);
        while(1);
}

一周热门 更多>