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

📄 body.c

📁 液晶显示器与单片机接口电路程序
💻 C
字号:
#include "lp.h"				
#include "lpregs.h"
#include "syncdly.h"
#include "disram.h"
#include "dds.h"
#include "math.h"



sbit OE=IOC^0;
sbit E=IOC^1;
sbit RW=IOC^2;
sbit RS=IOC^3;


//#define DisCon IOD

#define SysFre 	210e6
#define MaxAmp 10
#define MaxPha 360
extern struct DDSSpace volatile xdata dds[16];//定义实际设备的DDS空间
extern void ddsdefault();
struct disramtype xdata disram;



//-------------write ---------//
void DisWrite(BOOL mode,unsigned char ddata)
{
     DataDir=0xff;
	 
     OE=0;
     RS=mode;
     RW=0;
     DisData=ddata;
     EZUSB_Delay(0.1);//等待地址线有效
     E=1;
     EZUSB_Delay(1);//等待数据线有效
     E=0;//锁存数据
     EZUSB_Delay(0.1);//等待一个周期结束
     RS=0;
     OE=1;
	 EZUSB_Delay(0.1);
	 DataDir=0x00;
     EZUSB_Delay(0.1);//等待一个周期结束;//设置下一个写间隔时间
      

}
//-------------write ---------//


//---------judging the direction of rotation-------//
 /* static unsigned char state=0;
unsigned char rotation(unsigned char key)
{
//unsigned char a;

	 switch(state)
	 {
	      case 0:
		     if(key==0xdf)
			 state=0x01;
			 else if(key==0xbf)
			 state=0x11;
			 else
			 state=0;
		  break;
		  case 0x01:
		     if(key==0x9f)
			 state=0x02;
			 else
			 state=0;
			 break;
		  case 0x02:
			  if(key==0xbf)
			  state=0x03;
			  else
			  state=0;
		  break;
		  case 0x11:
		     if(key==0x9f)
			 state=0x12;
			 else
			 state=0;
			 break;
		  case 0x12:
		     if(key==0xdf)
			 state=0x13;
			 else
			 state=0;
			 break;
		default:
		    state=0;
			break;
		}
		if(state== 0x03)
		return key_RIGHT;
		else
		return key_LEFT;
		state=0;

  /*
      switch(key)
      {
        case 0xdf:
          if(state==0)
               state=0x01;
	       else if(state==0x12)
               state=0x13;
		   else
		   {
		   a=0xff;
		   state=0;
		   }
	     break;

        case 0x9f:
         if(0x01==state)
          state=0x02;
	     else if(state==0x11)
		     state=0x12;
		 else 
		 {
		 a=0xff;
		 state=0;
		 }
        break;

       case 0xbf:
            if(state==0x00)
               state=0x11;
 	        else if(0x02==state)
	           state=0x03;
			 else
			 {
			 a=0xff;
			 state=0 ;
			 }
        break;


       default:
	   a=0xff;
       break;
      }
	  
	  if(a==0xff)
	  {state=0;
	  	  return 0xff;
	  }
	  //switch结束    
       if(state==0x13)
         {a=key_LEFT;//左旋
		 state=0;
		 }
        else if (state==0x03)
        {  
		a=key_RIGHT;//右旋
        state=0;
		} 
   return a;
 }//函数结束 */
//---------judging the direction of rotation-------//

//-------------transfer disdata to dds------------//
void Disdata2DDS()
{
unsigned char  num;
double temp;
num= disram.ddsnum;
temp=disram.disdata;
     switch(disram.ddsstatue)
	 {
	    case 1:
		   temp=disram.disdata*pow(2,48)/SysFre;
		   dds[num].frequency1_high=temp/pow(2,32);
           dds[num].frequency1_low= temp-dds[num].frequency1_high*pow(2,32);
		   break;
		case 2:
		   temp= disram.disdata*pow(2,12)/MaxAmp;
		   dds[num].output_shape_key_i_mult=temp;
		   break;
		case 3:
		   temp= disram.disdata*pow(2,12)/MaxPha;
		   dds[num].phase1=temp;
		   break;
		default:
		break;
		}
}

//-------------transfer disdata to dds------------//

