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

📄 s1d1335.c

📁 0834实现数据的采集
💻 C
字号:
/* 320240简单演示程序(8080时序)
硬件连线方式(总线式)
LCM -------------- CPU
CS  -------------- P2.7  A15
A0  -------------- P2.6  A8
WR  -------------- WR
RD  -------------- RD
DB0 ~ 7----------- P0.0 ~ P0.7
RST脚采用外部硬件RC电路复位---RST不可少*/
//编译环境    Keil V7.0
#include <reg52.h>
#include <stdlib.h>
#include <intrins.h>
#include <stdio.h>
#include <zk.h>
sbit  CS_LCD=P2^6;
sbit  A0_LCD=P2^7;
sbit  WR_LCD=P3^6;
sbit  RD_LCD=P3^7;
sbit   WDT  =P1^5;
char xdata LcmCmdPort _at_ 0x8000;		// P2.7 --- CS  P2.0 --- A0
char xdata LcmWdataPort _at_ 0x0000;
#define uchar unsigned char
#define uchar unsigned char
#define Uint unsigned int
#define uint unsigned int
#define ulong unsigned long
#define H_BYTE 40 //横向一行的字节数,如128×128的液晶,横向字节数为16
#define LcmRdataPort LcmCmdPort
#define LcmStatusPort LcmWdataPort
#define SystemSet	0x40
uchar code ParaSysTable8[]= {
				0x30,0x87,0x07,0x27,0x42,0xf0,0x28,0x00	// P1-P8参数
		};
#define Scroll	0x44
#define BasePart1	0x00
#define BasePart2	0x40
#define BasePart3	0x80
#define BasePart4	0x00
		uchar code ParaScrTableA[]= {
				0x00,BasePart1,0xF0,0x00,BasePart2,0xF0,0x00,BasePart3,0x00,BasePart4
		};
#define SleepIn		0x53
#define DispOn		0x59
#define DispOff		0x58
#define Ovlay		0x5b
#define HdotScr		0x5a
#define CsrForm		0x5d
#define CgramAdr	0x5c
#define CsrDirR		0x4c
#define CsrDirL		0x4d
#define CsrDirU		0x4e
#define CsrDirD		0x4f
#define CsrW		0x46
#define CsrR		0x47
#define mWrite		0x42
#define mRead		0x43
bit	wAttrib	;
#define Busy		0x40
#define paraP9		0x28
void LcmInition( void );
void WriteData( uchar dataW );
uchar ReadData( void );
void WriteCommand( uchar CommandByte );
void Delay( Uint MS);
void LcmClear( void );
void Locatexy(uchar x,uchar y);
void Displayspeed(uchar col,uchar row,uchar hzcode);//显示流速、预输液量,显示24*16点阵
void Displaytime(uchar col,uchar row,uchar hzcode);//显示24*14点阵
void DisplayTotal(uchar col,uchar row,uchar hzcode);//显示24*18点阵
void DisplayCanShu(uchar col,uchar row,uchar hzcode); //显示参数调节杆
void Displayyedichar(uchar col,uchar row,uchar hzcode);//显示点滴计数值
void Displayonebmp3(uchar col,uchar row,uchar x,uchar y,uchar *adr);
void DisplayClear(uchar col,uchar row,uchar x,uchar y);

void DisplayOn(uchar x1,uchar y1,uchar x2,uchar y2);
void extbmp(uchar x0,uchar y0,uchar *bmp);
void Displayonebmp(uchar x,uchar y,uchar *adr);
void LcdDrawPoint(int x,int y,bit Point);
//========向液晶写入命令===================
void WriteCommand( uchar CommandByte )
{
     /*  EA=0;
      CS_LCD=0;
       A0_LCD=1;
       RD_LCD=1;
       WR_LCD=0;
       P0=CommandByte;
       WR_LCD=1;
       EA=1; */
     LcmCmdPort = CommandByte;
}
//=========向液晶屏写入数据================
void WriteData( uchar dataW )
{

     LcmWdataPort = dataW;
     /*
       EA=0;
       CS_LCD=0;
       A0_LCD=0;
       RD_LCD=1;
        WR_LCD=0;
        P0=dataW;
        WR_LCD=1;
        CS_LCD=1;
       EA=1; */
}
//=========读取当前济屏数据=================
uchar ReadData( void )
{
	uchar Rdata;
	Rdata = LcmCmdPort;
	return Rdata;
}
//========写入当前地址======================*/
void Locatexy(uchar x,uchar y)
{
	Uint temp;
	temp = (Uint)y*paraP9+x;
	WriteCommand( CsrW );
	WriteData( (uchar)(temp & 0xff) );
	WriteData( (uchar)(temp /256 ) );
}

