打印

msp430f5438控制12864液晶进入判忙程序后跳不出来

[复制链接]
2971|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ssliudh1226|  楼主 | 2012-10-13 21:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序如下:红颜色标注的是判忙程序 程序每次进入后都不停的WHILE循环, 我认为不是程序原因,但电路是学习板也是没问题的
#include <msp430f5438.h>
typedef unsigned char uchar;
typedef unsigned int uint;
extern const unsigned char shuzi_table[];
#define LCD_DataIn P4DIR=0x00 //数据口方向设置为输入
#define LCD_DataOut P4DIR=0xff //数据口方向设置为输出
#define LCD2MCU_Data P4IN
#define MCU2LCD_Data P4OUT
#define LCD_CMDOut P3DIR|=0x4c //P3口的低三位设置为输出
#define LCD_RS_H P3OUT|=BIT2 //P3.0
#define LCD_RS_L P3OUT&=~BIT2 //P3.0
#define LCD_RW_H P3OUT|=BIT3 //P3.1
#define LCD_RW_L P3OUT&=~BIT3 //P3.1
#define LCD_EN_H P3OUT|=BIT6 //P3.2
#define LCD_EN_L P3OUT&=~BIT6 //P3.2
/*******************************************
函数名称:Delay_1ms
功 能:延时约1ms的时间
参 数:无
返回值 :无
********************************************/
void Delay_1ms(void)
{
uchar i;

for(i = 150;i > 0;i--) _NOP();
}
/*******************************************
函数名称:Delay_Nms
功 能:延时N个1ms的时间
参 数:n--延时长度
返回值 :无
********************************************/
void Delay_Nms(uint n)
{
uint i;

for(i = n;i > 0;i--) Delay_1ms();
}
/*******************************************
函数名称:Write_Cmd
功 能:向液晶中写控制命令
参 数:cmd--控制命令
返回值 :无
********************************************/
void Write_Cmd(uchar cmd)
{
uchar lcdtemp = 0;

LCD_RS_L;
LCD_RW_H;
LCD_DataIn;
do //判忙
{
LCD_EN_H;
_NOP();
lcdtemp = LCD2MCU_Data;
LCD_EN_L;

}
while(lcdtemp & 0x80);

LCD_DataOut;
LCD_RW_L;
MCU2LCD_Data = cmd;
LCD_EN_H;
_NOP();
LCD_EN_L;
}
/*******************************************
函数名称:Write_Data
功 能:向液晶中写显示数据
参 数:dat--显示数据
返回值 :无
********************************************/
void Write_Data(uchar dat)
{
uchar lcdtemp = 0;

LCD_RS_L;
LCD_RW_H;
LCD_DataIn;
do //判忙
{
LCD_EN_H;
_NOP();
lcdtemp = LCD2MCU_Data;
LCD_EN_L;
}
while(lcdtemp & 0x80);

LCD_DataOut;
LCD_RS_H;
LCD_RW_L;

MCU2LCD_Data = dat;
LCD_EN_H;
_NOP();
LCD_EN_L;
}
/*******************************************
函数名称:Ini_Lcd
功 能:初始化液晶模块
参 数:无
返回值 :无
********************************************/
void Ini_Lcd(void)
{
LCD_CMDOut; //液晶控制端口设置为输出

Delay_Nms(500);
Write_Cmd(0x30); //基本指令集
Delay_1ms();
Write_Cmd(0x02); // 地址归位
Delay_1ms();
Write_Cmd(0x0c); //整体显示打开,游标关闭
Delay_1ms();
Write_Cmd(0x01); //清除显示
Delay_1ms();
Write_Cmd(0x06); //游标右移
Delay_1ms();
Write_Cmd(0x80); //设定显示的起始地址
}
/*******************************************
函数名称:Disp_HZ
功 能:控制液晶显示汉字
参 数:addr--显示位置的首地址
pt--指向显示数据的指针
num--显示字符个数
返回值 :无
********************************************/
void Disp_HZ(uchar addr,const uchar * pt,uchar num)
{
uchar i;

Write_Cmd(addr);
for(i = 0;i < (num*2);i++)
Write_Data(*(pt++));
}

相关帖子

沙发
ssliudh1226|  楼主 | 2012-10-13 21:02 | 只看该作者
求助啊

使用特权

评论回复
板凳
wukunshan| | 2012-10-19 14:08 | 只看该作者
一看你的程序,写得都不太规范。你应该把判断忙的过程单独写一个函数。把红色部分的代码改为下面的代码试一下:
uchar lcdtemp = 0;
LCD_DataIn;
LCD2MCU_Data=0xff;
LCD_EN_L;
LCD_RS_L;
LCD_RW_H;
LCD_EN_H;
do //判忙
{
    lcdtemp = LCD2MCU_Data;
}
while((lcdtemp & 0x80)==0x80);
LCD_EN_L;

使用特权

评论回复
地板
ZG11211| | 2012-10-22 22:22 | 只看该作者
驱动方式和硬件是否有误?无法得到正确的应答,肯定跳不出来的。

使用特权

评论回复
5
nqyijian| | 2012-10-25 10:16 | 只看该作者
不一定是软件问题。

使用特权

评论回复
6
orangelxlf| | 2012-10-25 20:55 | 只看该作者
我也碰见过这种问题,把单片机的主频降下来就能跳出循环了。一直没时间,也没研究到底是怎么回事,你可以把单片机的工作频率改改看看。

使用特权

评论回复
7
orangelxlf| | 2012-10-25 20:57 | 只看该作者
网络不好,发了两遍,见谅

使用特权

评论回复
8
ic_ecore| | 2012-11-2 21:28 | 只看该作者
程序

使用特权

评论回复
9
P0.0| | 2012-11-4 20:59 | 只看该作者
1# ssliudh1226

改成这样看看

uchar lcdtemp = 0;

LCD_RS_L;
LCD_RW_H;
LCD_DataIn;

LCD_EN_H;
_NOP();
do //判忙
{
lcdtemp = LCD2MCU_Data;
LCD_EN_L;

}
while(lcdtemp & 0x80);

使用特权

评论回复
10
xuxikfg| | 2012-11-4 23:19 | 只看该作者
同意楼上的

使用特权

评论回复
11
joing1999| | 2012-11-5 08:38 | 只看该作者
用延时跳过去吧,一样的。半毫秒

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

30

帖子

1

粉丝