|
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);
}
大家能说说局部变量 和全局变量一般什么时候用不。 谢谢了。
|
|