//=====液晶初始化======================
void LcmInition( void )
{

	uchar i;
        Delay(30);
	WriteCommand( SystemSet );
	for (i=0;i<8;i++) {
		WriteData( ParaSysTable8[i] );
	}

	WriteCommand( Scroll );
	for (i=0;i<10;i++) {
		WriteData( ParaScrTableA[i] );
	}

	WriteCommand( HdotScr );
	WriteData( 0 );
	WriteCommand( Ovlay );
	WriteData( 4 );
	WriteCommand( DispOn );
	WriteData( 0x54 );
    WriteCommand(DispOff);
    LcmClear();
	WriteCommand(DispOn);
	WriteCommand( Ovlay );
	WriteData( 0x0C );
}
/********************************************************************
* 名称: void DisplayClear(uchar col,uchar row,uchar x,uchar y)
* 功能: col为要擦除的行数,row为要擦除的列(最多240列)x,y为要擦除的起始地址
* 调用:
* 输入:
* 说明:
* 返回值:无
***********************************************************************/
void DisplayClear(uchar col,uchar row,uchar x,uchar y)
{
  	uchar i,j;

	for(i=0;i<row;i++)
	{
		Locatexy(x,y);
		WriteCommand(mWrite);
		for(j=0;j<col;j++)
		{
			WriteData(0);
		}
		y++;
        }
}
/********************************************************************
* 名称: void DisplayOn(uchar col,uchar row,uchar x,uchar y)
* 功能: 选定区显示黑屏
* 调用:
* 输入: col,row,x,y.
* 说明: col为要写入的行数(一行8位),row为要擦除的列(最多240列)x,y为要擦除的起始地址
* 返回值:无
***********************************************************************/
void DisplayOn(uchar x1,uchar y1,uchar x2,uchar y2)
{
  	uchar i,j,row,col;
    row=y2-y1;
	col=x2-x1;
	for(i=0;i<row;i++)
	{
		Locatexy(x1,y1);
		WriteCommand(mWrite);
		for(j=0;j<col;j++)
		{
			WriteData(0xff);
		}
		y1++;
        }
}
/********************************************************************
* 名称: void Displayonebmp(uchar col,uchar row,uchar x,uchar y,uchar *adr)
* 功能: 显示任意点阵图标
* 调用:
* 输入:
* 说明:
* 返回值:无
***********************************************************************/
void Displayonebmp3(uchar col,uchar row,uchar x,uchar y,uchar *adr)
{
  	uchar i,j;
	uchar *p;
    p=adr;
	for(i=0;i<row;i++)
	{
		Locatexy(x,y);
		WriteCommand(mWrite);
		for(j=0;j<col;j++)
		{
			WriteData(*p);
			p++;
		}
		y++;
        }
}


/********************************************************************
* 名称: void Displayyedichar(uchar col,uchar row,uchar hzcode)
* 功能: 显示12*16点阵数字
* 调用:
* 输入:
* 说明: 图标位置HZcode
* 返回值:
***********************************************************************/
void Displayyedichar(uchar col,uchar row,uchar hzcode)
{
     	uchar i,j;
	Uint  x;
	x = 24*hzcode;
	WriteCommand( CsrDirR );
	for(i=0;i<12;i++)
	{
		Locatexy(col,row);
		WriteCommand(mWrite);
		for(j=0;j<2;j++)
		{
			WriteData(yedichar[x]);
			x++;
		}
		row++;
        }

}

