打印
[MSP430]

用msp430f4152控制12864LCD显示屏,但是LCD判忙跳不出去,求大神

[复制链接]
4999|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

#include <msp430x41x2.h>
#include "Lcd12864.h"

/**********************************宏定义**************************************/

#define DATA_DIR_IN     P5DIR&=~0XFF  
#define DATA_DIR_OUT        P5DIR|=0XFF   
#define CTRL_DIR_OUT    P3DIR|=BIT0
#define CTRL_OUT        P3OUT|=BIT0
#define LCD2MCU_Data    P5IN
#define MCU2LCD_Data    P5OUT
#define CLR_RS          P1OUT&=~BIT4
#define SET_RS          P1OUT|=BIT4
#define CLR_RW          P1OUT&=~BIT6
#define SET_RW          P1OUT|=BIT6
#define CLR_EN          P7OUT&=~BIT6
#define SET_EN          P7OUT|=BIT6

/******************************************************************************/


/*******************************************
函数名称:Delay1ms
功    能:延时约1ms的时间
参    数:无
返回值  :无
********************************************/
void Delay1ms(void)
{
    char i;

    for(i = 150;i > 0;i--)  _NOP();
}

/*******************************************
函数名称:DelayNms
功    能:延时N个1ms的时间
参    数:n--延时长度
返回值  :无
********************************************/
void DelayNms(int n)
{
    int i;

    for(i = n;i > 0;i--)    Delay1ms();
}

/*******************************************
函数名称:WaitForEnable
功    能:判忙,等到忙结束
参    数:无
返回值  :无
********************************************/
void WaitForEnable()
{
    char busy=0;
    CLR_RS;     //P1OUT&=~BIT4  RS设置为命令
    SET_RW;     //P1OUT&=~BIT6  RW设置为读
    DATA_DIR_IN;   //P5DIR&=~0XFF  P5数据口为输入,从LCD到MUC
    SET_EN;
    _NOP();
    do                       //判忙
    {
        busy = LCD2MCU_Data;  //将LCD中读到的数据赋值给busy
        CLR_EN;
    }
    while(busy & 0x80);  //读到命令的busy的最高位就代表是否忙,为1则忙,为0则空闲
    DATA_DIR_OUT;  //P5DIR|=0XFF  P5数据口为输出,从MUC到LCD
}

/*******************************************
函数名称:LcdWriteComm
功    能:向液晶中写控制命令
参    数:cmd--控制命令
返回值  :无
********************************************/
void LcdWriteComm(unsigned char cmd)
{
   WaitForEnable();    //检测忙信号?

    CLR_RS;
    CLR_RW;

    MCU2LCD_Data = cmd;        //写命令

    SET_EN;
    _NOP();
    CLR_EN;
}

/*******************************************
函数名称:LcdWriteData
功    能:向液晶中写显示数据
参    数:data--显示数据
返回值  :无
********************************************/
void LcdWriteData(unsigned char data)
{
  WaitForEnable();

    SET_RS;
    CLR_RW;

    MCU2LCD_Data = data;        //写数据

    SET_EN;
    _NOP();
    CLR_EN;
}

/*******************************************
函数名称:LcdInit
功    能:初始化液晶模块
参    数:无
返回值  :无
********************************************/
void LcdInit()
{
    CTRL_OUT;
    DelayNms(500);
    LcdWriteComm(0x30);     //基本指令集
    LcdWriteComm(0x01);     //清屏,地址00H
    LcdWriteComm(0x06);     //光标的移动方向
    LcdWriteComm(0x0c);     //开显示,关游标
}

/*******************************************
函数名称:LcdWriteString
功    能:向液晶写入字符串,可以是汉字
参    数:
        addr:写入地址(显示地址)
             0x80-0x87:第一行
             0x90-0x97:第二行
             0x88-0x8F:第三行
             0x98-0x9F:第四行
        str:要显示的字符串,原则上是中文字符
             串,如果是英文字符串,必须两个一
             起,如果只需一个,就添加一个空格
返回值  :无
********************************************/

void LcdWriteString(char addr, char *str)
{
    LcdWriteComm(addr);
    while(*str!='\0')
    {
        LcdWriteData(*str);
        str++;
    }
}

/*******************************************
函数名称:LcdReadData
功    能:从液晶中读取数据
参    数:无
返回值  :读取得到的数据
********************************************/
char LcdReadData()
{
    char ch;

    WaitForEnable();

    SET_RS;
    SET_RW;

    DATA_DIR_IN;

    SET_EN;
    _NOP();

    ch = LCD2MCU_Data;        //读数据
    CLR_EN;
    DATA_DIR_OUT;

    return ch;
}

