⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcdcmd.c

📁 利用msp430F149驱动lcd12864
💻 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;i<number;i++)
  {
    if(i==4)
      column=0x40;
    if(i<4)
      WriteOneChar(RowData,left,column,m_bReverse);//写一个汉字
    else
      WriteOneChar(RowData,right,column,m_bReverse);//写一个汉字
    column+=16;
    RowData+=32;
  }
}

void WriteOneChar(unsigned char* CharData,unsigned char lr,unsigned char columnTmp,unsigned char m_bReverse)//写一个汉字
{
  //unsigned char m_bReverse指是否反显
  unsigned char i;
  inquire_busy(lr);
  write_injunction(lr,columnTmp);
  inquire_busy(lr);  
  write_injunction(lr,page);                //设页地址
  for(i=0;i<16;i++)
  {
    inquire_busy(lr);
    if(m_bReverse==0)  
      write_display(lr,*(CharData++));
    else
      write_display(lr,~(*(CharData++)));      
  }
  inquire_busy(lr);
  write_injunction(lr,columnTmp);
  inquire_busy(lr);
  write_injunction(lr,page+1);              //设页地址
  for(i=0;i<16;i++)
  {
    inquire_busy(lr);  
    if(m_bReverse==0)  
      write_display(lr,*(CharData++));
    else
      write_display(lr,~(*(CharData++)));      
  }  
}

void WriteTitleScreen(LCD_DISPLAY_XFER* level)//写一层带有标题的屏幕
{
  unsigned char i;
  unsigned char m_bReverse;
  for(i=0;i<level->TitleNumber;i++)
  {
    if(i==level->SelectedTitle)
      m_bReverse=1;
    else
      m_bReverse=0;     
    TitleDisplay(i,level->pTiltle[i],7,m_bReverse);
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -