www.pudn.com > msp430lcd12864.rar > LcdCmd.c


//LcdCmd.c 
 
#include "LcdCmd.h" 
#include "BasicOperation.h" 
 
 
unsigned char page; 
unsigned char column; 
 
 
//写指令 
void write_injunction(unsigned char lr,unsigned char inj) 
{ 
  //P2=lr; 
  if(lr==right) 
  { 
  	RightSet; 
  	LeftNotSet; 
  } 
  else 
  { 
  	RightNotSet; 
  	LeftSet; 
  } 
 
  //r_w=0; 
  WriteSelect; 
  //d_i=0; 
  InsBusSelet; 
   
  //data_port=inj; 
  DataPortDIR=0xff; 
  DataPortOut=inj;  
 
  //_e=1; 
  LcdEnable; 
 
  //_e=0; 
  LcdDisable; 
} 
 
 
//读状态 
unsigned char read_state(unsigned char lr) 
{ 
  unsigned char read_data; 
 
  if(lr==right) 
  { 
  	RightSet; 
  	LeftNotSet; 
  } 
  else 
  { 
  	RightNotSet; 
  	LeftSet; 
  } 
 
  //r_w=1; 
  ReadSelect; 
  DataPortDIR=0x00;//跟在他后面比较合理 
     
  //d_i=0;  
  InsBusSelet; 
 
  //_e=1; 
  LcdEnable; 
 
  read_data=DataPortIn; 
 
  //_e=0; 
  LcdDisable; 
  return(read_data); 
} 
 
 
//写显示数据 
void write_display(unsigned char lr,unsigned char dat) 
{ 
  //P2=lr; 
  if(lr==right) 
  { 
  	RightSet; 
  	LeftNotSet; 
  } 
  else 
  { 
  	RightNotSet; 
  	LeftSet; 
  } 
 
  //r_w=0; 
  WriteSelect; 
 
  //d_i=1; 
  DataBusSelet; 
  
  //data_port=dat; 
  DataPortDIR=0xff; 
  DataPortOut=dat; 
 
  //_e=1; 
  LcdEnable; 
  //_e=0;  
  LcdDisable; 
} 
 
 
//读显示数据 
unsigned char read_display(unsigned char lr)  
{ 
  unsigned char read_data;   
  //P2=lr; 
  if(lr==right) 
  { 
  	RightSet; 
  	LeftNotSet; 
  } 
  else 
  { 
  	RightNotSet; 
  	LeftSet; 
  } 
 
  //r_w=1; 
  ReadSelect; 
 
  //d_i=1; 
  DataBusSelet; 
 
  //_e=1; 
  LcdEnable; 
 
  //read_data=data_port; 
  DataPortDIR=0x00; 
  read_data=DataPortIn; 
   
  //_e=0; 
  LcdDisable; 
 
  return(read_data); 
} 
 
 
//忙判断 
void inquire_busy(unsigned char lr) 
{ 
  while(read_state(lr)&0x80);  
} 
 
 
//初始化 
void InitLcd(void) 
{ 
  //_e=0; 
  LcdDisable; 
 
  //添加 
  P2DIR=0xf8; 
  P2SEL=0x00; 
  P6SEL=0x00; 
   
  //r_w=1; 
  ReadSelect; 
 
  //d_i=1; 
  DataBusSelet; 
      
  inquire_busy(left); 
  write_injunction(left,0x3f);               //开显示 
  inquire_busy(right); 
  write_injunction(right,0x3f); 
  inquire_busy(left); 
  write_injunction(left,0xb8);               //设置起始行 
  inquire_busy(right); 
  write_injunction(right,0xb8); 
  inquire_busy(left); 
  write_injunction(left,0x40);               //设置起始列 
  inquire_busy(right); 
  write_injunction(right,0x40); 
  inquire_busy(left); 
  write_injunction(left,0xc0);               //设 
  inquire_busy(right); 
  write_injunction(right,0xc0); 
} 
 
