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

📄 lcd.cpp

📁 一个利用并口操作液晶的源代码
💻 CPP
字号:
//---------------------------------------------------------------------------
//此中包含液晶操作的全部子程序,另外还包括优盘检测的子程序

#pragma hdrstop

#define LCDEnableNum 20

#include <dir.h>
#include <stdio.h>

#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)

⌨️ 快捷键说明

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