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

📄 lcd.h

📁 此代码是我们在单片机来控制CPLD记数,然后读出并转换数据,精度很高,在我们学校的电子设计大赛上还获的了二等奖
💻 H
字号:
#include "main.h"

#include<reg52.h>
sbit    cs=P1^0;
sbit    sclk=P1^2;
sbit    sid=P1^1;
unsigned char LCDBusyWait()
{
  unsigned char states;
  unsigned char i;
  cs=1;
  sclk=0;
  for(i=0;i<6;i++)
   {
     sid=1;
	 sclk=1;
	 sclk=0;
	}
   sid=0;
   sclk=1;
   sclk=0;
   sid=0;
   sclk=1;
   sclk=0;
     for(i=0;i<16;i++) 
      {
	    sclk=1;
		if(i==0)
	    states=sid;
	    sclk=0;
	  }
  while(states&0x01)
   {
	  for(i=0;i<6;i++)
   {
     sid=1;
	 sclk=1;
	 sclk=0;
	}
   sid=0;
   sclk=1;
   sclk=0;
   sid=0;
   sclk=1;
   sclk=0;
   for(i=0;i<16;i++) 
    {
	  sclk=1;
	  if(i==0)
	  states=sid;
	  sclk=0;
	  }
	 cs=0;
   }
   return states;
 }

 void WriteLCD_Data(unsigned char Data)			//向LCD写入一个字节的数据
  {
  unsigned char i;
  LCDBusyWait();
  cs=1;
  sclk=0;
  for(i=0;i<5;i++)
   {
    sid=1;
	sclk=1;
	sclk=0;
   }
   sid=0;	//置为写
   sclk=1;
   sclk=0;
   sid=1;   //写数据标志
   sclk=1;
   sclk=0;
   sid=0;
   sclk=1;
   sclk=0;
   for(i=0;i<16;i++)
    {
	 switch(i)
	 {
	 case 0:
	  sid=Data&0x80;
	  break;
	 case 1:
	  sid=Data&0x40;
	  break;
	 case 2:
	  sid=Data&0x20;
	  break;
	 case 3:
	  sid=Data&0x10;
	  break;
	 case 8:
	  sid=Data&0x08;
	  break;
	 case 9:
	  sid=Data&0x04;
	  break;
	 case 10:
	  sid=Data&0x02;
	  break;
	 case 11:
	  sid=Data&0x01;
	  break;
	 default:
	  sid=0;
	  break;
	}
	  sclk=1;
	  sclk=0;
   }
  cs=0;
 }

 void WriteLCD_Command(unsigned char Command)	//向LCD写入一个字节的命令
 {
  unsigned char i;
  LCDBusyWait();
  cs=1;
  sclk=0;
  for(i=0;i<5;i++)
   {
    sid=1;
	sclk=1;
	sclk=0;
   }
   sid=0;	//置为写
   sclk=1;
   sclk=0;
   sid=0;   //写命令标志
   sclk=1;
   sclk=0;
   sid=0;
   sclk=1;
   sclk=0;
   for(i=0;i<16;i++)
    {
	 switch(i)
	 {
	 case 0:
	  sid=Command&0x80;
	  break;
	 case 1:
	  sid=Command&0x40;
	  break;
	 case 2:
	  sid=Command&0x20;
	  break;
	 case 3:
	  sid=Command&0x10;
	  break;
	 case 8:
	  sid=Command&0x08;
	  break;
	 case 9:
	  sid=Command&0x04;
	  break;
	 case 10:
	  sid=Command&0x02;
	  break;
	 case 11:
	  sid=Command&0x01;
	  break;
	 default :
	  sid=0;
	  break;
	}
	  sclk=1;
	  sclk=0;
   }
  cs=0;
 } 

/*****************************改变地址,实现了逐行显示*************************/
unsigned char ChangeAddress(unsigned char StartAddress)
{
	switch(StartAddress)
	{
		case 0x87:WriteLCD_Command(0x90);StartAddress=0x90;break;
		case 0x8F:WriteLCD_Command(0x98);StartAddress=0x98;break;
		case 0x97:WriteLCD_Command(0x88);StartAddress=0x88;break;
		default:StartAddress+=1;
	}
	return StartAddress;
}