//-------read from dds---------------------//
void DDS2Disdata()
{
    unsigned char num;
	double temp;
	num=disram.ddsnum;
   	switch(disram.ddsstatue)
	{
	   case key_FRE:
	      temp=dds[num].frequency1_high*pow(2,32)+dds[num].frequency1_low;
		  temp=SysFre*temp/pow(2,48);
		  break;
	   case key_AMP:
	      temp=dds[num].output_shape_key_i_mult;
		  temp=MaxAmp*temp/pow(2,12);
		  break;
	   case key_PHA:
	      temp=dds[num].phase1;
		  temp=MaxPha*temp/pow(2,12);
		  break;
	    default:
		break;
	}
    disram.disdata=temp;
}

//-------read from dds---------------------//
void data2dis();
void left()
{

   if(disram.ddsstatue==key_NUM)
   {		
       if(disram.ddsnum==0)
		 disram.ddsnum=15;
		 else
         disram.ddsnum=disram.ddsnum-1;
			 }

   else if(disram.ddsstatue!=key_NUM){

      switch(disram.unitshift)
	     {
		   case Bp1://小书店后1位
		   disram.disdata-=0.001;
		   break;
		   case B1p://小书店前1位
		   disram.disdata-=1;
		   break;
		   case B2p://小书店前2位
		   disram.disdata-=1000;
		   break;
		   case B3p:
           disram.disdata-=1000000;
		   break;
		   default:
		   break;
		   }
  
          }

}


void right()
{
   if(disram.ddsstatue==key_NUM)
         disram.ddsnum=disram.ddsnum+1;
		 if(disram.ddsnum==16)
		 disram.ddsnum=0;
   else if(disram.ddsstatue!=key_NUM)
   {
      switch(disram.unitshift)
	     {
		   case Bp1://小书店后1位
		   disram.disdata+=0.001;
		   break;
		   case B1p://小书店前1位
		   disram.disdata+=1;
		   break;
		   case B2p://小书店前2位
		   disram.disdata+=1000;
		   break;
		   case B3p:
           disram.disdata+=1000000;
		   break;
		   default:
		   break;
		   }
  
}

}



//---------transfer disdata to displaydata-------//
void data2dis()
{
unsigned char i;
double a;
double temp=disram.disdata;
a=1e7;

for(i=0;i<11;i++)
{
     disram.displaydata[i]=temp/a;
	 temp-=disram.displaydata[i]*a;
	 a/=10;
}

}

//---------transfer disdata to displaydata-------//



//-----------------display1---------------------//
 void display1()
    { 
	 unsigned char i;   
     disram.displaystatue[0]=0x30+disram.ddsnum/10;
	 disram.displaystatue[1]=0x30+disram.ddsnum%10;

     disram.displaystatue[2]=0x20;
	 disram.displaystatue[6]=0x20;




	 switch(disram.ddsstatue)
	 {
	   case key_FRE:
	   	 disram.displaystatue[3]='F';//F
	     disram.displaystatue[4]='R';//R
		 disram.displaystatue[5]='E';//E 
		 disram.displaystatue[7]='H';//H
		 disram.displaystatue[8]='Z';//Z

		break;
	 
	    case key_AMP:
	   	 disram.displaystatue[3]='A';//A
	     disram.displaystatue[4]='M';//M
		 disram.displaystatue[5]='P';//P
		 disram.displaystatue[7]='V';//V
		 disram.displaystatue[8]=' ';//_
		break;

	   case key_PHA:
	   	 disram.displaystatue[3]='P';//P
	     disram.displaystatue[4]='H';//H
		 disram.displaystatue[5]='A';//A
		 disram.displaystatue[7]=0xdf;//degree
		 disram.displaystatue[8]=' ';
		break;
		
		default:
		  break;  
		 }

   
		
		 DisWrite(0,0x84);
		 for(i=0;i<=8;i++)
		 DisWrite(1,disram.displaystatue[i]);

		 
DisWrite(0,0x81);
DisWrite(1,'D');//D
DisWrite(1,'D');//D
DisWrite(1,'S');//S

		 
	}

