#include "msp430x14x.h" // Standard Equations
#include "math.h"
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
#include "ctype.h"
#include "HZTable.h"
#include "ASCII816.h"
#define uint unsigned int
#define uchar unsigned char
//**********************************************
#define RS BIT0
#define RW BIT1
#define E BIT2
#define CS1 BIT3
#define CS2 BIT4
#define RST BIT5
#define EL BIT6 //背光
//数据线:p4口 ,控制线: p5口
//**********************************************
uchar cradd1,cradd2;
uchar item1[5]={0,1,2,3,50}; //欢迎使用
uchar item2[5]={4,5,6,7,50}; //请等待……
//=======================================================
void short_delay(uint i)
 { uint j;
 for(j=0;j<=i;j++);
 }
void delayms(uchar tickms)
 { uchar count,i;
 _NOP();
 _NOP();
 _NOP();
 for(i=tickms;i>0;i--)
 { for(count=0;count<=58;count++) {;}
 _NOP();
 }
 }
//**************************************************
void prl0(uchar com1)// 写指令代码子程序(左)
{
 P5DIR|=0X7F; //P5为输出口
 P5OUT|=CS1; //csa=1
 P5OUT&=~CS2; //csb=0
 P5OUT&=~RS;
 P5OUT|=RW; //RS=0,R/W=1,以便读液晶状态
 P4DIR=0x00; //P4口为输入口
 do
 {
 P5OUT|=E; //E=1
 cradd1=P4IN;
 P5OUT&=~E; //E=0
 }
 while((cradd1&0x80)!=0);
 P5OUT&=~RW; //rw=0
 P4DIR=0xff; //P4口为输出口
 P4OUT=com1;
 P5OUT|=E; //E=1
 P5OUT&=~E; //E=0
}
//**************************************************
void prl1(uchar dat1)// 写显示数据子程序(左)
{
 P5DIR|=0X7F; //P5为输出口
 P5OUT|=CS1; //csa=1
 P5OUT&=~CS2; //csb=0
 P5OUT&=~RS;
 P5OUT|=RW; //RS=0,R/W=1,以便读液晶状态
 P4DIR=0x00; //P4口为输入口
 do
 {
 P5OUT|=E; //E=1
 cradd1=P4IN;
 P5OUT&=~E; //E=0
 }
 while((cradd1&0x80)!=0);
 P5OUT|=RS; //rs=1
 P5OUT&=~RW; //rw=0
 P4DIR=0xff; //P4口为输出口
 P4OUT=dat1;
 P5OUT|=E; //E=1
 P5OUT&=~E; //E=0
 }
//**************************************************
void prr0(uchar com2)// 写指令代码子程序(右)
{
 P5DIR|=0X7F; //P5为输出口
 P5OUT&=~CS1; //csa=0
 P5OUT|=CS2; //csb=1
 P5OUT&=~RS;
 P5OUT|=RW; //RS=0,R/W=1,以便读液晶状态
 P4DIR=0x00; //P4口为输入口
 do
 {
 P5OUT|=E; //E=1
 cradd1=P4IN;
 P5OUT&=~E; //E=0
 }
 while((cradd1&0x80)!=0);
 P5OUT&=~RW; //rw=0
 P4DIR=0xff; //P4口为输出口
 P4OUT=com2;
 P5OUT|=E; //E=1
 P5OUT&=~E; //E=0
}
//*************************************************
void prr1(uchar dat2)// 写显示数据子程序(右)
{
 P5DIR|=0X7F; //P5为输出口
 P5OUT&=~CS1; //csa=0
 P5OUT|=CS2; //csb=1
 P5OUT&=~RS;
 P5OUT|=RW; //RS=0,R/W=1,以便读液晶状态
 P4DIR=0x00; //P4口为输入口
 do
 {
 P5OUT|=E; //E=1
 cradd1=P4IN;
 P5OUT&=~E; //E=0
 }
 while((cradd1&0x80)!=0);
 P5OUT|=RS; //rs=1
 P5OUT&=~RW; //rw=0
 P4DIR=0xff; //P4口为输出口
 P4OUT=dat2;
 P5OUT|=E; //E=1
 P5OUT&=~E; //E=0
}
//****************************************************
//读显示数据子程序 (左屏)
//****************************************************
uchar ReadDatal(void)
{
 uchar Rdata;
 P5DIR|=0X7F; //P5为输出口
 P5OUT|=CS1; //csa=1
 P5OUT&=~CS2; //csb=0
 P5OUT&=~RS;
 P5OUT|=RW; //RS=0,R/W=1,以便读液晶状态
 P4DIR=0x00; //P4口为输入口
 do
 {
 P5OUT|=E; //E=1
 cradd1=P4IN;
 P5OUT&=~E; //E=0
 }
 while((cradd1&0x80)!=0);
 P5OUT|=RS; //RS=1
 //P5OUT|=RW; //R/W=1
 P5OUT|=E; //E=1
 Rdata=P4IN;
 P5OUT&=~E; //E=0
 return Rdata;
}
//****************************************************
//读显示数据子程序 (右屏)
//****************************************************
uchar ReadDatar(void)
{
 uchar Rdata;
 P5DIR|=0X7F; //P5为输出口
 P5OUT&=~CS1; //csa=0
 P5OUT|=CS2; //csb=1
 P5OUT&=~RS;
 P5OUT|=RW; //RS=0,R/W=1,以便读液晶状态
 P4DIR=0x00; //P4口为输入口
 do
 {
 P5OUT|=E; //E=1
 cradd1=P4IN;
 P5OUT&=~E; //E=0
 }
 while((cradd1&0x80)!=0);
 P5OUT|=RS; //RS=1
 //P5OUT|=RW; //R/W=1
 P5OUT|=E; //E=1
 Rdata=P4IN;
 P5OUT&=~E; //E=0
 return Rdata;
}
//**********************************************
//**********************************************
void clsr(void) //清屏
{ uchar i,j;
 for(i=0;i<8;i++)
 { prl0(i|0xb8); //设置页地址
 prr0(i|0xb8);
 prl0(0x40);
 prr0(0x40);
 for(j=0;j<64;j++) //设置列地址
 { prl1(0x00); //写0x00
 prr1(0x00);
 }
 }
}
//**********************************************
void allon(void) //满屏
 { uchar i,j;
 for(i=0;i<8;i++)
 { prl0(i|0xb8);
 prr0(i|0xb8);
 prl0(0x40);
 prr0(0x40);
 for(j=0;j<64;j++)
 { prl1(0xff); //写0xff
 prr1(0xff);
 }
 }
 }