/*******************************************
函数名称:LcdReadAddr
功    能:从液晶中读取当前位置地址
参    数:无
返回值  :读取得到的地址(0x80-0x9F)
********************************************/
char LcdReadAddr()
{
    char ch;

    WaitForEnable();

    CLR_RS;
    SET_RW;

    DATA_DIR_IN;

    SET_EN;
    _NOP();

    ch = LCD2MCU_Data;        //读数据
    CLR_EN;
    DATA_DIR_OUT;

    return (ch|0x80);
}

3.jpg (259.98 KB )

3.jpg

2.jpg (158.9 KB )

2.jpg

相关帖子

沙发
风之神515|  楼主 | 2014-5-13 09:11 | 只看该作者
接下来这是main函数中的部分
void ClkInit()
{
//   char i;
//   BCSCTL1 &= ~XT2OFF;             //打开XT2振荡器
//   IFG1&=~OFIFG;                   //清除振荡错误标志
  //  while((IFG1&OFIFG)!=0)
  //  {
  //      for(i=0;i<0xff;i++);
//       IFG1&=~OFIFG;               //清除振荡错误标志
//   }
//   BCSCTL2 |= SELM_2+SELS+DIVS_3;  //MCLK为8MHz,SMCLK为1MHz
    FLL_CTL0 |= XCAP11PF;                     // Configure load caps
    for(unsigned int n=0; n<1000;n++);     // Delay for 32 kHz crystal to stabilize
}

/****************************************************************************
* 名    称:main主程序
* 功    能:设置串口,输出信息,从串口读计算机键盘输入数据,测试串口收发
* 入口参数:无
* 出口参数:无
****************************************************************************/
void main( void )
{
    // Stop watchdog timer to prevent time out reset
    WDTCTL = WDTPW + WDTHOLD;
    ClkInit();  
    P4DIR |=BIT0;       //指示灯端口配置为输出
    P1DIR|=BIT4+BIT6;   //RS(P1.4)和RW(P1.6)配置为输出
    P7DIR|=BIT6;        //EN使能端配置为输出
    P3DIR|=BIT0;       //PSB端配置为输出
    LcdInit();
    while(1)
    {
    LcdWriteString(0x90,"1 你好啊");
    P4OUT |=BIT0;
    delaynms(1000);
    P4OUT &=~BIT0;
    delaynms(1000);
    }
}

使用特权

评论回复
板凳
风之神515|  楼主 | 2014-5-13 09:12 | 只看该作者
如何跳出判忙程序,求大神指点一二

使用特权

评论回复
地板
风之神515|  楼主 | 2014-5-13 10:23 | 只看该作者
解决了   不是程序的问题,硬件连接接触不良造成的   

使用特权

评论回复
5
风之神515|  楼主 | 2014-5-13 20:12 | 只看该作者
/*******************************************
函数名称:WaitForEnable
功    能:判忙,等到忙结束
参    数:无
返回值  :无
********************************************/
void WaitForEnable()
{
   char busy=0xff;
    CLR_RS;     //P1OUT&=~BIT4  RS设置为命令
    SET_RW;     //P1OUT&=~BIT6  RW设置为读
    DATA_DIR_IN;   //P5DIR&=~0XFF  P5数据口为输入,从LCD到MUC
   
    do                       //判忙
    {
        SET_EN;
        _NOP();
        busy = LCD2MCU_Data;  //将LCD中读到的数据赋值给busy
        CLR_EN;
    }
    while(busy & 0x80);  //读到命令的busy的最高位就代表是否忙,为1则忙,为0则空闲
    DATA_DIR_OUT;  //P5DIR|=0XFF  P5数据口为输出,从MUC到LCD
}
还是代码的问题,这样就可以解决了!

使用特权

评论回复
6
okboy927| | 2014-5-15 14:16 | 只看该作者
你的问题已经彻底解决了吗?

使用特权

评论回复
7
okboy927| | 2014-5-15 14:17 | 只看该作者
我的也是这种 老是检测忙

使用特权

评论回复
8
okboy927| | 2014-5-15 14:26 | 只看该作者
我用的MSP430F149控制LCD12864
也是一直在LCD12864忙检测。
请问你用的液晶是+5V的液晶?
哪个型号的?
如果用+5V的液晶  单片机的端口能和液晶的数据端口直连吗(单片机是+3.3V)