/*
WriteLCD 从LCD输出一个字符串:
	StartAddress为起始地址;
	Size为字符串大小;
	Size==0 时由程序自己判断字符串结束标志,否则输出 Size 个字符,不够则填充空格;
	Charactors为要求输出的字符串;
*/
void WriteLCD(unsigned char StartAddress,unsigned char Size,unsigned char Charactors[])
{
	unsigned char *i=Charactors;	  //字符串的首地址
	WriteLCD_Command(StartAddress);
	if(Size) 		//Size不为0
	{
		bit Over=0;
		while(i<(Charactors+Size))		//判断字符串结尾
		{
			if(Over)
			{
				WriteLCD_Data(' ');i++;
				if(i>=(Charactors+Size)) break;
				WriteLCD_Data(' ');i++;
			}
			else
			{

				switch(((*i)*256)+(*(i+1)))
				{

				}
			}
			StartAddress=ChangeAddress(StartAddress); //改变地址,实现了逐行显示
		}
	}
	else			                                //Size为0
	{
		while(*i)						          //判断字符串结尾,*i为0代表结束
		{
			WriteLCD_Data(*i);
			i++;
			WriteLCD_Data(*i);
			i++;
			StartAddress=ChangeAddress(StartAddress);
		}
	}
}


/**********************功能:写入数字Number, Number为0-99的两位数字********************/
void WriteLCD_Number(unsigned char Address,unsigned char Number)
{
	if(Address) WriteLCD_Command(Address); //如果地址为0则自动接着原来的位置写.	否则按指定地址写
	if((Number/10)!=0)
	WriteLCD_Data((Number/10)+0x30);	   //取商,取出十位数字
	WriteLCD_Data((Number%10)+0x30);	   //取余,取出个位数字
}


/******************************功能:显示ASSIC码****************************/
void WriteLCD_CharNumber(unsigned char Address,unsigned char CharNumber)
{	 
    if(Address) 
	WriteLCD_Command(Address);       //如果地址为0则自动接着原来的位置写.	否则按指定地址写
 	WriteLCD_Data(CharNumber);
}
  
  
  
/****************************功能: 数据转换(十六进制转十进制)*****************/
unsigned long Data_Process(unsigned char Msb,unsigned char Lsb)
 {  
    unsigned int Buffer2;
    unsigned long Buffer1;
    Buffer1=0;
    Buffer2=0;
    Buffer1=(unsigned long)Lsb;
    Buffer2=(unsigned int)Msb;
    Buffer2<<=8;
    Buffer1=(Buffer1+Buffer2)<<4;
    return(Buffer1);                //返回频率值
  }
 
  
/*******************************功能:显示多位数据*****************************/
void WriteLCD_HalfCharNumber(unsigned char Address,unsigned long HalfCharNumber)
   { 
     unsigned char Buffer[16];
     unsigned char j;
     unsigned char i=0;
     if(Address) 
     WriteLCD_Command(Address);
     do
     {
       Buffer[i++]=HalfCharNumber%10;         //对每一位进行存储
       HalfCharNumber=HalfCharNumber/10;
     }while(HalfCharNumber!=0);
     for(j=i;j>0;j--)
       WriteLCD_Number(0x00,Buffer[j-1]);
    }


/************************功能:小数显示.精确到小数点后面四位**********************/
void  WriteLCD_FloatNumber(unsigned char Address,unsigned long Float_Number)
  {
     static unsigned char Buffer[6];
     unsigned char i=0;
	 if(Address) 
	 WriteLCD_Command(Address);
	 do
	 {
	   Buffer[i++]=Float_Number%10;		  //对每一位进行逆序存储
	   Float_Number=Float_Number/10;
	 }while(Float_Number!=0);
	  
	 if(6==i)
	   { 	
		 WriteLCD_Number(0x00,Buffer[i-1]);   //显示整数
		 WriteLCD_Number(0x00,Buffer[i-2]);   //显示整数	
		 WriteLCD_CharNumber(0x00,0x2E);	   //小数点显示
	   for(i=i-2;i>0;i--)
		  { 
		    WriteLCD_Number(0x00,Buffer[i-1]);   //显示整数		   
		  }
	   }
	   
	 if(5==i)
	   { 	
		 WriteLCD_Number(0x00,Buffer[i-1]);   //显示整数		
		 WriteLCD_CharNumber(0x00,0x2E);	   //小数点显示
		 for(i=i-1;i>0;i--)
		  { 
		    WriteLCD_Number(0x00,Buffer[i-1]);   //显示整数		   
		  }
	   }
	 if(4==i)
	   {
	    WriteLCD_CharNumber(0x00,0x30);         //显示零
		WriteLCD_CharNumber(0x00,0x2E);		   //小数点显示
		 for(i=i;i>0;i--)
	    WriteLCD_Number(0x00,Buffer[i-1]);	  //显示整数
	   }
   }



⌨️ 快捷键说明

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