void cursorflash()
{
    if(disram.ddsstatue==key_NUM)
	DisWrite(0,0x85);
	else
	{
	  switch(disram.unitshift)
	     {
		     case Bp1:
			 DisWrite(0,0xce);
			 break;
			 case B1p:
			 DisWrite(0,0xca);
			 break;
			 case B2p:
			 DisWrite(0,0xc6);
			 break;
			 case B3p:
			 DisWrite(0,0xc2) ;
			 break;
			 default:
			 break;
	      }
	 DisWrite(0,0x0F);

	}
 
}
//-----------------display2---------------------//
void display2()
{
		 unsigned char i=0;
		 DisWrite(0,0xc1);

		 for(i=0;i<2;i++)
		 DisWrite(1,disram.displaydata[i]+0x30);		 
		 DisWrite(1,0x2c);

		 for(;i<5;i++)
		 DisWrite(1,disram.displaydata[i]+0x30);
		 DisWrite(1,0x2c);

		 for(;i<8;i++)
		 DisWrite(1,disram.displaydata[i]+0x30);
		 DisWrite(1,0x2e);

		 for(;i<11;i++)
		 DisWrite(1,disram.displaydata[i]+0x30);


	   /********************************************

	 光标闪烁的程序需要改进,直接获得光标的地址,调用光标地址显示就可以了 
	   
	   **********************************************/
		  /*              switch(disram.unitshift)
                    {
                      case 1:
                       i=0xce;
                      break;
                      case 2:
                       i=0xca;
                      break;
                      case 3:
                       i=0xc7;
                      break;
                      case 4:
                       i=0xc3;
                      break;
                      default:
                      break;
                      } 
               DisWrite(0,i);
               DisWrite(0,0x0F); */	 

	} 
//-----------------display2---------------------//

//-------------processing datus in disram-----------//
void disramprocess(unsigned char keystore)
{
  unsigned char i;


  switch(keystore)
   {
     case key_NUM:
        disram.ddsstatue=key_NUM;
		DDS2Disdata();
		data2dis();
	 break;
    
     case key_FRE:
        disram.ddsstatue=key_FRE;
        disram.unitshift=2;
		DDS2Disdata();
		data2dis();
     break;
    
      case key_AMP:
        disram.ddsstatue=key_AMP;
        disram.unitshift=2;
		DDS2Disdata();
		data2dis();
      break;
      
      case key_PHA:
        disram.ddsstatue=key_PHA;
        disram.unitshift=2;
		DDS2Disdata();
		data2dis();
      break;
      
       case key_LEFT:
	      left();
		  data2dis();
         Disdata2DDS();
	   break;

        case key_RIGHT:
		   right();		   
           data2dis();
           Disdata2DDS();
        break;
      
       case key_UNIT:
//	    disram.ddsstatue=key_UNIT;
		if(disram.ddsstatue==key_FRE)
		 { if(disram.unitshift==4)
		    disram.unitshift=1;
			   else
			     disram.unitshift=1+disram.unitshift;}
		 else if(disram.ddsstatue!=key_FRE)
		   { if(disram.unitshift==2)
			 disram.unitshift=1;
			   else 
			     disram.unitshift=1+disram.unitshift; }
        //disram.unitshift=2;
		break;

	   case key_RESET:
	   disram.ddsnum=0;
	   disram.ddsstatue=key_FRE;
	   disram.unitshift=2;
	   disram.disdata=5000000;
	   for(i=0;i<=10;i++)
	   disram.displaydata[i]=0;
	   ddsdefault();
	   data2dis();
             
		break;


		default:
		break;
     }//the end of switch(keystore)

	
   }

//-------------process datus in disram-----------//

//--------initialization------// 
void initialization()
{

OED=0xff;

OEA=0x00;
OEB=0x00;
OEC=0xff;

OE=1;//关闭显示
E=0;//无效
RS=0;//控制
RW=0;//写状态


//disram.ddsnum=1;  //选择dds
//disram.ddsstatue=1;//1频率/2幅度/3相位
//disram.unitshift=2;//段位
disram.ddsnum=0;
disram.disdata=5000000;
disram.ddsstatue=key_FRE;
disram.unitshift=B1p;


EZUSB_Delay(4);
 DisWrite(0,1);//清屏
 EZUSB_Delay(4);

  DisWrite(0,0x02);
  EZUSB_Delay(4);
  DisWrite(0,0x0e);//开显示,开光标
  DisWrite(0,0x06);//增量,移动光标

EZUSB_Delay(4);
DisWrite(0,0x38);//两行显示,与上一条命令选择使用

data2dis();
display1();
display2();
cursorflash();


}

//-------the end of initialization-----//






⌨️ 快捷键说明

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