#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);
}
|