/********************************************************************
* 名称: DisplayCanShu(uchar col,uchar row,uchar hzcode)
* 功能: 显示104*17点阵图标
* 调用:
* 输入:
* 说明:
* 返回值:无
***********************************************************************/
void DisplayCanShu(uchar col,uchar row,uchar hzcode)
{
  	uchar i,j;
	Uint  x;
	x = 117*hzcode;
	WriteCommand( CsrDirR );
	for(i=0;i<9;i++)
	{
		Locatexy(col,row);
		WriteCommand(mWrite);
		for(j=0;j<13;j++)
		{
			WriteData(canshuico[x]);
			x++;
		}
		row++;
        }
}


//================================================================
void Delay(unsigned int MS)
{
	unsigned char us,usn;
	while(MS!=0)
	{
		usn = 2;	//for 12M
		while(usn!=0)
		{
			us=0xf6;
			while (us!=0){us--;};
			usn--;
		}
		MS--;
	}
}
/********************************************************************
* 名称: void Displaytime(uchar col,uchar row,uchar hzcode)
* 功能: 显示27*14点阵汉字
* 调用:
* 输入:
* 说明: 入口参数:	横坐标col	纵坐标row	汉字位置HZcode
* 返回值:
***********************************************************************/
//出口参数: 无	(HZcode表示汉字在字模表中的位置)
void Displaytime(uchar col,uchar row,uchar hzcode)
{
     	uchar i,j;
	uint  x;
	x = 42*hzcode;
	WriteCommand( CsrDirR );
	for(i=0;i<14;i++)
	{
		Locatexy(col,row);
		WriteCommand(mWrite);
		for(j=0;j<3;j++)
		{
			WriteData(timedata[x]);
			x++;
		}
		row++;
        }

}
/********************************************************************
* 名称: Displayspeed(uchar col,uchar row,uchar hzcode)
* 功能: 显示24*18点阵汉字
* 调用:
* 输入:
* 说明: 入口参数:	横坐标col	纵坐标row	汉字位置HZcode
* 返回值:
***********************************************************************/
//出口参数: 无	(HZcode表示汉字在字模表中的位置)
void Displayspeed(uchar col,uchar row,uchar hzcode)
{
     	uchar i,j;
	uint  x;
	x = 54*hzcode;
	WriteCommand( CsrDirR );
	for(i=0;i<18;i++)
	{
		Locatexy(col,row);
		WriteCommand(mWrite);
		for(j=0;j<3;j++)
		{
			WriteData(speed[x]);
			x++;
		}
		row++;
        }

}
/********************************************************************
* 名称: DisplayTotal(uchar col,uchar row,uchar hzcode)
* 功能: 显示27*40点阵汉字
* 调用:
* 输入:
* 说明: 入口参数:	横坐标col	纵坐标row	汉字位置HZcode
* 返回值:
***********************************************************************/
//出口参数: 无	(HZcode表示汉字在字模表中的位置)
void DisplayTotal(uchar col,uchar row,uchar hzcode)
{
     	uchar i,j;
	Uint  x;
	x = 84*hzcode;
	WriteCommand( CsrDirR );
	for(i=0;i<21;i++)
	{
		Locatexy(col,row);
		WriteCommand(mWrite);
		for(j=0;j<4;j++)
		{
			WriteData(Total[x]);
			x++;
		}
		row++;
        }

}
//=========清屏==========================
void LcmClear( void )
{
	Uint i1=32768;
	WriteCommand( CsrDirR );
	WriteCommand( CsrW );
	WriteData( 0 );
	WriteData( 0 );
	WriteCommand( mWrite );
	while(i1--)	{

		WriteData( 0x0 );
	}
}

//========写入当前地址======================*/
void Locateaddr(uint addr)
{
	uint temp;
	temp=addr;
	WriteCommand( CsrW );
	WriteData( (uchar)(temp & 0xff) );
	WriteData( (uchar)(temp /256 ) );
}
/*--------------------------------------------------------------------------------
调用方式:void extbmp(Byte x0,Byte y0,Byte *bmp) 

函数版本:V1.0 2003.9.2 加注释

函数说明:extbmp()在左上角坐标(x,y)解压显示bmp所指向的图形,图形压缩工具采用“字模3.3”
          
          x0必须为8的整数倍。该解压算法适合显存横向排列的液晶。纵向解压算法可参照编写。
          
          该算法的疑问或修改建议,请E-mail:c51bbs@vip.163.com
---------------------------------------------------------------------------------*/