使用特权

评论回复
9
ayb_ice| | 2014-5-15 14:37 | 只看该作者
void WaitForEnable()
{
    char busy=0;
    CLR_RS;     //P1OUT&=~BIT4  RS设置为命令
    SET_RW;     //P1OUT&=~BIT6  RW设置为读
    DATA_DIR_IN;   //P5DIR&=~0XFF  P5数据口为输入,从LCD到MUC
    SET_EN;
    _NOP();
    do                       //判忙
    {
        busy = LCD2MCU_Data;  //将LCD中读到的数据赋值给busy
        CLR_EN;
    }
    while(busy & 0x80);  //读到命令的busy的最高位就代表是否忙,为1则忙,为0则空闲
    DATA_DIR_OUT;  //P5DIR|=0XFF  P5数据口为输出,从MUC到LCD
}

首先你这个要连续读忙标志,需要连续产生时钟,但你没有
其次好象高表示不忙,你正好相反

说明: 我没有看手册,是看以前的程序做出的判断,不一定正确

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
风之神515 + 3 赞一个!
10
wsnsyy| | 2014-5-15 14:54 | 只看该作者
哪裡接觸不良造成的

使用特权

评论回复
11
风之神515|  楼主 | 2014-5-19 10:02 | 只看该作者
okboy927 发表于 2014-5-15 14:16
你的问题已经彻底解决了吗?

对啊  参考楼上代码

使用特权

评论回复
12
风之神515|  楼主 | 2014-5-19 10:03 | 只看该作者
okboy927 发表于 2014-5-15 14:26
我用的MSP430F149控制LCD12864
也是一直在LCD12864忙检测。
请问你用的液晶是+5V的液晶?

我用的LCD是LCM12864R,+5V供电    可以直接连接   显示没问题  

使用特权

评论回复
13
风之神515|  楼主 | 2014-5-19 10:04 | 只看该作者
okboy927 发表于 2014-5-15 14:17
我的也是这种 老是检测忙

稍微小小的修改了一下代码  就好了   

使用特权

评论回复
14
风之神515|  楼主 | 2014-5-19 10:05 | 只看该作者
ayb_ice 发表于 2014-5-15 14:37
void WaitForEnable()
{
    char busy=0;

没有呐   5楼我已经解释清楚啦   

使用特权

评论回复
15
风之神515|  楼主 | 2014-5-19 10:06 | 只看该作者
wsnsyy 发表于 2014-5-15 14:54
哪裡接觸不良造成的

检测忙的代码问题   硬件连接入上图所示,没有问题   解决方法如5楼所示  

使用特权

评论回复
16
ayb_ice| | 2014-5-19 10:31 | 只看该作者
风之神515 发表于 2014-5-19 10:05
没有呐   5楼我已经解释清楚啦

你的代码是有隐患的,
只是你每次运行到检测忙标志的时候,已经不忙了,所以一次成功了,

如果当时确实忙,你的代码就有问题了

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
风之神515 + 3 赞一个!
17
ayb_ice| | 2014-5-19 10:32 | 只看该作者
如果接触不良,应该送数据也会有问题

使用特权

评论回复
18
风之神515|  楼主 | 2014-5-19 16:46 | 只看该作者
ayb_ice 发表于 2014-5-19 10:31
你的代码是有隐患的,
只是你每次运行到检测忙标志的时候,已经不忙了,所以一次成功了,

忙检测位是数据位的最高位(相当于是P5.7位),如果它确实忙的话,可以循环等待其空闲,比如说它在什么情况下会忙?忙的是时候不可以等待直至其空闲么? 求探讨。。。

使用特权

评论回复
19
风之神515|  楼主 | 2014-5-19 16:48 | 只看该作者
ayb_ice 发表于 2014-5-19 10:32
如果接触不良,应该送数据也会有问题

按照我1楼的硬件连接电路图,这个连接没有问题吧?   接触不存在问题   

使用特权

评论回复
20
ayb_ice| | 2014-5-19 16:48 | 只看该作者
风之神515 发表于 2014-5-19 16:46
忙检测位是数据位的最高位(相当于是P5.7位),如果它确实忙的话,可以循环等待其空闲,比如说它在什么情 ...

可以等待啊,但要不停的送时钟,然后读取,这是同步时序电路

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
风之神515 + 3 赞一个!
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

110

帖子

0

粉丝