//***********************************************
void stripe(void)
 { uchar i,j;
 for(i=0;i<8;i++)
 { prl0(i|0xb8);
 prr0(i|0xb8);
 prl0(0x40);
 prr0(0x40);
 for(j=0;j<64;j++)
 { prl1(0xaa);
 prr1(0xaa); // 写0xaa
 }
 }
 }
//***********************************************
void stripe1(void)
{ uchar i,j;
 for(i=0;i<8;i++)
 { prl0(i|0xb8);
 prr0(i|0xb8);
 prl0(0x40);
 prr0(0x40);
 for(j=0;j<64;j++)
 { prl1(0x55); // 写0x55
 prr1(0x55);
 }
 }
}
//***************************************************
//***************************************************
void hzw_pr(uchar colum2,uchar page2,uchar code2)// 写汉字
//page2:页 colum2:列 code2:代码 code2=0,1,2,3……表示第几个汉字
{ uchar i,j,colum;
 uchar *hzp;
 uchar flag;
 hzp=&HZTable[code2][0];
 for(j=0;j<2;j++)
 { prl0(page2|0xb8); //页
 prr0(page2|0xb8);
 colum=colum2;
 if(colum2>63) //右屏
 { colum=colum-64;
 prr0(colum|0x40);
 flag=1;
 }
 else //左屏
 {prl0(colum|0x40);
 flag=0;
 }
 //*********************
 for(i=0;i<16;i++)
 {
 if(flag==0)
 {
 prl1(*hzp);
 }
 else
 {prr1(*hzp);}
 hzp++;
 if(colum==64) //列=64
 {
 colum=0;
 if(flag==0)
 {
 flag=1;
 prr0(colum|0x40);
 }
 else{break;}
 }
 colum++;
 }
 page2++;
 }
}
//***********************************************
void w_hzstr(uchar colum4,uchar page4,uchar *str1)// 写汉字字符串
{
 while(*str1!=50)
 {
 hzw_pr( colum4, page4,*str1) ;
 colum4=colum4+16;
 str1++;
 }
}
//***************************************************
//init_xt2; 初始化XT2 晶振为4MHZ
//*****************************************************
void init_xt2(void)
{
 unsigned int iq0;
 //使用XT2振荡器
 BCSCTL1&=~XT2OFF; //打开XT2振荡器
 do
 {
 IFG1 &= ~OFIFG; // 清除振荡器失效标志
 for (iq0 = 0xFF; iq0 > 0; iq0--); // 延时,等待XT2起振
 } while ((IFG1 & OFIFG) != 0); // 判断XT2是否起振
 BCSCTL2 =SELM_2+SELS; //选择MCLK、SMCLK为XT2,
 BCSCTL2 |=DIVM_1; //MCLK 2分频SMCLK=MCLK=2MHZ
}
//***********************************************
//主程序
//***********************************************
void main(void)
{
 uchar a;
 // uchar i,j;
 WDTCTL=WDTPW+WDTHOLD;
 init_xt2();
 P5DIR|=0X7F; //P5为输出口
 P5OUT&=~RST; //rst=0
 delayms(10); //1ms
 P5OUT|=RST; //rst=1
 P5OUT&=~EL; //EL=0 背光=0
 do
 {
 prl0(0xc0);prr0(0xc0); //显示开始行
 prl0(0x3f);prr0(0x3f); //开显示
 //P5OUT&=~EL; //EL=0 背光=0
 //******************************************************
 clsr(); // clear screen
 //写汉字字符串1 欢迎使用
 //写汉字字符串2 请等待…
 w_hzstr(32,2,item1);w_hzstr(32,5,item2);
 delayms(100);
 for(a=0;a<50;a++)
 { delayms(100);}
 prl0(0xc0);prr0(0xc0);
 clsr();
 allon(); // fill screen
 delayms(100);
 for(a=0;a<25;a++)
 { delayms(100);}
 prl0(0xc0);prr0(0xc0);
 clsr(); // clear screen
 delayms(100);
 for(a=0;a<25;a++)
 { delayms(100);}
 /* stripe screen */
 prl0(0xc0);prr0(0xc0);
 stripe();
 delayms(100);
 for(a=0;a<20;a++)
 { delayms(100);}
 prl0(0xc0);prr0(0xc0);
 stripe1();
 delayms(100);
 for(a=0;a<50;a++)
 { delayms(100);}
 }while(1);}
//****************************************************