www.pudn.com > LCDseries.rar > LCD.CPP


//--------------------------------------------------------------------------- 
//此中包含液晶操作的全部子程序,另外还包括优盘检测的子程序 
 
#pragma hdrstop 
 
#define LCDEnableNum 20 
 
#include  
#include  
 
#include "Lcd.h" 
#include "system.hpp" 
#include "param.h"  //此中包含所有应用的汉字以及其他字符的字模 
//------------------------------------------------------ 
WideString HanziNum =" 系ab统12"; 
//上处定义全部汉字 
 
 
//--------------------------------------------------------------------------- 
//************变量定义结束   ****************************************** 
//****************************************************** 
//************函数定义开始************************************** 
//----------------------------------------------------------- 
int LcdDisplay(AnsiString StrHanzi) 
{ 
 
  int i,j; 
  int DestiArray[LCDEnableNum]; 
  WideString SourceStr=StrHanzi; 
  wchar_t SourceChar; 
 
  for(i=1;i<=LCDEnableNum;i++)  // 字符串第一个字符是'\0',因此从1开始 
  { 
    if(i>SourceStr.Length()) 
    { 
      DestiArray[i-1]=0;       //如果不足20个字符,自动补足 
      continue; 
    } 
    SourceChar=SourceStr[i];   // 待处理字符 
    for(j=1;j<=HanziNum.Length();j++) 
    {  if(SourceChar==HanziNum[j]) 
      { 
        DestiArray[i-1]=j-1; 
        break; 
      } 
     DestiArray[i-1]=0; 
    } 
  } 
  LcdDisplay(DestiArray);     //调用显示数组程序 
  return 0; 
} 
//  end of LCDDisplay(AnsiString); 
//----------------------------------------------------- 
int LcdDisplay(int *NumHanzi) 
{ 
	 
  int row=0,pag=0; 
	int dataport=0x378; 
	int comport=0x37a; 
  int c; 
  int number=0; 
 
 
 
 
   /*脉冲的顺序是:先选通和片选,然后可读或者可写,之后才能写数据*/ 
  /*命令数据选通与打印机初始化接口相连 ,片选与打印机选通接口相连*/ 
 
  /*==========程序初始化============*/ 
          //初始化左片 
/*====显示初始行设置====*/ 
 
   outportb(comport,0x12);/*A=0,CS1=0,CS2=1,R=0,W=1::读状态,片1选中*/ 
   outportb(comport,0x13);/*A=0,CS1=0,CS2=1,R=1,W=0::写命令,片1选中*/ 
   outportb(dataport,0xc0); 
   outportb(dataport,0xc0); 
   outportb(dataport,0xc0); 
 	 outportb(comport,0x12);/*A=0,CS1=0,CS2=1,R=0,W=1::读状态,片1选中*/ 
/*====显示列序设置====*/ 
   outportb(comport,0x12);/*A=0,CS1=0,CS2=1,R=0,W=1::读状态,片1选中*/ 
   outportb(comport,0x13);/*A=0,CS1=0,CS2=1,R=1,W=0::写命令,片1选中*/ 
   outportb(dataport,0xa0); 
   outportb(dataport,0xa0); 
   outportb(dataport,0xa0); 
	outportb(comport,0x12);/*A=0,CS1=0,CS2=1,R=0,W=1::读状态,片1选中*/ 
/*====显示模式设置====*/ 
   outportb(comport,0x12);/*A=0,CS1=0,CS2=1,R=0,W=1::读状态,片1选中*/ 
   outportb(comport,0x13);/*A=0,CS1=0,CS2=1,R=1,W=0::写命令,片1选中*/ 
   outportb(dataport,0xa4); 
   outportb(dataport,0xa4); 
   outportb(dataport,0xa4); 
   outportb(comport,0x12);/*A=0,CS1=0,CS2=1,R=0,W=1::读状态,片1选中*/ 
/*====显示占空比设置====*/ 
   outportb(comport,0x12);/*A=0,CS1=0,CS2=1,R=0,W=1::读状态,片1选中*/ 
   outportb(comport,0x13);/*A=0,CS1=0,CS2=1,R=1,W=0::写命令,片1选中*/ 
   outportb(dataport,0xa9); 
   outportb(dataport,0xa9); 
   outportb(dataport,0xa9); 
	 outportb(comport,0x12);/*A=0,CS1=0,CS2=1,R=0,W=1::读状态,片1选中*/ 
   //delay(10); 
/*====开显示====*/ 
   outportb(comport,0x12);/*A=0,CS1=0,CS2=1,R=0,W=1::读状态,片1选中*/ 
   outportb(comport,0x13);/*A=0,CS1=0,CS2=1,R=1,W=0::写命令,片1选中*/ 
   outportb(dataport,0xaf); 
   outportb(dataport,0xaf); 
   outportb(dataport,0xaf); 
   outportb(comport,0x12);/*A=0,CS1=0,CS2=1,R=0,W=1::读状态,片1选中*/ 
 
   outportb(comport,0x12);/*A=0,CS1=0,CS2=1,R=0,W=1::读状态,片1选中*/ 
   outportb(comport,0x12);/*A=0,CS1=0,CS2=1,R=0,W=1::读状态,片1选中*/ 
   outportb(comport,0x12);/*A=0,CS1=0,CS2=1,R=0,W=1::读状态,片1选中*/ 
 
 
 
    //初始化右片 
/*====显示初始行设置====*/ 
   outportb(comport,0x10);/*A=0,CS1=1,CS2=0,R=0.W=1::读状态,片2选中*/ 
   outportb(comport,0x11);/*A=0,CS1=1,CS2=0,R=1.W=0::写命令,片2选中*/ 
   outportb(dataport,0xc0); 
   outportb(dataport,0xc0); 
   outportb(dataport,0xc0); 
   outportb(comport,0x10);/*A=0,CS1=1,CS2=0,R=0.W=1::读状态,片2选中*/ 
/*====显示列序设置====*/ 
   outportb(comport,0x10);/*A=0,CS1=1,CS2=0,R=0.W=1::读状态,片2选中*/ 
   outportb(comport,0x11);/*A=0,CS1=1,CS2=0,R=1.W=0::写命令,片2选中*/ 
   outportb(dataport,0xa0); 
   outportb(dataport,0xa0); 
   outportb(dataport,0xa0); 
   outportb(comport,0x10);/*A=0,CS1=1,CS2=0,R=0.W=1::读状态,片2选中*/ 
/*====显示模式设置====*/ 
   outportb(comport,0x10);/*A=0,CS1=1,CS2=0,R=0.W=1::读状态,片2选中*/ 
   outportb(comport,0x11);/*A=0,CS1=1,CS2=0,R=1.W=0::写命令,片2选中*/ 
   outportb(dataport,0xa4); 
   outportb(dataport,0xa4); 
   outportb(dataport,0xa4); 
   outportb(comport,0x10);/*A=0,CS1=1,CS2=0,R=0.W=1::读状态,片2选中*/ 
/*====显示占空比设置====*/ 
   outportb(comport,0x10);/*A=0,CS1=1,CS2=0,R=0.W=1::读状态,片2选中*/ 
   outportb(comport,0x11);/*A=0,CS1=1,CS2=0,R=1.W=0::写命令,片2选中*/ 
   outportb(dataport,0xa9); 
   outportb(dataport,0xa9); 
   outportb(dataport,0xa9); 
   outportb(comport,0x10);/*A=0,CS1=1,CS2=0,R=0.W=1::读状态,片2选中*/ 
/*====开显示====*/ 
   outportb(comport,0x10);/*A=0,CS1=1,CS2=0,R=0.W=1::读状态,片2选中*/ 
   outportb(comport,0x11);/*A=0,CS1=1,CS2=0,R=1.W=0::写命令,片2选中*/ 
   outportb(dataport,0xaf); 
   outportb(dataport,0xaf); 
   outportb(dataport,0xaf); 
   outportb(comport,0x10);/*A=0,CS1=1,CS2=0,R=0.W=1::读状态,片2选中*/ 
 
 
 
/*========写数据的具体步骤========*/ 
   /*====写特殊字符====*/ 
   //每次只写一个字 
     for (number=0;number<5;number++) 
 
{ 
    c=NumHanzi[number]*32; 
 
   for (pag=0;pag<2;pag++) 
   { 
        for (row=16*number;row<16*(number+1);row++) 
         { 
/*====写页指针====*/ 
 
 
   outportb(comport,0x12);/*A=0,CS1=0,CS2=1,R=0,W=1::读状态,片1选中*/ 
   outportb(comport,0x13);/*A=0,CS1=0,CS2=1,R=1,W=0::写命令,片1选中*/ 
   outportb(dataport,row); 
   outportb(dataport,row); 
   outportb(dataport,row); 
   outportb(comport,0x12);/*A=0,CS1=0,CS2=1,R=0,W=1::读状态,片1选中*/ 
/*====写列指针====*/ 
   outportb(comport,0x12);/*A=0,CS1=0,CS2=1,R=0,W=1::读状态,片1选中*/ 
	 outportb(comport,0x13);/*A=0,CS1=0,CS2=1,R=1,W=0::写命令,片1选中*/ 
   outportb(dataport,pag+184); 
   outportb(dataport,pag+184); 
   outportb(dataport,pag+184); 
   outportb(comport,0x12);/*A=0,CS1=0,CS2=1,R=0,W=1::读状态,片1选中*/ 
 
/*====写数据====*/ 
  outportb(comport,0x16);/*A=1,CS1=0,CS2=1,R=0,W=1::读数据,片1选中*/ 
  outportb(comport,0x17);/*A=1,CS1=0,CS2=1,R=1,W=0::写数据,片1选中*/ 
  outportb(dataport,a[c]); 
  outportb(dataport,a[c]); 
  outportb(dataport,a[c]); 
  outportb(comport,0x16);/*A=1,CS1=0,CS2=1,R=0,W=1::读数据,片1选中*/ 
 
  } 
     c++  ; 
  } 
   } 
 
 
     for (number=5;number<10;number++) 
     { 
 
      c=NumHanzi[number]*32; 
      for (pag=0;pag<2;pag++) 
       { 
        for (row=16*(number-5);row<16*(number-4);row++) 
       { 
    /*====写页指针====*/ 
 
   outportb(comport,0x10);/*A=0,CS1=1,CS2=0,R=0.W=1::读状态,片2选中*/ 
   outportb(comport,0x11);/*A=0,CS1=1,CS2=0,R=1.W=0::写命令,片2选中*/ 
   outportb(dataport,row); 
   outportb(dataport,row); 
   outportb(dataport,row); 
   outportb(comport,0x10);/*A=0,CS1=1,CS2=0,R=0.W=1::读状态,片2选中*/ 
/*====写列指针====*/ 
   outportb(comport,0x10);/*A=0,CS1=1,CS2=0,R=0.W=1::读状态,片2选中*/ 
   outportb(comport,0x11);/*A=0,CS1=1,CS2=0,R=1.W=0::写命令,片2选中*/ 
   outportb(dataport,pag+184); 
   outportb(dataport,pag+184); 
   outportb(dataport,pag+184); 
   outportb(comport,0x10);/*A=0,CS1=1,CS2=0,R=0.W=1::读状态,片2选中*/ 
/*====写数据====*/ 
   outportb(comport,0x14);/*A=1,CS1=1,CS2=0,R=0.W=1::读数据,片2选中*/ 
   outportb(comport,0x15);/*A=1,CS1=1,CS2=0,R=1.W=0::写数据,片2选中*/ 
   outportb(dataport,a[c]); 
   outportb(dataport,a[c]); 
   outportb(dataport,a[c]); 
   outportb(comport,0x14);/*A=1,CS1=1,CS2=0,R=0.W=1::读数据,片2选中*/ 
 
  } 
  c++    ; 
  } 
} 
 
      for (number=10;number<15;number++) 
 { 
     c=NumHanzi[number]*32; 
     for (pag=2;pag<4;pag++) 
      { 
          for (row=16*(number-10);row<16*(number-9);row++) 
    { 
/*====写页指针====*/ 
 
 
   outportb(comport,0x12);/*A=0,CS1=0,CS2=1,R=0,W=1::读状态,片1选中*/ 
   outportb(comport,0x13);/*A=0,CS1=0,CS2=1,R=1,W=0::写命令,片1选中*/ 
   outportb(dataport,row); 
   outportb(dataport,row); 
   outportb(dataport,row); 
   outportb(comport,0x12);/*A=0,CS1=0,CS2=1,R=0,W=1::读状态,片1选中*/ 
/*====写列指针====*/ 
   outportb(comport,0x12);/*A=0,CS1=0,CS2=1,R=0,W=1::读状态,片1选中*/ 
   outportb(comport,0x13);/*A=0,CS1=0,CS2=1,R=1,W=0::写命令,片1选中*/ 
   outportb(dataport,pag+184); 
   outportb(dataport,pag+184); 
   outportb(dataport,pag+184); 
   outportb(comport,0x12);/*A=0,CS1=0,CS2=1,R=0,W=1::读状态,片1选中*/ 
 
/*====写数据====*/ 
  outportb(comport,0x16);/*A=1,CS1=0,CS2=1,R=0,W=1::读数据,片1选中*/ 
  outportb(comport,0x17);/*A=1,CS1=0,CS2=1,R=1,W=0::写数据,片1选中*/ 
  outportb(dataport,a[c]); 
  outportb(dataport,a[c]); 
  outportb(dataport,a[c]); 
  outportb(comport,0x16);/*A=1,CS1=0,CS2=1,R=0,W=1::读数据,片1选中*/ 
 
  } 
  c++; 
  } 
   } 
 
       for (number=15;number<20;number++) 
 
     { 
        c=NumHanzi[number]*32; 
        for (pag=2;pag<4;pag++) 
        { 
           for (row=16*(number-15);row<16*(number-14);row++) 
       { 
    /*====写页指针====*/ 
 
   outportb(comport,0x10);/*A=0,CS1=1,CS2=0,R=0.W=1::读状态,片2选中*/ 
   outportb(comport,0x11);/*A=0,CS1=1,CS2=0,R=1.W=0::写命令,片2选中*/ 
   outportb(dataport,row); 
   outportb(dataport,row); 
   outportb(dataport,row); 
   outportb(comport,0x10);/*A=0,CS1=1,CS2=0,R=0.W=1::读状态,片2选中*/ 
/*====写列指针====*/ 
   outportb(comport,0x10);/*A=0,CS1=1,CS2=0,R=0.W=1::读状态,片2选中*/ 
   outportb(comport,0x11);/*A=0,CS1=1,CS2=0,R=1.W=0::写命令,片2选中*/ 
   outportb(dataport,pag+184); 
   outportb(dataport,pag+184); 
   outportb(dataport,pag+184); 
   outportb(comport,0x10);/*A=0,CS1=1,CS2=0,R=0.W=1::读状态,片2选中*/ 
/*====写数据====*/ 
   outportb(comport,0x14);/*A=1,CS1=1,CS2=0,R=0.W=1::读数据,片2选中*/ 
   outportb(comport,0x15);/*A=1,CS1=1,CS2=0,R=1.W=0::写数据,片2选中*/ 
   outportb(dataport,a[c]); 
   outportb(dataport,a[c]); 
   outportb(dataport,a[c]); 
   outportb(comport,0x14);/*A=1,CS1=1,CS2=0,R=0.W=1::读数据,片2选中*/ 
 
 
  } 
  c++; 
} 
} 
 
 
 
   /*====开显示====*/ 
 
   outportb(comport,0x12);/*A=0,CS1=0,CS2=1,R=0,W=1::读状态,片1选中*/ 
   outportb(comport,0x13);/*A=0,CS1=0,CS2=1,R=1,W=0::写命令,片1选中*/ 
   outportb(dataport,0xaf); 
   outportb(dataport,0xaf); 
   outportb(dataport,0xaf); 
   outportb(comport,0x12);/*A=0,CS1=0,CS2=1,R=0,W=1::读状态,片1选中*/ 
 
 
/*====开显示====*/ 
 
   outportb(comport,0x10);/*A=0,CS1=1,CS2=0,R=0.W=1::读状态,片2选中*/ 
   outportb(comport,0x11);/*A=0,CS1=1,CS2=0,R=1.W=0::写命令,片2选中*/ 
   outportb(dataport,0xaf); 
   outportb(dataport,0xaf); 
   outportb(dataport,0xaf); 
   outportb(comport,0x10);/*A=0,CS1=1,CS2=0,R=0.W=1::读状态,片2选中*/ 
 
	 
	 
  return 0; 
} 
// end of LcdDisplay(int *) 
//------------------------------------------------------ 
//------------------------------------------------------ 
int LcdPlot(int *d) 
{ 
  return 0; 
} 
 
//end of int LcdPlot(int *d) 
//------------------------------------------------------ 
//------------------------------------------------------ 
void outportb(int port, char data) 
{ 
  switch(port) 
  { 
  case 0x378: 
    asm{ 
      mov   al,data 
      mov   dx,0x378 
      out   dx,al 
    } 
    break; 
  case 0x37a: 
    asm{ 
      mov   al,data 
      mov   dx,0x37a 
      out   dx,al 
    } 
    break; 
  default: 
    break; 
  } 
  return; 
} 
// end of outportb(int port, char data) 
//------------------------------------------------------ 
//------------------------------------------------------ 
int checkdisk(int ndisk)//USB检测程序 
{ 
   int save, disk; 
   disk=ndisk; 
   setdisk(disk); 
   if (disk == getdisk()) 
   { 
     printf("%c: drive is available\n", disk + 'a'); 
     return 1; 
     } 
   else 
   { 
     printf("%c: drive is not available\n", disk + 'a'); 
     return 0; 
   } 
 
} 
// end of checkdisk(int ndisk) 
//------------------------------------------------------ 
//********************函数定义结束********************************* 
 
#pragma package(smart_init)