#include<msp430x14x.h>
#include"12864.h"
#define uchar unsigned char
#define uint unsigned int
#define LCD_DataIn P4DIR=0x00 //数据口方向设置为输入
#define LCD_DataOut P4DIR=0xff //数据口方向设置为输出
#define LCD2MCU_Data P4IN
#define MCU2LCD_Data P4OUT
#define LCD_CMDOut P3DIR|=0x07 //P3口的低三位设置为输出
#define LCD_RS_H P3OUT|=BIT0 //P3.0
#define LCD_RS_L P3OUT&=~BIT0 //P3.0
#define LCD_RW_H P3OUT|=BIT1 //P3.1
#define LCD_RW_L P3OUT&=~BIT1 //P3.1
#define LCD_EN_H P3OUT|=BIT2 //P3.2
#define LCD_EN_L P3OUT&=~BIT2 //P3.2
/***********************************************************
延时函数
delay 2.5us at 8M
************************************************************/
void Delay_us(unsigned char i)//
{
unsigned char ii;
for(ii =i;ii > 0;ii--)
{
_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();
}
}
/********************************************
函数名称: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 WriteCmd(uchar cmd)
{
LCD_RS_L;
LCD_RW_H;
LCD_DataIn;
CheckBusy();
LCD_DataOut;
LCD_RW_L;
MCU2LCD_Data = cmd;
LCD_EN_H;
_NOP();
LCD_EN_L;
}
/*******************************************
函数名称:Write_Data
功 能:向液晶中写显示数据
参 数:dat--显示数据
返回值 :无
********************************************/
void WriteData(uchar dat)
{
LCD_RS_L;
LCD_RW_H;
LCD_DataIn;
CheckBusy();
LCD_DataOut;
LCD_RS_H;
LCD_RW_L;
MCU2LCD_Data = dat;
LCD_EN_H;
_NOP();
LCD_EN_L;
}
/*******************************************
函数名称:Ini_Lcd
功 能:初始化液晶模块
参 数:无
返回值 :无
********************************************/
void InitLcd(void)
{
LCD_CMDOut; //液晶控制端口设置为输出
Delay_Nms(500);
WriteCmd(0x30); //基本指令集
Delay_1ms();
WriteCmd(0x02); // 地址归位
Delay_1ms();
WriteCmd(0x0c); //整体显示打开,游标关闭
Delay_1ms();
WriteCmd(0x01); //清除显示
Delay_1ms();
WriteCmd(0x06); //游标右移
Delay_1ms();
WriteCmd(0x80); //设定显示的起始地址
}
/*******************************************
函数名称:Disp_HZ
功 能:控制液晶显示汉字
参 数:addr--显示位置的首地址
pt--指向显示数据的指针
num--显示字符个数
返回值 :无
********************************************/
void DispLine(uchar addr,uchar * pt,uchar num)
{
uchar i;
WriteCmd(addr);
for(i = 0;i < (num*2);i++)
WriteData(*(pt++));
}
/*******************************************
函数名称:Clear_GDRAM
功 能:清除液晶GDRAM中的随机数据
参 数:无
返回值 :无
********************************************/
void FillGDRAM(uchar data)
{
uchar i,j,k;
WriteCmd(0x34); //打开扩展指令集
i = 0x80;
for(j = 0;j < 32;j++)
{
WriteCmd(i++);
WriteCmd(0x80);
for(k = 0;k < 16;k++)
{
WriteData(data);
}
}
i = 0x80;
for(j = 0;j < 32;j++)
{
WriteCmd(i++);
WriteCmd(0x88);
for(k = 0;k < 16;k++)
{
WriteData(data);
}
}
WriteCmd(0x30); //回到基本指令集
}
/*******************************************
函数名称:Draw_TX
功 能:显示一个16*16大小的图形
参 数:Yaddr--Y地址
Xaddr--X地址
dp--指向图形数据存放地址的指针
返回值 :无
********************************************/
void DrawAlarm(uchar Yaddr,uchar Xaddr,uchar * dp)
{
uchar j;
uchar k=0;
WriteCmd(0x34); //使用扩展指令集,关闭绘图显示
for(j=0;j<16;j++)
{
WriteCmd(Yaddr++); //Y地址
WriteCmd(Xaddr); //X地址
WriteData(dp[k++]);
WriteData(dp[k++]);
}
WriteCmd(0x36); //打开绘图显示
WriteCmd(0x30); //回到基本指令集模式
}
//=========================================
//函数功能:显示bmp图像(GDRAM)
//=========================================
void DrawBMP(unsigned char *bmp)
{
uchar i,j;
WriteCmd(0x36); //扩充指令,绘图打开
for(i=0;i<32;i++)
{
WriteCmd(0x80+i); //先送垂直地址
WriteCmd(0x80); //再送水平地址,显示图片的上半部分
for(j=0;j<16;j++)
{
WriteData(*bmp++);
}
}
for(i=0;i<32;i++)
{
WriteCmd(0x80+i); //先送垂直地址
WriteCmd(0x88); //显示图片的下半部分
for(j=0;j<16;j++)
{
WriteData(*bmp++);
}
}
WriteCmd(0x30); //基本指令,绘图关闭
}
/*************************************************************
向LCD读数据函数
************************************************************/
unsigned char ReadData()
{
unsigned char data;
CheckBusy(); //判断忙标,以确保上一指令/数据模块已经接收处理完
LCD_DataIn; //设置io 为输入LCD 读数据
LCD_EN_L;
LCD_RS_H;
LCD_RW_H; //RW=1 选择读操作
Delay_us(5);
LCD_EN_H; //LCD 使能
Delay_us(1);
data = LCD2MCU_Data; //往LCD 送数据
Delay_us(100); //延时
LCD_EN_L; //关使能
Delay_us(10); // 延迟
return (data);
}
void CheckBusy(void)
{
uchar lcdtemp = 0;
do //判忙
{
LCD_EN_H;
_NOP();
lcdtemp = LCD2MCU_Data;
LCD_EN_L;
}
while(lcdtemp & 0x80);
}
/****************************************************************************
画点函数(过程:读->修改->写)
x,y坐标区间分别为[0,127]、[0,63](即:0<= x <=127,0<= y <=63)
4个顶点坐标:
(0,0)________________(127,0)
| |
| 12864 |
| LCD |
(0,63)|_______________ |(127,63)
(X, Y )为点坐标;
***************************************************************************/
void DrawPoint(unsigned char x,unsigned char y)
{
unsigned char Row,Tier,Tier_bit;
unsigned char ReadOldH,ReadOldL;
WriteCmd(0x34);
WriteCmd(0x36); //设定为扩展指令,8位数据操作
Tier = x >> 4;
Tier_bit = x & 0x0f;
if(y < 32)
{
Row = y;
}
else
{
Row = y -32;
Tier += 8;
}
WriteCmd(0x80 + Row);
WriteCmd(0x80 + Tier);
ReadOldH = ReadData(); //读取当前显示高8位数据
ReadOldL = ReadData(); //读取当前显示低8位数据
Delay_us(250);
WriteCmd(0x80 + Row);
WriteCmd(0x80 + Tier);
Delay_us(250);
if(Tier_bit < 8)//判断当前是高8位还是低8位
{
ReadOldH |= (0x01 << (7 - Tier_bit));
WriteData(ReadOldH);
WriteData(ReadOldL);
}
else
{
ReadOldL |= (0x01 << (15 - Tier_bit));
WriteData(ReadOldH);
WriteData(ReadOldL);
}
WriteCmd(0x30);
}