//清屏 
void ClearScreen() 
{ 
  unsigned char i,l; 
  for(i=0;i<8;i++) 
  { 
    page=i; 
    page|=0xb8; 
    inquire_busy(left); 
    write_injunction(left,page);              //设页地址 
    inquire_busy(left); 
    write_injunction(left,0x40);              //设置列地址 
    for(l=0;l<64;l++) 
      write_display(left,0x00); 
  } 
  for(i=0;i<8;i++) 
  { 
    page=i; 
    page|=0xb8; 
    inquire_busy(right); 
    write_injunction(right,page);             //设页地址 
    inquire_busy(right); 
    write_injunction(right,0x40);             //设置列地址 
    for(l=0;l<64;l++) 
      write_display(right,0x00); 
  } 
} 
 
 
//图片显示 
void image_display(unsigned char *ch) 
{   
  unsigned char j,l;  
  page=0xb8; 
  column=0x40; 
  inquire_busy(left); 
  write_injunction(left,page); 
  inquire_busy(right); 
  write_injunction(right,page); 
  inquire_busy(left); 
  write_injunction(left,column); 
  inquire_busy(right); 
  write_injunction(right,column); 
  for(j=0;j<8;j++) 
  { 
    for(l=0;l<64;l++) 
    { 
      write_display(left,*ch); 
      ch++; 
    } 
    for(l=0;l<64;l++) 
    { 
      write_display(right,*ch); 
      ch++; 
    } 
    inquire_busy(left); 
    write_injunction(left,++page); 
    inquire_busy(right); 
    write_injunction(right,page); 
    inquire_busy(left); 
    write_injunction(left,column); 
    inquire_busy(right); 
    write_injunction(right,column); 
  } 
} 
 
 
//滚动显示 
void roll(void) 
{ 
  unsigned char i; 
  while(1) 
  { 
    for(i=0xc0;i!=0;i++) 
    {  
      inquire_busy(left); 
      write_injunction(left,i); 
      inquire_busy(right); 
      write_injunction(right,i); 
      delay(5); 
    } 
  } 
} 
 
  
//读出数据并回写 
void re_write(void) 
{ 
  unsigned char ch[64]; 
  unsigned char i,l; 
  for(i=0;i<8;i++)        //左屏 
  { 
    page=i; 
    page|=0xb8; 
    inquire_busy(left); 
    write_injunction(left,page);              //设页地址 
    inquire_busy(left); 
    write_injunction(left,0x40);              //设列地址 
    inquire_busy(left);                       //假读 
    read_display(left); 
    for(l=0;l<64;l++) 
    { 
      inquire_busy(left); 
      ch[l]=read_display(left); 
    } 
    inquire_busy(left);                       
    write_injunction(left,0x40);              //设列地址,必须设,否则会从最后一个地址向第一个地址回写 
    for(l=0;l<64;l++)                            
    { 
      inquire_busy(left); 
      write_display(left,ch[l]);              //回写 
    } 
  } 
  for(i=0;i<8;i++)        //右屏 
  { 
    page=i; 
    page|=0xb8; 
    inquire_busy(right); 
    write_injunction(right,page);             //设页地址 
    inquire_busy(right); 
    write_injunction(right,0x40);             //设列地址,必须设 
    inquire_busy(right);  
    read_display(right);                      //假读 
    for(l=0;l<64;l++) 
    { 
      inquire_busy(right); 
      ch[l]=read_display(right);    
    } 
    inquire_busy(right); 
    write_injunction(right,0x40);             //设列地址 
    for(l=0;l<64;l++) 
    { 
      inquire_busy(right);  
      write_display(right,ch[l]);             //回写 
    } 
  } 
} 
 
 
void TitleDisplay(unsigned char row,unsigned char* RowData,unsigned char number,unsigned char m_bReverse)//显示一行的数据 
{ 
  //row 为行号(一共有4行),RowData为一行数据的起始地址 
  unsigned char i; 
  page=0xb8|row<<1; 
  column=0x40; 
  for(i=0;iTitleNumber;i++) 
  { 
    if(i==level->SelectedTitle) 
      m_bReverse=1; 
    else 
      m_bReverse=0;      
    TitleDisplay(i,level->pTiltle[i],7,m_bReverse); 
  } 
}