void extbmp(uchar x0,uchar y0,uchar *bmp)
{
	uint n=2,num;
	uint begin,add1,end;
	uchar tmp;
	uint bmp_h,bmp_v;//BMP的宽和高
	
	bmp_h=bmp[0];bmp_v=bmp[1];
	begin=x0+y0*H_BYTE;
	end=begin+(bmp_v-1)*H_BYTE+bmp_h-1;
    add1=begin;
	Locateaddr(add1);
	WriteCommand(mWrite);
	while (add1<=end)
	{	    
	if (bmp[n]==0x00||bmp[n]==0xFF) //解压缩画黑白点
		{
		tmp=bmp[n++];
		if (bmp[n]!=0x00) num=bmp[n++];
			else {n++;num=bmp[n++];num|=(bmp[n++]<<8);} //算出了0x00重复的次数
		
		while(num--) //把0x00都画出来
			{
			//display_buff[add1]|=tmp; //display_buff是显存映射在XRAM上的镜象

			WriteData(tmp);
			if (add1==end) {return;}//UpdataAll();完成显存镜象到显存的刷新过程
			if (add1==begin+bmp_h-1) 
              {
                begin+=H_BYTE;
                add1=begin;	
          		Locateaddr(add1);
			    WriteCommand(mWrite);
                }
			else add1++;
			}
		}
	
	else //直接画,不解压缩
		{
			//display_buff[add1]|=bmp[n++];
			WriteData(bmp[n++]);
			if (add1==end) {return;}
			if (add1==begin+bmp_h-1) 
				{begin+=H_BYTE;
				add1=begin;
				Locateaddr(add1);
				WriteCommand(mWrite);
				}
		    else add1++;
		}
	}

}
/********************************************************************
* 名称: void Displayonebmp(uchar x,uchar y,uchar *adr)
* 功能: 显示任意点阵图标
* 调用: WriteCommand(mWrite);
* 输入: x,y,*adr
* 说明: x为显示图标纵向地址,y为显示图标横向地址
* 返回值:无
***********************************************************************/
void Displayonebmp(uchar x,uchar y,uchar *adr)
{
    uchar col,row;
  	uchar i,j;
	uchar *p;
    p=adr;
    p++;
    row=*p;
    p++;
    col=*p;
    p++;
	for(i=0;i<row;i++)
	{
		Locatexy(x,y);
		WriteCommand(mWrite);
		for(j=0;j<col;j++)
		{
			WriteData(*p);
			p++;
		}
		y++;
        }
}
//=======画点=====================
void LcdDrawPoint(int x,int y,bit Point)
{
  uint temp;
  uchar t1,t2,WrData;
  if((x>=0)&&(y>=0)&&(x<321)&&(y<241))
  {
  t1=x/8;
  t2=x%8;

  temp=t1+(uint)y*paraP9;
  WriteCommand( CsrW );
  WriteData( (uchar)(temp & 0xff) );
  WriteData( (uchar)(temp /256 ) );
  WriteCommand(mRead);
  WrData=ReadData();
  WriteCommand( CsrW );
  WriteData( (uchar)(temp & 0xff) );
  WriteData( (uchar)(temp /256 ) );
  if(Point)
  {
    	switch(t2)
    	{
    	case 0: WrData|=0x80;  break;
		case 1: WrData|=0x40;  break;
		case 2: WrData|=0x20;  break;
		case 3: WrData|=0x10;  break;
		case 4: WrData|=0x08;  break;
		case 5: WrData|=0x04;  break;
		case 6: WrData|=0x02;  break;
		case 7: WrData|=0x01;  break;
		default:               break;
	    }
  }
  else
  {
	    switch(t2)
    	{
    	case 0: WrData&=0x7f;  break;
		case 1: WrData&=0xbf;  break;
		case 2: WrData&=0xdf;  break;
		case 3: WrData&=0xef;  break;
		case 4: WrData&=0xf7;  break;
		case 5: WrData&=0xfb;  break;
		case 6: WrData&=0xfd;  break;
		case 7: WrData&=0xfe;  break;
		default:               break;
	    }
  }
  WriteCommand(mWrite);
  WriteData(WrData);
  }
}

⌨️ 快捷键说明

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