📄 lcd.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 + -