3737|4

83

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

430单片机 1602液晶(一个局部变量与全局变量区别迷惑) [复制链接]

#include "msp430x24x.h"
typedef unsigned char uchar;
typedef unsigned int  uint;
/***************宏定义**************************/
#define  DataDir     P4DIR
#define  DataPORT    P4OUT    //输出。
#define  Busy        0x80
#define  CtrLDDir    P3DIR
#define  CLR_RS      P3OUT&=~BIT0;   //RS=P3.0   0
#define  SET_RS      P3OUT|=BIT0;     //          1
#define  CLR_RW      P3OUT&=~BIT1;   //RW=P3.1     0
#define  SET_RW      P3OUT|=BIT1;    //            1
#define  CLR_EN      P3OUT&=~BIT2;   //EN=P3.2      0
#define  SET_EN      P3OUT|=BIT2;    //              1
/***********************************************/
uchar table[]="123456789";
uchar table1[]=" i like msp430" ;
uchar m,n,i=0;               //如果把i我设置成全局变量,显示就是完整的。显示123456789.
                              //如果把i设置局部变量, 会显示23456789. 不会显示数组的第一位。
void delay_lcd(void)
{

  for(i=0;i<200;i++);
}
/***************检测忙信号*********************/
void WaitForEnable(void)
{
  DataDir &=0X00;  //将P4口切换到输入状态
  CLR_RS;
  SET_RW;
   _NOP();
  SET_EN;
  _NOP();
  _NOP();
  
  while((P4IN & Busy) != 0);  //检测忙标志
  CLR_EN;
  P4DIR|=0XFF;   //将P4口切换到输出状态
}

/***************写指令*********************/
void LcdWriteCommand(uchar cmd)      
{

  CLR_RS;
  CLR_RW;
  _NOP();
  DataPORT=cmd;      //将命令写入数据端口。
  _NOP();
  SET_EN             //产生使能脉冲信号。
   _NOP();
   _NOP();
  CLR_EN;
  
}

/***************写数据*********************/
void LcdWriteData(uchar Data)
{
  
  SET_RS ;
  CLR_RW;
  
  DataPORT=Data;     //数据写入数据端口。
  _NOP();
  SET_EN             //产生使能脉冲信号。
   _NOP();
   _NOP();
  CLR_EN;
}
/***************LCD初始化*********************/
void Lcdinit(void)
{
  CtrLDDir|=0x07;               // 控制I0口为输出模式
  DataDir=0xff;                //数据端口为输出

  LcdWriteCommand(0x38);      //显示模式设置
  LcdWriteCommand(0x06);     //读写字符时,地址指针加1 ,整体不移动。
  LcdWriteCommand(0x0c);     //显示开,不开光标,不闪烁
  LcdWriteCommand(0x08);    //关闭显示
  
//LcdWriteCommand(0x01);     //清显示,光标复位到地址00H
  
  
}
void DispNchar(uchar x,uchar y,uchar n,uchar *ptr)
{
   //uchar i;                                  //就是这里,如果i设置到这里,就不对了。不会显示数组的第一位了。
   LcdWriteCommand(0X80+0X40*y+x);
  for (i = 0;i < n;i ++)
  {
    LcdWriteData( ptr );
  }
DataPORT;
}





void main(void)
{
  WDTCTL=WDTHOLD+WDTPW;
   Lcdinit();
   DispNchar(0,0,10,table) ;
   DispNchar(0,1,10,table1) ;
   while(1);




}
大家能说说局部变量 和全局变量一般什么时候用不。 谢谢了。

最新回复

会不会是楼主你的堆栈溢出了。定义变量到静态存储区没事,定义到栈区就有事,有溢出的可能性。。。楼主可以在仿真环境下,看看堆栈的情况。  详情 回复 发表于 2010-5-22 00:16
点赞 关注

回复
举报

58

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
这就奇怪了,我觉得i应该设为局部变量比较合适吧,因为它只在DispNchar中指示待显示字符的位置,和其他无关啊
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
初始化后加个长延时试试,这个1602有时很恶心。。。
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

4
 
就看这段代码,i是局部变量还是全局变量,应该没有区别。这个现象是有点奇怪。
一般来说这种循环控制变量应该用局部变量比较好。

另一个问题:
#define CLR_RS P3OUT&=~BIT0;
这种宏定义后面一般不加分号的。
如果加了分号,这样的代码就会出问题:
if (xxx)
   CLR_RS;
else
   yyy;
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

5
 
会不会是楼主你的堆栈溢出了。定义变量到静态存储区没事,定义到栈区就有事,有溢出的可能性。。。楼主可以在仿真环境下,看看堆栈的情况。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表